all repos — weimar @ a8921d226b7ab5b6d366d88c51d3308362388cf7

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	"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}