You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

server.go 6.5 kB

7 months ago
7 months ago
7 months ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package http
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/gin-gonic/gin"
  6. "gitlink.org.cn/cloudream/common/pkgs/async"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. "gitlink.org.cn/cloudream/jcs-pub/client/internal/services"
  9. cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api"
  10. )
  11. type ServerEventChan = async.UnboundChannel[ServerEvent]
  12. type ServerEvent interface {
  13. IsServerEvent() bool
  14. }
  15. type ExitEvent struct {
  16. ServerEvent
  17. Err error
  18. }
  19. type Server struct {
  20. cfg *Config
  21. httpSrv *http.Server
  22. svc *services.Service
  23. eventChan *ServerEventChan
  24. }
  25. func NewServer(cfg *Config, svc *services.Service) *Server {
  26. return &Server{
  27. cfg: cfg,
  28. svc: svc,
  29. eventChan: async.NewUnboundChannel[ServerEvent](),
  30. }
  31. }
  32. func (s *Server) Start() *ServerEventChan {
  33. go func() {
  34. if s.cfg == nil {
  35. return
  36. }
  37. engine := gin.New()
  38. s.httpSrv = &http.Server{
  39. Addr: s.cfg.Listen,
  40. Handler: engine,
  41. }
  42. s.initRouters(engine)
  43. logger.Infof("start serving http at: %s", s.cfg.Listen)
  44. err := s.httpSrv.ListenAndServe()
  45. if err != nil {
  46. logger.Infof("http stopped with error: %s", err.Error())
  47. } else {
  48. logger.Infof("http stopped")
  49. }
  50. s.eventChan.Send(ExitEvent{Err: err})
  51. }()
  52. return s.eventChan
  53. }
  54. func (s *Server) Stop() {
  55. if s.httpSrv == nil {
  56. s.eventChan.Send(ExitEvent{})
  57. return
  58. }
  59. s.httpSrv.Shutdown(context.Background())
  60. }
  61. func (s *Server) initRouters(engine *gin.Engine) {
  62. rt := engine.Use()
  63. // initTemp(rt, s)
  64. s.routeV1(engine, rt)
  65. rt.GET(cliapi.ObjectListPathByPath, s.Object().ListByPath)
  66. rt.GET(cliapi.ObjectListByIDsPath, s.Object().ListByIDs)
  67. rt.GET(cliapi.ObjectDownloadPath, s.Object().Download)
  68. rt.GET(cliapi.ObjectDownloadByPathPath, s.Object().DownloadByPath)
  69. rt.POST(cliapi.ObjectUploadPath, s.Object().Upload)
  70. rt.GET(cliapi.ObjectGetPackageObjectsPath, s.Object().GetPackageObjects)
  71. rt.POST(cliapi.ObjectUpdateInfoPath, s.Object().UpdateInfo)
  72. rt.POST(cliapi.ObjectUpdateInfoByPathPath, s.Object().UpdateInfoByPath)
  73. rt.POST(cliapi.ObjectMovePath, s.Object().Move)
  74. rt.POST(cliapi.ObjectDeletePath, s.Object().Delete)
  75. rt.POST(cliapi.ObjectDeleteByPathPath, s.Object().DeleteByPath)
  76. rt.POST(cliapi.ObjectClonePath, s.Object().Clone)
  77. rt.GET(cliapi.PackageGetPath, s.Package().Get)
  78. rt.GET(cliapi.PackageGetByFullNamePath, s.Package().GetByFullName)
  79. rt.POST(cliapi.PackageCreatePath, s.Package().Create)
  80. rt.POST(cliapi.PackageCreateLoadPath, s.Package().CreateLoad)
  81. rt.POST(cliapi.PackageDeletePath, s.Package().Delete)
  82. rt.POST(cliapi.PackageClonePath, s.Package().Clone)
  83. rt.GET(cliapi.PackageListBucketPackagesPath, s.Package().ListBucketPackages)
  84. // rt.GET(cdsapi.PackageGetCachedStoragesPath, s.Package().GetCachedStorages)
  85. rt.POST(cliapi.UserSpaceLoadPackagePath, s.UserSpace().LoadPackage)
  86. rt.POST(cliapi.UserSpaceCreatePackagePath, s.UserSpace().CreatePackage)
  87. rt.GET(cliapi.UserSpaceGetPath, s.UserSpace().Get)
  88. // rt.POST(cdsapi.CacheMovePackagePath, s.Cache().MovePackage)
  89. rt.GET(cliapi.BucketGetByNamePath, s.Bucket().GetByName)
  90. rt.POST(cliapi.BucketCreatePath, s.Bucket().Create)
  91. rt.POST(cliapi.BucketDeletePath, s.Bucket().Delete)
  92. rt.GET(cliapi.BucketListAllPath, s.Bucket().ListAll)
  93. }
  94. func (s *Server) routeV1(eg *gin.Engine, rt gin.IRoutes) {
  95. v1 := eg.Group("/v1")
  96. awsAuth := NewAWSAuth(s.cfg)
  97. v1.GET(cliapi.ObjectListPathByPath, awsAuth.Auth, s.Object().ListByPath)
  98. v1.GET(cliapi.ObjectListByIDsPath, awsAuth.Auth, s.Object().ListByIDs)
  99. v1.GET(cliapi.ObjectDownloadPath, awsAuth.Auth, s.Object().Download)
  100. v1.GET(cliapi.ObjectDownloadByPathPath, awsAuth.Auth, s.Object().DownloadByPath)
  101. v1.POST(cliapi.ObjectUploadPath, awsAuth.AuthWithoutBody, s.Object().Upload)
  102. v1.GET(cliapi.ObjectGetPackageObjectsPath, awsAuth.Auth, s.Object().GetPackageObjects)
  103. v1.POST(cliapi.ObjectUpdateInfoPath, awsAuth.Auth, s.Object().UpdateInfo)
  104. v1.POST(cliapi.ObjectUpdateInfoByPathPath, awsAuth.Auth, s.Object().UpdateInfoByPath)
  105. v1.POST(cliapi.ObjectMovePath, awsAuth.Auth, s.Object().Move)
  106. v1.POST(cliapi.ObjectDeletePath, awsAuth.Auth, s.Object().Delete)
  107. v1.POST(cliapi.ObjectDeleteByPathPath, awsAuth.Auth, s.Object().DeleteByPath)
  108. v1.POST(cliapi.ObjectClonePath, awsAuth.Auth, s.Object().Clone)
  109. v1.GET(cliapi.PackageGetPath, awsAuth.Auth, s.Package().Get)
  110. v1.GET(cliapi.PackageGetByFullNamePath, awsAuth.Auth, s.Package().GetByFullName)
  111. v1.POST(cliapi.PackageCreatePath, awsAuth.Auth, s.Package().Create)
  112. v1.POST(cliapi.PackageCreateLoadPath, awsAuth.Auth, s.Package().CreateLoad)
  113. v1.POST(cliapi.PackageDeletePath, awsAuth.Auth, s.Package().Delete)
  114. v1.POST(cliapi.PackageClonePath, awsAuth.Auth, s.Package().Clone)
  115. v1.GET(cliapi.PackageListBucketPackagesPath, awsAuth.Auth, s.Package().ListBucketPackages)
  116. // v1.GET(cdsapi.PackageGetCachedStoragesPath, awsAuth.Auth, s.Package().GetCachedStorages)
  117. v1.POST(cliapi.UserSpaceLoadPackagePath, awsAuth.Auth, s.UserSpace().LoadPackage)
  118. v1.POST(cliapi.UserSpaceCreatePackagePath, awsAuth.Auth, s.UserSpace().CreatePackage)
  119. v1.GET(cliapi.UserSpaceGetPath, awsAuth.Auth, s.UserSpace().Get)
  120. // v1.POST(cdsapi.CacheMovePackagePath, awsAuth.Auth, s.Cache().MovePackage)
  121. v1.GET(cliapi.BucketGetByNamePath, awsAuth.Auth, s.Bucket().GetByName)
  122. v1.POST(cliapi.BucketCreatePath, awsAuth.Auth, s.Bucket().Create)
  123. v1.POST(cliapi.BucketDeletePath, awsAuth.Auth, s.Bucket().Delete)
  124. v1.GET(cliapi.BucketListAllPath, awsAuth.Auth, s.Bucket().ListAll)
  125. rt.POST(cliapi.ObjectNewMultipartUploadPath, s.Object().NewMultipartUpload)
  126. rt.POST(cliapi.ObjectUploadPartPath, s.Object().UploadPart)
  127. rt.POST(cliapi.ObjectCompleteMultipartUploadPath, s.Object().CompleteMultipartUpload)
  128. rt.GET(cliapi.PresignedObjectListByPathPath, awsAuth.PresignedAuth, s.Presigned().ObjectListByPath)
  129. rt.GET(cliapi.PresignedObjectDownloadByPathPath, awsAuth.PresignedAuth, s.Presigned().ObjectDownloadByPath)
  130. rt.GET(cliapi.PresignedObjectDownloadPath, awsAuth.PresignedAuth, s.Presigned().ObjectDownload)
  131. rt.POST(cliapi.PresignedObjectUploadPath, awsAuth.PresignedAuth, s.Presigned().ObjectUpload)
  132. rt.POST(cliapi.PresignedObjectNewMultipartUploadPath, awsAuth.PresignedAuth, s.Presigned().ObjectNewMultipartUpload)
  133. rt.POST(cliapi.PresignedObjectUploadPartPath, awsAuth.PresignedAuth, s.Presigned().ObjectUploadPart)
  134. rt.POST(cliapi.PresignedObjectCompleteMultipartUploadPath, awsAuth.PresignedAuth, s.Presigned().ObjectCompleteMultipartUpload)
  135. // 不需要鉴权
  136. rt.GET(cliapi.MountDumpStatusPath, s.Mount().DumpStatus)
  137. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。