internal/api/images.go (view raw)
1package api
2
3import (
4 "net/http"
5 "strconv"
6)
7
8func (a *API) HandleListImages(w http.ResponseWriter, r *http.Request) {
9 tags := r.URL.Query()["tags"]
10
11 page, _ := strconv.Atoi(r.URL.Query().Get("page"))
12 if page < 1 {
13 page = 1
14 }
15 perPage, _ := strconv.Atoi(r.URL.Query().Get("per_page"))
16 if perPage < 1 || perPage > 100 {
17 perPage = 20
18 }
19 offset := (page - 1) * perPage
20
21 result, err := a.DB.ListImages(r.Context(), tags, perPage, offset)
22 if err != nil {
23 writeError(w, http.StatusInternalServerError, "failed to list images")
24 return
25 }
26
27 // Load tags for each image.
28 for i := range result.Images {
29 tags, err := a.DB.GetImageTags(r.Context(), result.Images[i].ID)
30 if err != nil {
31 continue
32 }
33 result.Images[i].Tags = tags
34 }
35
36 writeJSON(w, http.StatusOK, map[string]any{
37 "images": result.Images,
38 "total": result.Total,
39 "page": page,
40 "per_page": perPage,
41 })
42}
43
44func (a *API) HandleGetImage(w http.ResponseWriter, r *http.Request) {
45 idStr := r.PathValue("id")
46 id, err := strconv.ParseInt(idStr, 10, 64)
47 if err != nil {
48 writeError(w, http.StatusBadRequest, "invalid image id")
49 return
50 }
51
52 img, err := a.DB.GetImageByID(r.Context(), id)
53 if err != nil {
54 writeError(w, http.StatusNotFound, "image not found")
55 return
56 }
57
58 writeJSON(w, http.StatusOK, img)
59}