From 5a1983f08b7c0e930f45bf29968a569ed12ee268 Mon Sep 17 00:00:00 2001 From: yoge Date: Thu, 18 Dec 2025 15:14:42 +0800 Subject: [PATCH] feat: update oss download url --- .gitignore | 2 ++ api/router.go | 39 ++++++++++++++++++++++++++++++---- api/v1/formula/router.go | 16 -------------- api/v1/oss/handler.go | 13 +++++++++--- api/v1/oss/router.go | 12 ----------- api/v1/task/router.go | 12 ----------- api/v1/user/router.go | 17 --------------- config/config_dev.yaml | 2 +- config/config_prod.yaml | 2 +- internal/model/task/request.go | 4 ++-- internal/service/task.go | 9 ++++++-- pkg/common/errors.go | 2 ++ pkg/common/middleware.go | 24 +++++++++++++++------ pkg/oss/policy.go | 9 ++++---- 14 files changed, 83 insertions(+), 80 deletions(-) delete mode 100644 api/v1/formula/router.go delete mode 100644 api/v1/oss/router.go delete mode 100644 api/v1/task/router.go delete mode 100644 api/v1/user/router.go diff --git a/.gitignore b/.gitignore index edc475d..ac3dd36 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ /upload texpixel /vendor + +dev_deploy.sh \ No newline at end of file diff --git a/api/router.go b/api/router.go index 6a699ce..6caa037 100644 --- a/api/router.go +++ b/api/router.go @@ -5,15 +5,46 @@ import ( "gitea.com/bitwsd/document_ai/api/v1/oss" "gitea.com/bitwsd/document_ai/api/v1/task" "gitea.com/bitwsd/document_ai/api/v1/user" + "gitea.com/bitwsd/document_ai/pkg/common" "github.com/gin-gonic/gin" ) func SetupRouter(engine *gin.RouterGroup) { v1 := engine.Group("/v1") { - formula.SetupRouter(v1) - oss.SetupRouter(v1) - task.SetupRouter(v1) - user.SetupRouter(v1) + formulaRouter := v1.Group("/formula", common.GetAuthMiddleware()) + { + endpoint := formula.NewFormulaEndpoint() + formulaRouter.POST("/recognition", endpoint.CreateTask) + formulaRouter.POST("/ai_enhance", endpoint.AIEnhanceRecognition) + formulaRouter.GET("/recognition/:task_no", endpoint.GetTaskStatus) + } + + taskRouter := v1.Group("/task", common.GetAuthMiddleware()) + { + endpoint := task.NewTaskEndpoint() + taskRouter.POST("/evaluate", endpoint.EvaluateTask) + taskRouter.GET("/list", endpoint.GetTaskList) + } + + ossRouter := v1.Group("/oss", common.GetAuthMiddleware()) + { + endpoint := oss.NewOSSEndpoint() + ossRouter.POST("/signature", endpoint.GetPostObjectSignature) + ossRouter.POST("/signature_url", endpoint.GetSignatureURL) + ossRouter.POST("/file/upload", endpoint.UploadFile) + } + + userRouter := v1.Group("/user", common.GetAuthMiddleware()) + { + userEndpoint := user.NewUserEndpoint() + { + userRouter.POST("/sms", userEndpoint.SendVerificationCode) + userRouter.POST("/register", userEndpoint.RegisterByEmail) + userRouter.POST("/login", userEndpoint.LoginByEmail) + userRouter.GET("/info", common.MustAuthMiddleware(), userEndpoint.GetUserInfo) + } + } } + } diff --git a/api/v1/formula/router.go b/api/v1/formula/router.go deleted file mode 100644 index 2a8f2b4..0000000 --- a/api/v1/formula/router.go +++ /dev/null @@ -1,16 +0,0 @@ -package formula - -import ( - "gitea.com/bitwsd/document_ai/pkg/common" - "github.com/gin-gonic/gin" -) - -func SetupRouter(engine *gin.RouterGroup) { - endpoint := NewFormulaEndpoint() - formulaRouter := engine.Group("/formula", common.GetAuthMiddleware()) - { - formulaRouter.POST("/recognition", endpoint.CreateTask) - formulaRouter.POST("/ai_enhance", endpoint.AIEnhanceRecognition) - formulaRouter.GET("/recognition/:task_no", endpoint.GetTaskStatus) - } -} diff --git a/api/v1/oss/handler.go b/api/v1/oss/handler.go index f1d7b35..8ba31f2 100644 --- a/api/v1/oss/handler.go +++ b/api/v1/oss/handler.go @@ -17,7 +17,14 @@ import ( "gorm.io/gorm" ) -func GetPostObjectSignature(ctx *gin.Context) { +type OSSEndpoint struct { +} + +func NewOSSEndpoint() *OSSEndpoint { + return &OSSEndpoint{} +} + +func (h *OSSEndpoint) GetPostObjectSignature(ctx *gin.Context) { policyToken, err := oss.GetPolicyToken() if err != nil { ctx.JSON(http.StatusOK, common.ErrorResponse(ctx, common.CodeSystemError, err.Error())) @@ -36,7 +43,7 @@ func GetPostObjectSignature(ctx *gin.Context) { // @Success 200 {object} common.Response{data=map[string]string{"sign_url":string, "repeat":bool, "path":string}} "Signed URL generated successfully" // @Failure 200 {object} common.Response "Error response" // @Router /signature_url [get] -func GetSignatureURL(ctx *gin.Context) { +func (h *OSSEndpoint) GetSignatureURL(ctx *gin.Context) { type Req struct { FileHash string `json:"file_hash" binding:"required"` FileName string `json:"file_name" binding:"required"` @@ -76,7 +83,7 @@ func GetSignatureURL(ctx *gin.Context) { ctx.JSON(http.StatusOK, common.SuccessResponse(ctx, gin.H{"sign_url": url, "repeat": false, "path": path})) } -func UploadFile(ctx *gin.Context) { +func (h *OSSEndpoint) UploadFile(ctx *gin.Context) { if err := os.MkdirAll(config.GlobalConfig.UploadDir, 0755); err != nil { ctx.JSON(http.StatusOK, common.ErrorResponse(ctx, common.CodeSystemError, "Failed to create upload directory")) return diff --git a/api/v1/oss/router.go b/api/v1/oss/router.go deleted file mode 100644 index 7c25322..0000000 --- a/api/v1/oss/router.go +++ /dev/null @@ -1,12 +0,0 @@ -package oss - -import "github.com/gin-gonic/gin" - -func SetupRouter(parent *gin.RouterGroup) { - router := parent.Group("oss") - { - router.POST("/signature", GetPostObjectSignature) - router.POST("/signature_url", GetSignatureURL) - router.POST("/file/upload", UploadFile) - } -} diff --git a/api/v1/task/router.go b/api/v1/task/router.go deleted file mode 100644 index 50067c3..0000000 --- a/api/v1/task/router.go +++ /dev/null @@ -1,12 +0,0 @@ -package task - -import ( - "gitea.com/bitwsd/document_ai/pkg/common" - "github.com/gin-gonic/gin" -) - -func SetupRouter(engine *gin.RouterGroup) { - endpoint := NewTaskEndpoint() - engine.POST("/task/evaluate", endpoint.EvaluateTask) - engine.GET("/task/list", common.MustAuthMiddleware(), endpoint.GetTaskList) -} diff --git a/api/v1/user/router.go b/api/v1/user/router.go deleted file mode 100644 index ab186f3..0000000 --- a/api/v1/user/router.go +++ /dev/null @@ -1,17 +0,0 @@ -package user - -import ( - "gitea.com/bitwsd/document_ai/pkg/common" - "github.com/gin-gonic/gin" -) - -func SetupRouter(router *gin.RouterGroup) { - userEndpoint := NewUserEndpoint() - userRouter := router.Group("/user") - { - userRouter.POST("/sms", userEndpoint.SendVerificationCode) - userRouter.POST("/register", userEndpoint.RegisterByEmail) - userRouter.POST("/login", userEndpoint.LoginByEmail) - userRouter.GET("/info", common.MustAuthMiddleware(), userEndpoint.GetUserInfo) - } -} diff --git a/config/config_dev.yaml b/config/config_dev.yaml index a4adb16..2732f25 100644 --- a/config/config_dev.yaml +++ b/config/config_dev.yaml @@ -39,7 +39,7 @@ aliyun: template_code: "SMS_291510729" oss: - endpoint: oss-cn-beijing.aliyuncs.com + endpoint: static.texpixel.com inner_endpoint: oss-cn-beijing-internal.aliyuncs.com access_key_id: LTAI5t8qXhow6NCdYDtu1saF access_key_secret: qZ2SwYsNCEBckCVSOszH31yYwXU44A diff --git a/config/config_prod.yaml b/config/config_prod.yaml index 62cb97c..eebb1fc 100644 --- a/config/config_prod.yaml +++ b/config/config_prod.yaml @@ -38,7 +38,7 @@ aliyun: template_code: "SMS_291510729" oss: - endpoint: oss-cn-beijing.aliyuncs.com + endpoint: static.texpixel.com inner_endpoint: oss-cn-beijing-internal.aliyuncs.com access_key_id: LTAI5t8qXhow6NCdYDtu1saF access_key_secret: qZ2SwYsNCEBckCVSOszH31yYwXU44A diff --git a/internal/model/task/request.go b/internal/model/task/request.go index 0c1a4d9..883384f 100644 --- a/internal/model/task/request.go +++ b/internal/model/task/request.go @@ -17,8 +17,8 @@ type TaskListRequest struct { type TaskListDTO struct { TaskID string `json:"task_id"` FileName string `json:"file_name"` - Status string `json:"status"` - Path string `json:"path"` + Status int `json:"status"` + OriginURL string `json:"origin_url"` TaskType string `json:"task_type"` CreatedAt string `json:"created_at"` Latex string `json:"latex"` diff --git a/internal/service/task.go b/internal/service/task.go index eea12d1..e272ed8 100644 --- a/internal/service/task.go +++ b/internal/service/task.go @@ -9,6 +9,7 @@ import ( "gitea.com/bitwsd/document_ai/internal/model/task" "gitea.com/bitwsd/document_ai/internal/storage/dao" "gitea.com/bitwsd/document_ai/pkg/log" + "gitea.com/bitwsd/document_ai/pkg/oss" ) type TaskService struct { @@ -91,13 +92,17 @@ func (svc *TaskService) GetTaskList(ctx context.Context, req *task.TaskListReque latex = recognitionResult.NewContentCodec().GetContent().(string) markdown = fmt.Sprintf("$$%s$$", latex) } + originURL, err := oss.GetDownloadURL(ctx, item.FileURL) + if err != nil { + log.Error(ctx, "func", "GetTaskList", "msg", "get origin url failed", "error", err) + } resp.TaskList = append(resp.TaskList, &task.TaskListDTO{ Latex: latex, Markdown: markdown, TaskID: item.TaskUUID, FileName: item.FileName, - Status: item.Status.String(), - Path: item.FileURL, + Status: int(item.Status), + OriginURL: originURL, TaskType: item.TaskType.String(), CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"), }) diff --git a/pkg/common/errors.go b/pkg/common/errors.go index b8171a2..9b4540a 100644 --- a/pkg/common/errors.go +++ b/pkg/common/errors.go @@ -6,6 +6,7 @@ const ( CodeSuccess = 200 CodeParamError = 400 CodeUnauthorized = 401 + CodeTokenExpired = 4011 CodeForbidden = 403 CodeNotFound = 404 CodeInvalidStatus = 405 @@ -23,6 +24,7 @@ const ( CodeSuccessMsg = "success" CodeParamErrorMsg = "param error" CodeUnauthorizedMsg = "unauthorized" + CodeTokenExpiredMsg = "token expired" CodeForbiddenMsg = "forbidden" CodeNotFoundMsg = "not found" CodeInvalidStatusMsg = "invalid status" diff --git a/pkg/common/middleware.go b/pkg/common/middleware.go index 2536fe1..8423db4 100644 --- a/pkg/common/middleware.go +++ b/pkg/common/middleware.go @@ -4,6 +4,7 @@ import ( "context" "net/http" "strings" + "time" "gitea.com/bitwsd/document_ai/pkg/constant" "gitea.com/bitwsd/document_ai/pkg/jwt" @@ -48,13 +49,24 @@ func AuthMiddleware(ctx *gin.Context) { func MustAuthMiddleware() gin.HandlerFunc { return func(ctx *gin.Context) { token := ctx.GetHeader("Authorization") - if token != "" { - token = strings.TrimPrefix(token, "Bearer ") - claims, err := jwt.ParseToken(token) - if err == nil { - ctx.Set(constant.ContextUserID, claims.UserId) - } + if token == "" { + ctx.JSON(http.StatusOK, ErrorResponse(ctx, CodeUnauthorized, CodeUnauthorizedMsg)) + ctx.Abort() + return } + token = strings.TrimPrefix(token, "Bearer ") + claims, err := jwt.ParseToken(token) + if err != nil || claims == nil { + ctx.JSON(http.StatusOK, ErrorResponse(ctx, CodeUnauthorized, CodeUnauthorizedMsg)) + ctx.Abort() + return + } + if claims.ExpiresAt < time.Now().Unix() { + ctx.JSON(http.StatusOK, ErrorResponse(ctx, CodeTokenExpired, CodeTokenExpiredMsg)) + ctx.Abort() + return + } + ctx.Set(constant.ContextUserID, claims.UserId) } } diff --git a/pkg/oss/policy.go b/pkg/oss/policy.go index 8551893..38375b2 100644 --- a/pkg/oss/policy.go +++ b/pkg/oss/policy.go @@ -64,8 +64,7 @@ func GetPolicyToken() (string, error) { } func GetPolicyURL(ctx context.Context, path string) (string, error) { - // Create OSS client - client, err := oss.New(config.GlobalConfig.Aliyun.OSS.Endpoint, config.GlobalConfig.Aliyun.OSS.AccessKeyID, config.GlobalConfig.Aliyun.OSS.AccessKeySecret) + client, err := oss.New(config.GlobalConfig.Aliyun.OSS.Endpoint, config.GlobalConfig.Aliyun.OSS.AccessKeyID, config.GlobalConfig.Aliyun.OSS.AccessKeySecret, oss.UseCname(true)) if err != nil { log.Error(ctx, "func", "GetPolicyURL", "msg", "create oss client failed", "error", err) return "", err @@ -151,7 +150,7 @@ func DownloadFile(ctx context.Context, ossPath string) (io.ReadCloser, error) { func GetDownloadURL(ctx context.Context, ossPath string) (string, error) { endpoint := config.GlobalConfig.Aliyun.OSS.Endpoint - client, err := oss.New(endpoint, config.GlobalConfig.Aliyun.OSS.AccessKeyID, config.GlobalConfig.Aliyun.OSS.AccessKeySecret) + client, err := oss.New(endpoint, config.GlobalConfig.Aliyun.OSS.AccessKeyID, config.GlobalConfig.Aliyun.OSS.AccessKeySecret, oss.UseCname(true)) if err != nil { log.Error(ctx, "func", "GetDownloadURL", "msg", "create oss client failed", "error", err) return "", err @@ -163,11 +162,13 @@ func GetDownloadURL(ctx context.Context, ossPath string) (string, error) { return "", err } - signURL, err := bucket.SignURL(ossPath, oss.HTTPGet, 60) + signURL, err := bucket.SignURL(ossPath, oss.HTTPGet, 3600) if err != nil { log.Error(ctx, "func", "GetDownloadURL", "msg", "get object failed", "error", err) return "", err } + signURL = strings.Replace(signURL, "http://", "https://", 1) + return signURL, nil }