增加上传接口
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
package listing
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -18,6 +20,8 @@ type Handler struct {
|
||||
storage *filemodule.Storage
|
||||
}
|
||||
|
||||
const maxExternalUploadBodyBytes = 256 * 1024
|
||||
|
||||
func NewHandler(service *Service, storage *filemodule.Storage) *Handler {
|
||||
return &Handler{service: service, storage: storage}
|
||||
}
|
||||
@@ -41,6 +45,36 @@ func (h *Handler) Create(c *gin.Context) {
|
||||
response.Created(c, item)
|
||||
}
|
||||
|
||||
func (h *Handler) ImportExternalUpload(c *gin.Context) {
|
||||
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, maxExternalUploadBodyBytes)
|
||||
raw, err := io.ReadAll(c.Request.Body)
|
||||
if err != nil {
|
||||
response.BadRequest(c, "上传内容过大或读取失败")
|
||||
return
|
||||
}
|
||||
var req ExternalUploadRequest
|
||||
if err := json.Unmarshal(raw, &req); err != nil {
|
||||
response.BadRequest(c, "上传 JSON 格式不正确")
|
||||
return
|
||||
}
|
||||
result, err := h.service.ImportExternalUpload(req, ExternalUploadMeta{
|
||||
IP: c.ClientIP(),
|
||||
UserAgent: c.GetHeader("User-Agent"),
|
||||
RawPayload: raw,
|
||||
})
|
||||
if err != nil {
|
||||
writeListingError(c, err)
|
||||
return
|
||||
}
|
||||
response.Created(c, result)
|
||||
}
|
||||
|
||||
func (h *Handler) DefaultUploadScreenshot(c *gin.Context) {
|
||||
c.Header("Content-Type", "image/svg+xml; charset=utf-8")
|
||||
c.Header("Cache-Control", "public, max-age=86400")
|
||||
c.String(http.StatusOK, `<svg xmlns="http://www.w3.org/2000/svg" width="960" height="540" viewBox="0 0 960 540"><rect width="960" height="540" fill="#f3f4f6"/><rect x="72" y="72" width="816" height="396" rx="24" fill="#ffffff" stroke="#d1d5db" stroke-width="4"/><text x="480" y="248" text-anchor="middle" font-family="Arial, sans-serif" font-size="42" font-weight="700" fill="#374151">账号资料默认图</text><text x="480" y="310" text-anchor="middle" font-family="Arial, sans-serif" font-size="28" fill="#6b7280">开放接口上传,待后台补充审核</text></svg>`)
|
||||
}
|
||||
|
||||
func (h *Handler) Update(c *gin.Context) {
|
||||
ownerID, ok := currentUserID(c)
|
||||
if !ok {
|
||||
@@ -512,6 +546,18 @@ func writeListingError(c *gin.Context, err error) {
|
||||
response.BadRequest(c, "哈夫币数量不正确")
|
||||
case errors.Is(err, ErrMissingScreenshot):
|
||||
response.BadRequest(c, "请至少上传一张账号截图")
|
||||
case errors.Is(err, ErrMissingUploaderName):
|
||||
response.BadRequest(c, "上传人名称不能为空")
|
||||
case errors.Is(err, ErrMissingUploadData):
|
||||
response.BadRequest(c, "上传账号数据不能为空")
|
||||
case errors.Is(err, ErrUploaderNotFound):
|
||||
response.BadRequest(c, "未匹配到可用后台用户")
|
||||
case errors.Is(err, ErrUploaderAmbiguous):
|
||||
response.BadRequest(c, "上传人名称匹配到多个后台用户,请使用唯一用户名")
|
||||
case errors.Is(err, ErrTooManyUploadItems):
|
||||
response.BadRequest(c, "单次上传账号数量过多")
|
||||
case isUploadValidationError(err):
|
||||
response.BadRequest(c, err.Error())
|
||||
case isFireLevelTooLow(err):
|
||||
var levelErr FireLevelTooLowError
|
||||
errors.As(err, &levelErr)
|
||||
@@ -531,3 +577,8 @@ func isFireLevelTooLow(err error) bool {
|
||||
var levelErr FireLevelTooLowError
|
||||
return errors.As(err, &levelErr)
|
||||
}
|
||||
|
||||
func isUploadValidationError(err error) bool {
|
||||
var validationErr UploadValidationError
|
||||
return errors.As(err, &validationErr)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user