OpenAI-compatible AI gateway with Vue admin UI, multi-provider egress, ingress key governance, monitoring, and security controls. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
package files
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/rose_cat707/luminary/internal/storage/imagestore"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
store *imagestore.Store
|
||||
}
|
||||
|
||||
func New(store *imagestore.Store) *Handler {
|
||||
return &Handler{store: store}
|
||||
}
|
||||
|
||||
func (h *Handler) Register(r *gin.Engine) {
|
||||
r.GET("/files/:id", h.Serve)
|
||||
}
|
||||
|
||||
func (h *Handler) Serve(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
expStr := c.Query("exp")
|
||||
sig := c.Query("sig")
|
||||
exp, err := strconv.ParseInt(expStr, 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid exp"})
|
||||
return
|
||||
}
|
||||
if !h.store.Verify(id, exp, sig) {
|
||||
c.JSON(http.StatusForbidden, gin.H{"error": "invalid signature"})
|
||||
return
|
||||
}
|
||||
img, err := h.store.Get(id)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "not found"})
|
||||
return
|
||||
}
|
||||
c.Header("Content-Type", img.Mime)
|
||||
c.File(img.LocalPath)
|
||||
}
|
||||
Reference in New Issue
Block a user