Files
project-gifuu/backend/routes/GET_Metadata_ID.go
T

85 lines
2.0 KiB
Go
Raw Normal View History

2026-05-23 17:17:56 -07:00
package routes
import (
"fmt"
"gifuu/include"
"gifuu/tools"
"html"
"log"
"net/http"
"strings"
"text/template"
"github.com/jackc/pgx/v5"
)
var animTemplate = template.Must(template.New("").Parse(include.TEMPLATE_ANIMATION_METADATA))
func GET_Metadata_ID(w http.ResponseWriter, r *http.Request) {
paramID := tools.ParseSnowflake(r.PathValue("id"))
if paramID == 0 {
tools.SendClientError(w, r, tools.ERROR_BODY_INVALID_FIELD)
return
}
var animationData struct {
Created string
Width int
Height int
Rating float64
Sticker bool
Title string
Tags []string
}
// Fetch Animation Metadata
err := tools.Database.QueryRow(r.Context(),
`SELECT
u.encode_width,
u.encode_height,
u.meta_rating,
u.flag_sticker,
u.meta_title,
COALESCE(array_agg(t.label ORDER BY t.usage) FILTER (WHERE t.id IS NOT NULL), '{}')
FROM gifuu.upload u
LEFT JOIN gifuu.upload_tag ut ON ut.gif_id = u.id
LEFT JOIN gifuu.tag t ON t.id = ut.tag_id
WHERE u.id = $1
GROUP BY u.id`,
paramID,
).Scan(
&animationData.Width,
&animationData.Height,
&animationData.Rating,
&animationData.Sticker,
&animationData.Title,
&animationData.Tags,
)
if err == pgx.ErrNoRows {
tools.SendClientError(w, r, tools.ERROR_UNKNOWN_ANIMATION)
return
}
if err != nil {
tools.SendServerError(w, r, err)
return
}
// Render Webpage
w.Header().Add("Content-Type", "text/html")
err = animTemplate.Execute(w, map[string]any{
"width": animationData.Width,
"height": animationData.Height,
"title": html.EscapeString(animationData.Title),
"tags": html.EscapeString(strings.Join(animationData.Tags, ", ")),
"uri_embed": fmt.Sprintf("%s/embed.html?id=%d&quality=standard", tools.TEMPLATE_BASE_WEB, paramID),
"uri_image": fmt.Sprintf("%s/%d/standard.avif", tools.TEMPLATE_BASE_CDN, paramID),
"uri_site": fmt.Sprintf("%s/art/%d", tools.TEMPLATE_BASE_WEB, paramID),
})
if err != nil {
log.Println("Render Error:", r.URL.Path, err)
http.Error(w, "Server Error", http.StatusInternalServerError)
return
}
}