package handlers import ( "context" "fmt" "net/http" "strconv" "time" "lookbook/internal/data/media" ) // HandleGetMedia handles GET /media/{id} func HandleGetMedia(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { idStr := r.PathValue("id") id, err := strconv.ParseInt(idStr, 10, 64) if err != nil { http.Error(w, "invalid id", http.StatusBadRequest) return nil } ctx, cancel := context.WithTimeout(r.Context(), 30*time.Second) defer cancel() m, err := media.QFindByID(ctx, rc.DB, id) if err != nil { return err } if m == nil { http.NotFound(w, r) return nil } // Set caching headers (media is immutable) w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") w.Header().Set("Content-Type", m.ContentType) w.Header().Set("Content-Length", strconv.Itoa(len(m.Data))) // Add ETag for conditional requests etag := fmt.Sprintf(`"%d"`, m.ID) w.Header().Set("ETag", etag) if r.Header.Get("If-None-Match") == etag { w.WriteHeader(http.StatusNotModified) return nil } w.Write(m.Data) return nil }