detached 9b3f809

fix(preview): remove route from config on preview delete

Delete only removed from the preview store, leaving stale routes
in the config. Now calls routeManager.RemoveRoute when available.
commit
9b3f80991155afa2b59e6ee22b7007629a43b91f
author
brice · · 2026-03-18 20:55 UTC
committer
brice · · 2026-03-18 19:27 UTC
parent
5418cc6
signature
unsigned
1 file · +15 -1
M internal/usecase/auto/preview/service.go +15 -1
@@ -116,11 +116,13 @@ func (s *Service) Update(ctx context.Context, p domain.PreviewRoute) error {
116116
117117 func (s *Service) Delete(ctx context.Context, name string) error {
118118 s.mu.Lock()
119+ var deleted domain.PreviewRoute
119120 found := false
120121 filtered := make([]domain.PreviewRoute, 0, len(s.previews))
121122 for _, p := range s.previews {
122123 if p.Name == name {
123124 found = true
125+ deleted = p
124126 } else {
125127 filtered = append(filtered, p)
126128 }
@@ -133,7 +135,19 @@ func (s *Service) Delete(ctx context.Context, name string) error {
133135 cp := make([]domain.PreviewRoute, len(s.previews))
134136 copy(cp, s.previews)
135137 s.mu.Unlock()
136- return s.store.Save(ctx, cp)
138+
139+ if err := s.store.Save(ctx, cp); err != nil {
140+ return err
141+ }
142+
143+ // Clean up the route from config so proxy stops routing to this domain.
144+ if s.routeManager != nil && deleted.Domain != "" {
145+ log := zerowrap.FromCtx(ctx)
146+ if err := s.routeManager.RemoveRoute(ctx, deleted.Domain); err != nil {
147+ log.Debug().Err(err).Str("domain", deleted.Domain).Msg("preview route already removed from config")
148+ }
149+ }
150+ return nil
137151 }
138152
139153 func (s *Service) Get(_ context.Context, name string) (*domain.PreviewRoute, error) {
@@ -116,11 +116,13 @@ func (s *Service) Update(ctx context.Context, p domain.PreviewRoute) error {
116 116
117 func (s *Service) Delete(ctx context.Context, name string) error {117 func (s *Service) Delete(ctx context.Context, name string) error {
118 s.mu.Lock()118 s.mu.Lock()
119+ var deleted domain.PreviewRoute
119 found := false120 found := false
120 filtered := make([]domain.PreviewRoute, 0, len(s.previews))121 filtered := make([]domain.PreviewRoute, 0, len(s.previews))
121 for _, p := range s.previews {122 for _, p := range s.previews {
122 if p.Name == name {123 if p.Name == name {
123 found = true124 found = true
125+ deleted = p
124 } else {126 } else {
125 filtered = append(filtered, p)127 filtered = append(filtered, p)
126 }128 }
@@ -133,7 +135,19 @@ func (s *Service) Delete(ctx context.Context, name string) error {
133 cp := make([]domain.PreviewRoute, len(s.previews))135 cp := make([]domain.PreviewRoute, len(s.previews))
134 copy(cp, s.previews)136 copy(cp, s.previews)
135 s.mu.Unlock()137 s.mu.Unlock()
136- return s.store.Save(ctx, cp)138+
139+ if err := s.store.Save(ctx, cp); err != nil {
140+ return err
141+ }
142+
143+ // Clean up the route from config so proxy stops routing to this domain.
144+ if s.routeManager != nil && deleted.Domain != "" {
145+ log := zerowrap.FromCtx(ctx)
146+ if err := s.routeManager.RemoveRoute(ctx, deleted.Domain); err != nil {
147+ log.Debug().Err(err).Str("domain", deleted.Domain).Msg("preview route already removed from config")
148+ }
149+ }
150+ return nil
137 }151 }
138 152
139 func (s *Service) Get(_ context.Context, name string) (*domain.PreviewRoute, error) {153 func (s *Service) Get(_ context.Context, name string) (*domain.PreviewRoute, error) {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close