From c9da5ba970c58480a38c24c7384d93ee11f5be90 Mon Sep 17 00:00:00 2001 From: Drew Bednar Date: Sun, 2 Nov 2025 09:47:13 -0500 Subject: [PATCH] Basic list movie functionality --- cmd/api/handlers.go | 9 +++++++++ cmd/api/routes.go | 1 + internal/data/movies.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index 76fb279..0db03db 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -242,6 +242,15 @@ func (app *application) deleteMovieHandler(w http.ResponseWriter, r *http.Reques } } +func (app *application) listMoviesHandler(w http.ResponseWriter, r *http.Request) { + movies, err := app.models.Movies.List(r.Context()) + if err != nil { + app.serverErrorResponse(w, r, err) + return + } + app.writeJSON(w, 200, envelope{"movies": movies}, nil) +} + 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 c121bda..9d77a77 100644 --- a/cmd/api/routes.go +++ b/cmd/api/routes.go @@ -23,6 +23,7 @@ func (app *application) routes() http.Handler { router.MethodNotAllowed = http.HandlerFunc(app.methodNotAllowedResponse) router.HandlerFunc(http.MethodGet, "/v1/healthcheck", app.healthCheckHandler) + router.HandlerFunc(http.MethodGet, "/v1/movies", app.listMoviesHandler) router.HandlerFunc(http.MethodPost, "/v1/movies", app.createMovieHandler) router.HandlerFunc(http.MethodGet, "/v1/movies/:id", app.getMovieHandler) router.HandlerFunc(http.MethodPatch, "/v1/movies/:id", app.updateMovieHandler) diff --git a/internal/data/movies.go b/internal/data/movies.go index 4a939b6..4167240 100644 --- a/internal/data/movies.go +++ b/internal/data/movies.go @@ -167,3 +167,41 @@ func (m MovieModel) Delete(ctx context.Context, id int64) (err error) { return nil } + +func (m MovieModel) List(ctx context.Context) ([]*Movie, error) { + + query := ` + SELECT id, created_at, title, year, runtime, genres, version + FROM movies + ORDER BY id ASC + ` + rows, err := m.pool.Query(ctx, query) + if err != nil { + return nil, err + } + defer rows.Close() + + var movies []*Movie + for rows.Next() { + var movie Movie + err := rows.Scan( + &movie.ID, + &movie.CreatedAt, + &movie.Title, + &movie.Year, + &movie.Runtime, + &movie.Genres, + &movie.Version, + ) + if err != nil { + return nil, err + } + movies = append(movies, &movie) + } + err = rows.Err() + if err != nil { + return nil, err + } + + return movies, nil +}