all repos — weimar @ 74fc3e1e24b47e370bcf5ea6b4e016cb50630920

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