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 and uploader for each image.
30 for i := range result.Images {
31 img := &result.Images[i]
32
33 tags, err := a.DB.GetImageTags(r.Context(), img.ID)
34 if err == nil {
35 img.Tags = tags
36 }
37
38 user, err := a.DB.GetUserByID(r.Context(), img.UploadedBy)
39 if err == nil {
40 img.UploaderUsername = user.Username
41 }
42 }
43
44 writeJSON(w, http.StatusOK, map[string]any{
45 "images": result.Images,
46 "total": result.Total,
47 "page": page,
48 "per_page": perPage,
49 })
50}
51
52func (a *API) HandleGetImage(w http.ResponseWriter, r *http.Request) {
53 idStr := r.PathValue("id")
54 id, err := strconv.ParseInt(idStr, 10, 64)
55 if err != nil {
56 writeError(w, http.StatusBadRequest, "invalid image id")
57 return
58 }
59
60 img, err := a.DB.GetImageByID(r.Context(), id)
61 if err != nil {
62 writeError(w, http.StatusNotFound, "image not found")
63 return
64 }
65
66 tagsDetail, err := a.DB.GetImageTagsWithCounts(r.Context(), id)
67 if err != nil {
68 tagsDetail = make([]db.Tag, 0)
69 }
70
71 uploaderUsername := ""
72 user, err := a.DB.GetUserByID(r.Context(), img.UploadedBy)
73 if err == nil {
74 uploaderUsername = user.Username
75 }
76
77 writeJSON(w, http.StatusOK, map[string]any{
78 "id": img.ID,
79 "filename": img.Filename,
80 "storage_path": img.StoragePath,
81 "thumbnail_path": img.ThumbnailPath,
82 "uploaded_by": img.UploadedBy,
83 "uploader_username": uploaderUsername,
84 "file_size": img.FileSize,
85 "width": img.Width,
86 "height": img.Height,
87 "mime_type": img.MimeType,
88 "created_at": img.CreatedAt,
89 "updated_at": img.UpdatedAt,
90 "tags": img.Tags,
91 "tags_detail": tagsDetail,
92 })
93}