refactor: make database name configurable in admin routes and bug report deletion
Some checks failed
Build & Publish Docker Image / build-and-push (push) Failing after 9s

This commit is contained in:
Flavio Fois
2026-05-27 23:21:20 +02:00
parent 3347f9ba4e
commit bca15fe636
3 changed files with 20 additions and 3 deletions

View File

@@ -544,21 +544,28 @@ func DeleteBugReportByID(db *sqlx.DB, dbName string) http.HandlerFunc {
return return
} }
log.Printf("[BUGREPORT] Delete requested: report_id=%s", reportId)
result, err := db.ExecContext(r.Context(), fmt.Sprintf("DELETE FROM %s.bug_reports WHERE id = ?", dbName), reportId) result, err := db.ExecContext(r.Context(), fmt.Sprintf("DELETE FROM %s.bug_reports WHERE id = ?", dbName), reportId)
if err != nil { if err != nil {
log.Printf("[BUGREPORT] Delete failed: report_id=%s err=%v", reportId, err)
jsonError(w, http.StatusInternalServerError, err.Error()) jsonError(w, http.StatusInternalServerError, err.Error())
return return
} }
rowsAffected, err := result.RowsAffected() rowsAffected, err := result.RowsAffected()
if err != nil { if err != nil {
log.Printf("[BUGREPORT] Delete rows check failed: report_id=%s err=%v", reportId, err)
jsonError(w, http.StatusInternalServerError, err.Error()) jsonError(w, http.StatusInternalServerError, err.Error())
return return
} }
if rowsAffected == 0 { if rowsAffected == 0 {
log.Printf("[BUGREPORT] Delete skipped: report_id=%s not found", reportId)
jsonError(w, http.StatusNotFound, "bug report not found") jsonError(w, http.StatusNotFound, "bug report not found")
return return
} }
log.Printf("[BUGREPORT] Deleted successfully: report_id=%s rows=%d", reportId, rowsAffected)
jsonOK(w, map[string]string{"message": "bug report deleted successfully"}) jsonOK(w, map[string]string{"message": "bug report deleted successfully"})
} }
} }

View File

@@ -11,7 +11,7 @@ import (
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
) )
func registerAdmin(r chi.Router, db *sqlx.DB) { func registerAdmin(r chi.Router, db *sqlx.DB, dbName string) {
r.Route("/admin", func(r chi.Router) { r.Route("/admin", func(r chi.Router) {
// Auth — public, handles its own credential checks. // Auth — public, handles its own credential checks.
@@ -40,5 +40,14 @@ func registerAdmin(r chi.Router, db *sqlx.DB) {
r.Post("/{id}/reset-password", handlers.ResetPassword(db)) r.Post("/{id}/reset-password", handlers.ResetPassword(db))
r.Delete("/{id}", handlers.DeleteUser(db)) r.Delete("/{id}", handlers.DeleteUser(db))
}) })
// Backward-compatible alias for admin-prefixed bug report delete path.
r.Route("/bug-reports", func(r chi.Router) {
r.Use(apimw.APIKeyAuth(db))
r.Use(apimw.AdminKeyAuth(db))
r.Use(httprate.LimitByIP(30, time.Minute))
r.Delete("/{id}", handlers.DeleteBugReportByID(db, dbName))
})
}) })
} }

View File

@@ -15,6 +15,7 @@ import (
// NewRouter returns a chi.Router with all /v1 routes mounted. // NewRouter returns a chi.Router with all /v1 routes mounted.
func NewRouter(db *sqlx.DB, s3conn *storage.S3Connector) http.Handler { func NewRouter(db *sqlx.DB, s3conn *storage.S3Connector) http.Handler {
r := chi.NewRouter() r := chi.NewRouter()
dbName := config.Load().Database
rl := emlyMiddleware.NewRateLimiter(config.Load()) rl := emlyMiddleware.NewRateLimiter(config.Load())
@@ -31,8 +32,8 @@ func NewRouter(db *sqlx.DB, s3conn *storage.S3Connector) http.Handler {
r.Get("/health", handlers.Health(db)) r.Get("/health", handlers.Health(db))
r.Route("/api", func(r chi.Router) { r.Route("/api", func(r chi.Router) {
registerAdmin(r, db) registerAdmin(r, db, dbName)
registerBugReports(r, db, config.Load().Database, s3conn) registerBugReports(r, db, dbName, s3conn)
}) })
return r return r