diff --git a/internal/handlers/bug_report.route.go b/internal/handlers/bug_report.route.go index f0ac024..b1d5b59 100644 --- a/internal/handlers/bug_report.route.go +++ b/internal/handlers/bug_report.route.go @@ -544,21 +544,28 @@ func DeleteBugReportByID(db *sqlx.DB, dbName string) http.HandlerFunc { 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) if err != nil { + log.Printf("[BUGREPORT] Delete failed: report_id=%s err=%v", reportId, err) jsonError(w, http.StatusInternalServerError, err.Error()) return } rowsAffected, err := result.RowsAffected() if err != nil { + log.Printf("[BUGREPORT] Delete rows check failed: report_id=%s err=%v", reportId, err) jsonError(w, http.StatusInternalServerError, err.Error()) return } if rowsAffected == 0 { + log.Printf("[BUGREPORT] Delete skipped: report_id=%s not found", reportId) jsonError(w, http.StatusNotFound, "bug report not found") return } + log.Printf("[BUGREPORT] Deleted successfully: report_id=%s rows=%d", reportId, rowsAffected) + jsonOK(w, map[string]string{"message": "bug report deleted successfully"}) } } diff --git a/internal/routes/v1/admin.go b/internal/routes/v1/admin.go index 8777bbd..c719e89 100644 --- a/internal/routes/v1/admin.go +++ b/internal/routes/v1/admin.go @@ -11,7 +11,7 @@ import ( "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) { // 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.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)) + }) }) } diff --git a/internal/routes/v1/v1.go b/internal/routes/v1/v1.go index 13eaf1b..20b8ddf 100644 --- a/internal/routes/v1/v1.go +++ b/internal/routes/v1/v1.go @@ -15,6 +15,7 @@ import ( // NewRouter returns a chi.Router with all /v1 routes mounted. func NewRouter(db *sqlx.DB, s3conn *storage.S3Connector) http.Handler { r := chi.NewRouter() + dbName := config.Load().Database 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.Route("/api", func(r chi.Router) { - registerAdmin(r, db) - registerBugReports(r, db, config.Load().Database, s3conn) + registerAdmin(r, db, dbName) + registerBugReports(r, db, dbName, s3conn) }) return r