all repos — weimar @ a338ad5884f38dd2d5e241df42fd565a97f27f72

Unnamed repository; edit this file 'description' to name the repository.

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}