fix(backends): Backend-Löschen verweigern wenn Routing-Regeln darauf zeigen (v1.1.142)

- Service: Pre-Check auf routing_rules.backend_id → ErrInUse vor DELETE
- Handler: ErrInUse → HTTP 409 Conflict statt 500 (response.Conflict helper)
- UI: Delete-Button deaktiviert + Tooltip "Von N Regeln verwendet" wenn Referenzen existieren

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-29 07:15:16 +02:00
parent 40414d472b
commit 7dd76d4b58
10 changed files with 52 additions and 12 deletions

View File

@@ -117,6 +117,10 @@ func (h *BackendsHandler) Delete(c *gin.Context) {
response.NotFound(c, err)
return
}
if errors.Is(err, backends.ErrInUse) {
response.Conflict(c, err)
return
}
response.Internal(c, err)
return
}

View File

@@ -82,6 +82,10 @@ func Forbidden(c *gin.Context, err error) {
Err(c, http.StatusForbidden, err)
}
func Conflict(c *gin.Context, err error) {
Err(c, http.StatusConflict, err)
}
func Internal(c *gin.Context, err error) {
Err(c, http.StatusInternalServerError, err)
}

View File

@@ -14,7 +14,10 @@ import (
"git.netcell-it.de/projekte/edgeguard-native/internal/models"
)
var ErrNotFound = errors.New("backend not found")
var (
ErrNotFound = errors.New("backend not found")
ErrInUse = errors.New("backend is referenced by one or more routing rules")
)
type Repo struct {
Pool *pgxpool.Pool
@@ -99,6 +102,15 @@ RETURNING id, name, scheme, health_check_path, lb_algorithm, websocket, force_ht
}
func (r *Repo) Delete(ctx context.Context, id int64) error {
var n int
if err := r.Pool.QueryRow(ctx,
`SELECT COUNT(*) FROM routing_rules WHERE backend_id = $1`, id,
).Scan(&n); err != nil {
return err
}
if n > 0 {
return ErrInUse
}
tag, err := r.Pool.Exec(ctx, `DELETE FROM backends WHERE id = $1`, id)
if err != nil {
return err