94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package listing
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
filemodule "hfb_sys/backend/internal/modules/file"
|
|
"hfb_sys/backend/pkg/response"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func (h *Handler) ListPublic(c *gin.Context) {
|
|
items, err := h.service.ListPublic(c.Request.Context(), parsePublicListQuery(c))
|
|
if err != nil {
|
|
writeListingError(c, err)
|
|
return
|
|
}
|
|
response.OK(c, items)
|
|
}
|
|
|
|
func (h *Handler) FindPublic(c *gin.Context) {
|
|
id, ok := parseID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
item, err := h.service.FindPublic(c.Request.Context(), id)
|
|
if err != nil {
|
|
writeListingError(c, err)
|
|
return
|
|
}
|
|
response.OK(c, item)
|
|
}
|
|
|
|
func (h *Handler) Cover(c *gin.Context) {
|
|
id, ok := parseID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
key, err := h.service.FindPublicCoverKey(c.Request.Context(), id)
|
|
if err != nil {
|
|
writeListingError(c, err)
|
|
return
|
|
}
|
|
h.writePublicObject(c, filemodule.ImageVariantFallbackKeys(key, filemodule.ImageVariantThumb)...)
|
|
}
|
|
|
|
func (h *Handler) Screenshot(c *gin.Context) {
|
|
id, ok := parseID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
index, err := strconv.Atoi(c.Param("index"))
|
|
if err != nil || index < 0 {
|
|
response.BadRequest(c, "截图序号不正确")
|
|
return
|
|
}
|
|
key, err := h.service.FindPublicScreenshotKey(c.Request.Context(), id, index)
|
|
if err != nil {
|
|
writeListingError(c, err)
|
|
return
|
|
}
|
|
h.writePublicObject(c, filemodule.ImageVariantFallbackKeys(key, filemodule.ImageVariantMedium)...)
|
|
}
|
|
|
|
func (h *Handler) writePublicObject(c *gin.Context, keys ...string) {
|
|
if h.storage == nil {
|
|
response.ServiceUnavailable(c, "文件存储未连接")
|
|
return
|
|
}
|
|
var object *filemodule.Object
|
|
for _, key := range keys {
|
|
nextObject, err := h.storage.Get(c.Request.Context(), key)
|
|
if err == nil {
|
|
object = nextObject
|
|
break
|
|
}
|
|
}
|
|
if object == nil {
|
|
response.Error(c, http.StatusNotFound, "not_found", "图片不存在或暂不可访问")
|
|
return
|
|
}
|
|
defer func() {
|
|
_ = object.Reader.Close()
|
|
}()
|
|
contentType := object.ContentType
|
|
if contentType == "" {
|
|
contentType = "application/octet-stream"
|
|
}
|
|
c.Header("Content-Type", contentType)
|
|
c.Header("Cache-Control", "public, max-age=300")
|
|
c.DataFromReader(http.StatusOK, object.Size, contentType, object.Reader, nil)
|
|
}
|