first commit

This commit is contained in:
2022-03-17 15:59:24 +08:00
commit 2b0debb847
592 changed files with 73946 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
package http
import (
"github.com/gin-gonic/gin"
"github.com/inconshreveable/log15"
"gitlab.33.cn/chat/dtalk/pkg/api"
"gitlab.33.cn/chat/dtalk/service/oss/service"
"net/http"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
_ "gitlab.33.cn/chat/dtalk/service/oss/docs"
)
var (
svc *service.Service
log = log15.New("module", "oss/http")
)
func Init(s *service.Service) *http.Server {
addr := s.Config().Server.Addr
engine := Default()
InitService(s)
SetupEngine(engine)
srv := &http.Server{
Addr: addr,
Handler: engine,
}
go func() {
// service connections
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Error("engineInner.Start() error(%v)", err)
panic(err)
}
}()
return srv
}
// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *gin.Engine {
router := gin.New()
// LoggerWithFormatter middleware will write the logs to gin.DefaultWriter
// By default gin.DefaultWriter = os.Stdout
router.Use(gin.LoggerWithFormatter(api.Chat33GinLogFormatter))
router.Use(gin.Recovery())
return router
}
func InitService(s *service.Service) {
svc = s
}
// SetupEngine
// @title 云存储服务接口
// @version 1.0
// @host 127.0.0.1:18005
func SetupEngine(e *gin.Engine) *gin.Engine {
root := e.Group("/", api.RespMiddleWare())
//获取服务器列表
root.Use(api.AuthMiddleWare())
{
root.POST("/get-token", GetOssToken)
root.GET("/get-token", GetOssToken)
root.POST("/get-huaweiyun-token", GetHuaweiyunOssToken)
root.GET("/get-huaweiyun-token", GetHuaweiyunOssToken)
root.POST("/upload", Upload)
root.POST("/init-multipart-upload", InitMultipartUpload)
root.POST("/upload-part", UploadPart)
root.POST("/complete-multipart-upload", CompleteMultipartUpload)
root.POST("/abort-multipart-upload", AbortMultipartUpload)
root.POST("/get-host", GetHost)
}
e.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
return e
}

View File

