package admin import ( "errors" "fmt" "path/filepath" "quyun/app/models" "quyun/database/schemas/public/model" "quyun/providers/ali" "quyun/providers/app" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/go-jet/jet/v2/qrm" "github.com/gofiber/fiber/v3" ) const UPLOAD_PATH = "quyun" // @provider type uploads struct { app *app.Config oss *ali.OSSClient } type PreCheckResp struct { Exists bool `json:"exists"` PreSign *oss.PresignResult `json:"pre_sign"` } // PreUploadCheck // @Router /v1/admin/uploads/pre-uploaded-check/:md5.:ext [get] // @Bind md5 path // @Bind ext path func (up *uploads) PreUploadCheck(ctx fiber.Ctx, md5, ext string) (*PreCheckResp, error) { _, err := models.Medias.GetByHash(ctx.Context(), md5) if err != nil && errors.Is(err, qrm.ErrNoRows) { preSign, err := up.oss.PreSignUpload(ctx.Context(), fmt.Sprintf("%s%s", md5, ext)) if err != nil { return nil, err } return &PreCheckResp{Exists: false, PreSign: preSign}, nil } return &PreCheckResp{Exists: true}, nil } type PostUploadedForm struct { OriginalName string `json:"originalName"` Md5 string `json:"md5"` MimeType string `json:"mimeType"` Size int64 `json:"size"` } // PostUploadedAction // @Router /v1/admin/uploads/post-uploaded-action [post] // @Bind body body func (up *uploads) PostUploadedAction(ctx fiber.Ctx, body *PostUploadedForm) error { m, err := models.Medias.GetByHash(ctx.Context(), body.Md5) if err != nil && !errors.Is(err, qrm.ErrNoRows) { return err } m = &model.Medias{ Name: body.OriginalName, MimeType: body.MimeType, Size: body.Size, Hash: body.Md5, Path: filepath.Join(UPLOAD_PATH, body.Md5+filepath.Ext(body.OriginalName)), } return models.Medias.Create(ctx.Context(), m) }