This commit is contained in:
2026-08-15 01:58:41 +08:00
parent e55fb57432
commit 1a5969897a
32 changed files with 687 additions and 475 deletions
+16 -28
View File
@@ -1,11 +1,10 @@
package handler
import (
"encoding/json"
"errors"
"net/http"
"net/url"
"strings"
"time"
"kra/internal/server/httpx"
"kra/internal/service"
@@ -16,18 +15,11 @@ import (
)
type Export struct {
settings *service.SecurityService
service *service.ExportService
service *service.ExportService
}
func NewExport(settings *service.SecurityService, export *service.ExportService) *Export {
return &Export{settings: settings, service: export}
}
type exportToken struct {
TemplateID string `json:"templateID"`
Params map[string]string `json:"params"`
Blank bool `json:"blank"`
func NewExport(service *service.ExportService) *Export {
return &Export{service: service}
}
func exportParams(values url.Values) map[string]string {
@@ -151,9 +143,8 @@ func (h *Export) Issue(blank bool) gin.HandlerFunc {
httpx.Fail(c, "模板ID不能为空")
return
}
token := strings.ReplaceAll(uuid.NewString(), "-", "")
raw, _ := json.Marshal(exportToken{TemplateID: templateID, Params: exportParams(c.Request.URL.Query()), Blank: blank})
if err := h.settings.CacheSet(c.Request.Context(), "export:"+token, string(raw), 30*time.Minute); err != nil {
token, err := h.service.IssueToken(c.Request.Context(), templateID, exportParams(c.Request.URL.Query()), blank)
if err != nil {
httpx.Fail(c, "导出令牌创建失败")
return
}
@@ -196,21 +187,18 @@ func (h *Export) Download(expectBlank bool) gin.HandlerFunc {
httpx.Fail(c, "导出token不能为空")
return
}
raw, ok, err := h.settings.CacheGet(c.Request.Context(), "export:"+token)
if err != nil || !ok {
httpx.Fail(c, "导出token无效或已过期")
value, err := h.service.ConsumeToken(c.Request.Context(), token, expectBlank)
if err != nil {
switch {
case errors.Is(err, service.ErrExportTokenMalformed):
httpx.Fail(c, "解析导出参数失败")
case errors.Is(err, service.ErrExportTokenType):
httpx.Fail(c, "token类型错误")
default:
httpx.Fail(c, "导出token无效或已过期")
}
return
}
var value exportToken
if json.Unmarshal([]byte(raw), &value) != nil {
httpx.Fail(c, "解析导出参数失败")
return
}
if value.Blank != expectBlank {
httpx.Fail(c, "token类型错误")
return
}
_ = h.settings.CacheDelete(c.Request.Context(), "export:"+token)
var data []byte
var name string
if expectBlank {