@@ -0,0 +1,238 @@
package http
import (
"github.com/gin-gonic/gin"
"gitlab.33.cn/chat/dtalk/pkg/api"
xerror "gitlab.33.cn/chat/dtalk/pkg/error"
"gitlab.33.cn/chat/dtalk/service/oss/model"
)
func GetOssToken(c *gin.Context) {
resp, err := svc.AssumeRole("dtalk", model.Oss_Aliyun)
c.Set(api.ReqResult, resp)
c.Set(api.ReqError, err)
}
func GetHuaweiyunOssToken(c *gin.Context) {
resp, err := svc.AssumeRole("dtalk", model.Oss_Huaweiuyn)
c.Set(api.ReqResult, resp)
c.Set(api.ReqError, err)
}
// Upload
// @Summary 上传文件
// @Author chy@33.cn
// @Tags oss 普通上传
// @Accept multipart/form-data
// @Param FZM-SIGNATURE header string true "MOCK"
// @Param file formData file true "file"
// @Param data formData model.UploadRequest true "body"
// @Success 200 {object} model.GeneralResponse{data=model.UploadResponse}
// @Router /upload [post]
func Upload(c *gin.Context) {
req := &model.UploadRequest{}
err := c.ShouldBind(req)
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
file, err := c.FormFile("file")
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
fileOpen, err := file.Open()
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
defer fileOpen.Close()
req.Size = file.Size
req.Body = fileOpen
if file.Size > model.MaxPartSize {
c.Set(api.ReqError, xerror.NewError(xerror.OssFileTooBig))
return
}
userId, ok := c.Get(api.Address)
if !ok {
c.Set(api.ReqError, xerror.NewError(xerror.SignatureInvalid))
return
}
req.PersonId = userId.(string)
res, err := svc.Upload(req)
c.Set(api.ReqResult, res)
c.Set(api.ReqError, err)
}
// InitMultipartUpload
// @Summary 初始化分段上传任务
// @Author chy@33.cn
// @Tags oss 分段上传
// @Accept application/json
// @Param FZM-SIGNATURE header string true "MOCK"
// @Param data body model.InitMultipartUploadRequest true "body"
// @Success 200 {object} model.GeneralResponse{data=model.InitMultipartUploadResponse}
// @Router /init-multipart-upload [post]
func InitMultipartUpload(c *gin.Context) {
req := &model.InitMultipartUploadRequest{}
err := c.ShouldBind(req)
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
userId, ok := c.Get(api.Address)
if !ok {
c.Set(api.ReqError, xerror.NewError(xerror.SignatureInvalid))
return
}
req.PersonId = userId.(string)
res, err := svc.InitiateMultipartUpload(req)
c.Set(api.ReqResult, res)
c.Set(api.ReqError, err)
}
// UploadPart
// @Summary 上传段
// @Author chy@33.cn
// @Tags oss 分段上传
// @Accept multipart/form-data
// @Param FZM-SIGNATURE header string true "MOCK"
// @Param file formData file true "aliyun, huaweiyun 除了最后一段以外其他段的大小范围是100KB~5GB最后段大小范围是0~5GB。minio 除了最后一段以外其他段的大小范围是5MB~5GB最后段大小范围是0~5GB。"
// @Param data formData model.UploadPartRequest true "body"
// @Success 200 {object} model.GeneralResponse{data=model.UploadPartResponse}
// @Router /upload-part [post]
func UploadPart(c *gin.Context) {
req := &model.UploadPartRequest{}
err := c.ShouldBind(req)
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
file, err := c.FormFile("file")
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
fileOpen, err := file.Open()
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
defer fileOpen.Close()
req.PartSize = file.Size
req.Body = fileOpen
//if file.Size < model.MinPartSize {
// c.Set(api.ReqError, xerror.NewError(xerror.OssFileTooSmall))
// return
//}
if file.Size > model.MaxPartSize {
c.Set(api.ReqError, xerror.NewError(xerror.OssFileTooBig))
return
}
userId, ok := c.Get(api.Address)
if !ok {
c.Set(api.ReqError, xerror.NewError(xerror.SignatureInvalid))
return
}
req.PersonId = userId.(string)
res, err := svc.UploadPart(req)
c.Set(api.ReqResult, res)
c.Set(api.ReqError, err)
}
// CompleteMultipartUpload
// @Summary 合并段
// @Author chy@33.cn
// @Tags oss 分段上传
// @Accept application/json
// @Param FZM-SIGNATURE header string true "MOCK"
// @Param data body model.CompleteMultipartUploadRequest true "body"
// @Success 200 {object} model.GeneralResponse{data=model.CompleteMultipartUploadResponse}
// @Router /complete-multipart-upload [post]
func CompleteMultipartUpload(c *gin.Context) {
req := &model.CompleteMultipartUploadRequest{}
err := c.ShouldBind(req)
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
userId, ok := c.Get(api.Address)
if !ok {
c.Set(api.ReqError, xerror.NewError(xerror.SignatureInvalid))
return
}
req.PersonId = userId.(string)
res, err := svc.CompleteMultipartUpload(req)
c.Set(api.ReqResult, res)
c.Set(api.ReqError, err)
}
// AbortMultipartUpload
// @Summary 取消分段上传任务
// @Author chy@33.cn
// @Tags oss 分段上传
// @Accept application/json
// @Param FZM-SIGNATURE header string true "MOCK"
// @Param data body model.AbortMultipartUploadRequest true "body"
// @Success 200 {object} model.GeneralResponse{data=model.AbortMultipartUploadResponse}
// @Router /abort-multipart-upload [post]
func AbortMultipartUpload(c *gin.Context) {
req := &model.AbortMultipartUploadRequest{}
err := c.ShouldBind(req)
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
userId, ok := c.Get(api.Address)
if !ok {
c.Set(api.ReqError, xerror.NewError(xerror.SignatureInvalid))
return
}
req.PersonId = userId.(string)
res, err := svc.AbortMultipartUpload(req)
c.Set(api.ReqResult, res)
c.Set(api.ReqError, err)
}
// GetHost
// @Summary 获得 oss Host
// @Author chy@33.cn
// @Tags oss
// @Accept application/json
// @Param FZM-SIGNATURE header string true "MOCK"
// @Param data body model.GetHostReq true "body"
// @Success 200 {object} model.GeneralResponse{data=model.GetHostResp}
// @Router /get-host [post]
func GetHost(c *gin.Context) {
req := &model.GetHostReq{}
err := c.ShouldBind(req)
if err != nil {
c.Set(api.ReqError, xerror.NewError(xerror.ParamsError).SetExtMessage(err.Error()))
return
}
userId, ok := c.Get(api.Address)
if !ok {
c.Set(api.ReqError, xerror.NewError(xerror.SignatureInvalid))
return
}
req.PersonId = userId.(string)
res, err := svc.GetHost(req)
c.Set(api.ReqResult, res)
c.Set(api.ReqError, err)
}