internal/api/images.go (view raw)
1package api
2
3import (
4 "net/http"
5 "strconv"
6
7 "github.com/mjensen/weimar/internal/db"
8)
9
10func (a *API) HandleListImages(w http.ResponseWriter, r *http.Request) {
11 tags := r.URL.Query()["tags"]
12
13 page, _ := strconv.Atoi(r.URL.Query().Get("page"))
14 if page < 1 {
15 page = 1
16 }
17 perPage, _ := strconv.Atoi(r.URL.Query().Get("per_page"))
18 if perPage < 1 || perPage > 100 {
19 perPage = 20
20 }
21 offset := (page - 1) * perPage
22
23 result, err := a.DB.ListImages(r.Context(), tags, perPage, offset)
24 if err != nil {
25 writeError(w, http.StatusInternalServerError, "failed to list images")
26 return
27 }
28
29 // Load tags for each image.
30 for i := range result.Images {
31 tags, err := a.DB.GetImageTags(r.Context(), result.Images[i].ID)
32 if err != nil {
33 continue
34 }
35 result.Images[i].Tags = tags
36 }
37
38 writeJSON(w, http.StatusOK, map[string]any{
39 "images": result.Images,
40 "total": result.Total,
41 "page": page,
42 "per_page": perPage,
43 })
44}
45
46func (a *API) HandleGetImage(w http.ResponseWriter, r *http.Request) {
47 idStr := r.PathValue("id")
48 id, err := strconv.ParseInt(idStr, 10, 64)
49 if err != nil {
50 writeError(w, http.StatusBadRequest, "invalid image id")
51 return
52 }
53
54 img, err := a.DB.GetImageByID(r.Context(), id)
55 if err != nil {
56 writeError(w, http.StatusNotFound, "image not found")
57 return
58 }
59
60 tagsDetail, err := a.DB.GetImageTagsWithCounts(r.Context(), id)
61 if err != nil {
62 tagsDetail = make([]db.Tag, 0)
63 }
64
65 writeJSON(w, http.StatusOK, map[string]any{
66 "id": img.ID,
67 "filename": img.Filename,
68 "storage_path": img.StoragePath,
69 "thumbnail_path": img.ThumbnailPath,
70 "uploaded_by": img.UploadedBy,
71 "file_size": img.FileSize,
72 "width": img.Width,
73 "height": img.Height,
74 "mime_type": img.MimeType,
75 "created_at": img.CreatedAt,
76 "updated_at": img.UpdatedAt,
77 "tags": img.Tags,
78 "tags_detail": tagsDetail,
79 })
80}