From e8e04a4cdd5649dc0503b88afaeb7cf567ee9c2b Mon Sep 17 00:00:00 2001 From: Drew Bednar Date: Sat, 11 Oct 2025 13:36:27 -0400 Subject: [PATCH] Delete with rollback --- cmd/api/handlers.go | 28 ++++++++++++++++++++++++++++ cmd/api/routes.go | 1 + internal/data/movies.go | 13 ++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index c9ac897..d8a8fad 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -159,6 +159,34 @@ func (app *application) updateMovieHandler(w http.ResponseWriter, r *http.Reques } } +func (app *application) deleteMovieHandler(w http.ResponseWriter, r *http.Request) { + id, err := app.readIDParam(r) + if err != nil { + app.notFoundResponse(w, r) + return + } + + // Maybe should be passing a timeout context + _, err = app.models.Movies.Get(r.Context(), id) + if err != nil { + switch { + case errors.Is(err, data.ErrRecordNotFound): + app.notFoundResponse(w, r) + default: + app.serverErrorResponse(w, r, err) + } + return + } + + err = app.models.Movies.Delete(r.Context(), id) + if err != nil { + app.serverErrorResponse(w, r, err) + return + } + + w.WriteHeader(http.StatusAccepted) +} + func (app *application) healthCheckHandler(w http.ResponseWriter, r *http.Request) { // JSON has to be double quoted. FYI you would never really do this // js := `{"status": "available", "environment": %q, "version": %q}` diff --git a/cmd/api/routes.go b/cmd/api/routes.go index 054cdd1..6314288 100644 --- a/cmd/api/routes.go +++ b/cmd/api/routes.go @@ -26,6 +26,7 @@ func (app *application) routes() http.Handler { router.HandlerFunc(http.MethodPost, "/v1/movies", app.createMovieHandler) router.HandlerFunc(http.MethodGet, "/v1/movies/:id", app.getMovieHandler) router.HandlerFunc(http.MethodPut, "/v1/movies/:id", app.updateMovieHandler) + router.HandlerFunc(http.MethodDelete, "/v1/movies/:id", app.deleteMovieHandler) // middleware return app.recoverPanic(router) diff --git a/internal/data/movies.go b/internal/data/movies.go index da461b5..cf61f1d 100644 --- a/internal/data/movies.go +++ b/internal/data/movies.go @@ -99,5 +99,16 @@ func (m MovieModel) Update(ctx context.Context, movie *Movie) error { } func (m MovieModel) Delete(ctx context.Context, id int64) error { - return nil + query := `DELETE FROM movies WHERE id = $1` + + tx, err := m.pool.BeginTx(ctx, pgx.TxOptions{}) + if err != nil { + return err + } + defer func() { + tx.Rollback(ctx) + }() + _, err = tx.Exec(ctx, query, id) + + return err }