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.

temp.go 10 kB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. package http
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. "github.com/samber/lo"
  6. "gitlink.org.cn/cloudream/common/consts/errorcode"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  9. )
  10. type TempService struct {
  11. *Server
  12. }
  13. func (s *Server) Temp() *TempService {
  14. return &TempService{
  15. Server: s,
  16. }
  17. }
  18. type TempListDetailsResp struct {
  19. Buckets []BucketDetail `json:"buckets"`
  20. }
  21. type BucketDetail struct {
  22. BucketID cdssdk.BucketID `json:"bucketID"`
  23. Name string `json:"name"`
  24. ObjectCount int `json:"objectCount"`
  25. }
  26. func (s *TempService) ListDetails(ctx *gin.Context) {
  27. log := logger.WithField("HTTP", "Bucket.ListBucketsDetails")
  28. bkts, err := s.svc.BucketSvc().GetUserBuckets(1)
  29. if err != nil {
  30. log.Warnf("getting user buckets: %s", err.Error())
  31. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get user buckets failed"))
  32. return
  33. }
  34. details := make([]BucketDetail, len(bkts))
  35. for i := range bkts {
  36. details[i].BucketID = bkts[i].BucketID
  37. details[i].Name = bkts[i].Name
  38. objs, err := s.getBucketObjects(bkts[i].BucketID)
  39. if err != nil {
  40. log.Warnf("getting bucket objects: %s", err.Error())
  41. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket objects failed"))
  42. return
  43. }
  44. details[i].ObjectCount = len(objs)
  45. }
  46. ctx.JSON(http.StatusOK, OK(TempListDetailsResp{
  47. Buckets: details,
  48. }))
  49. }
  50. type TempGetObjects struct {
  51. BucketID cdssdk.BucketID `form:"bucketID"`
  52. }
  53. type BucketGetObjectsResp struct {
  54. Objects []cdssdk.Object `json:"objects"`
  55. }
  56. func (s *TempService) GetObjects(ctx *gin.Context) {
  57. log := logger.WithField("HTTP", "Bucket.ListBucketsDetails")
  58. var req TempGetObjects
  59. if err := ctx.ShouldBindQuery(&req); err != nil {
  60. log.Warnf("binding query: %s", err.Error())
  61. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  62. return
  63. }
  64. objs, err := s.getBucketObjects(req.BucketID)
  65. if err != nil {
  66. log.Warnf("getting bucket objects: %s", err.Error())
  67. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket objects failed"))
  68. return
  69. }
  70. ctx.JSON(http.StatusOK, OK(BucketGetObjectsResp{
  71. Objects: objs,
  72. }))
  73. }
  74. type TempGetObjectDetail struct {
  75. ObjectID cdssdk.ObjectID `form:"objectID"`
  76. }
  77. type TempGetObjectDetailResp struct {
  78. Blocks []ObjectBlockDetail `json:"blocks"`
  79. }
  80. type ObjectBlockDetail struct {
  81. ObjectID cdssdk.ObjectID `json:"objectID"`
  82. Type string `json:"type"`
  83. FileHash cdssdk.FileHash `json:"fileHash"`
  84. LocationType string `json:"locationType"`
  85. LocationName string `json:"locationName"`
  86. }
  87. func (s *TempService) GetObjectDetail(ctx *gin.Context) {
  88. log := logger.WithField("HTTP", "Object.GetObjectDetail")
  89. var req TempGetObjectDetail
  90. if err := ctx.ShouldBindQuery(&req); err != nil {
  91. log.Warnf("binding query: %s", err.Error())
  92. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  93. return
  94. }
  95. details, err := s.svc.ObjectSvc().GetObjectDetail(req.ObjectID)
  96. if err != nil {
  97. log.Warnf("getting object detail: %s", err.Error())
  98. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get object detail failed"))
  99. return
  100. }
  101. if details == nil {
  102. log.Warnf("object not found")
  103. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "object not found"))
  104. return
  105. }
  106. var allStgIDs []cdssdk.StorageID
  107. allStgIDs = append(allStgIDs, details.PinnedAt...)
  108. for _, b := range details.Blocks {
  109. allStgIDs = append(allStgIDs, b.StorageID)
  110. }
  111. allStgIDs = lo.Uniq(allStgIDs)
  112. getStgs, err := s.svc.StorageSvc().GetDetails(allStgIDs)
  113. if err != nil {
  114. log.Warnf("getting nodes: %s", err.Error())
  115. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed"))
  116. return
  117. }
  118. allStgs := make(map[cdssdk.StorageID]cdssdk.Storage)
  119. for _, n := range getStgs {
  120. if n != nil {
  121. allStgs[n.Storage.StorageID] = n.Storage
  122. }
  123. }
  124. var blocks []ObjectBlockDetail
  125. for _, stgID := range details.PinnedAt {
  126. blocks = append(blocks, ObjectBlockDetail{
  127. Type: "Rep",
  128. FileHash: details.Object.FileHash,
  129. LocationType: "Agent",
  130. LocationName: allStgs[stgID].Name,
  131. })
  132. }
  133. switch details.Object.Redundancy.(type) {
  134. case *cdssdk.NoneRedundancy:
  135. for _, blk := range details.Blocks {
  136. if !lo.Contains(details.PinnedAt, blk.StorageID) {
  137. blocks = append(blocks, ObjectBlockDetail{
  138. Type: "Rep",
  139. FileHash: blk.FileHash,
  140. LocationType: "Agent",
  141. LocationName: allStgs[blk.StorageID].Name,
  142. })
  143. }
  144. }
  145. case *cdssdk.RepRedundancy:
  146. for _, blk := range details.Blocks {
  147. if !lo.Contains(details.PinnedAt, blk.StorageID) {
  148. blocks = append(blocks, ObjectBlockDetail{
  149. Type: "Rep",
  150. FileHash: blk.FileHash,
  151. LocationType: "Agent",
  152. LocationName: allStgs[blk.StorageID].Name,
  153. })
  154. }
  155. }
  156. case *cdssdk.ECRedundancy:
  157. for _, blk := range details.Blocks {
  158. blocks = append(blocks, ObjectBlockDetail{
  159. Type: "Block",
  160. FileHash: blk.FileHash,
  161. LocationType: "Agent",
  162. LocationName: allStgs[blk.StorageID].Name,
  163. })
  164. }
  165. }
  166. ctx.JSON(http.StatusOK, OK(TempGetObjectDetailResp{
  167. Blocks: blocks,
  168. }))
  169. }
  170. func (s *TempService) getBucketObjects(bktID cdssdk.BucketID) ([]cdssdk.Object, error) {
  171. pkgs, err := s.svc.PackageSvc().GetBucketPackages(1, bktID)
  172. if err != nil {
  173. return nil, err
  174. }
  175. var allObjs []cdssdk.Object
  176. for _, pkg := range pkgs {
  177. objs, err := s.svc.ObjectSvc().GetPackageObjects(1, pkg.PackageID)
  178. if err != nil {
  179. return nil, err
  180. }
  181. allObjs = append(allObjs, objs...)
  182. }
  183. return allObjs, nil
  184. }
  185. type TempGetDatabaseAll struct {
  186. }
  187. type TempGetDatabaseAllResp struct {
  188. Buckets []BucketDetail `json:"buckets"`
  189. Objects []BucketObject `json:"objects"`
  190. Blocks []ObjectBlockDetail `json:"blocks"`
  191. }
  192. type BucketObject struct {
  193. cdssdk.Object
  194. BucketID cdssdk.BucketID `json:"bucketID"`
  195. }
  196. func (s *TempService) GetDatabaseAll(ctx *gin.Context) {
  197. log := logger.WithField("HTTP", "Temp.GetDatabaseAll")
  198. db, err := s.svc.ObjectSvc().GetDatabaseAll()
  199. if err != nil {
  200. log.Warnf("getting database all: %s", err.Error())
  201. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get database all failed"))
  202. return
  203. }
  204. var allStgIDs []cdssdk.StorageID
  205. for _, obj := range db.Objects {
  206. allStgIDs = append(allStgIDs, obj.PinnedAt...)
  207. for _, blk := range obj.Blocks {
  208. allStgIDs = append(allStgIDs, blk.StorageID)
  209. }
  210. }
  211. getStgs, err := s.svc.StorageSvc().GetDetails(allStgIDs)
  212. if err != nil {
  213. log.Warnf("getting nodes: %s", err.Error())
  214. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed"))
  215. return
  216. }
  217. allStgs := make(map[cdssdk.StorageID]cdssdk.Storage)
  218. for _, n := range getStgs {
  219. if n != nil {
  220. allStgs[n.Storage.StorageID] = n.Storage
  221. }
  222. }
  223. bkts := make(map[cdssdk.BucketID]*BucketDetail)
  224. for _, bkt := range db.Buckets {
  225. bkts[bkt.BucketID] = &BucketDetail{
  226. BucketID: bkt.BucketID,
  227. Name: bkt.Name,
  228. ObjectCount: 0,
  229. }
  230. }
  231. type PackageDetail struct {
  232. Package cdssdk.Package
  233. // Loaded []cdssdk.Node
  234. }
  235. pkgs := make(map[cdssdk.PackageID]*PackageDetail)
  236. for _, pkg := range db.Packages {
  237. p := PackageDetail{
  238. Package: pkg,
  239. // Loaded: make([]cdssdk.Node, 0),
  240. }
  241. // loaded, err := s.svc.PackageSvc().GetLoadedNodes(1, pkg.PackageID)
  242. // if err != nil {
  243. // log.Warnf("getting loaded nodes: %s", err.Error())
  244. // ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get loaded nodes failed"))
  245. // return
  246. // }
  247. // for _, hubID := range loaded {
  248. // p.Loaded = append(p.Loaded, allNodes[hubID])
  249. // }
  250. pkgs[pkg.PackageID] = &p
  251. }
  252. var objs []BucketObject
  253. for _, obj := range db.Objects {
  254. o := BucketObject{
  255. Object: obj.Object,
  256. BucketID: pkgs[obj.Object.PackageID].Package.BucketID,
  257. }
  258. objs = append(objs, o)
  259. }
  260. var blocks []ObjectBlockDetail
  261. for _, obj := range db.Objects {
  262. bkts[pkgs[obj.Object.PackageID].Package.BucketID].ObjectCount++
  263. for _, hubID := range obj.PinnedAt {
  264. blocks = append(blocks, ObjectBlockDetail{
  265. ObjectID: obj.Object.ObjectID,
  266. Type: "Rep",
  267. FileHash: obj.Object.FileHash,
  268. LocationType: "Agent",
  269. LocationName: allStgs[hubID].Name,
  270. })
  271. }
  272. switch obj.Object.Redundancy.(type) {
  273. case *cdssdk.NoneRedundancy:
  274. for _, blk := range obj.Blocks {
  275. if !lo.Contains(obj.PinnedAt, blk.StorageID) {
  276. blocks = append(blocks, ObjectBlockDetail{
  277. ObjectID: obj.Object.ObjectID,
  278. Type: "Rep",
  279. FileHash: blk.FileHash,
  280. LocationType: "Agent",
  281. LocationName: allStgs[blk.StorageID].Name,
  282. })
  283. }
  284. }
  285. case *cdssdk.RepRedundancy:
  286. for _, blk := range obj.Blocks {
  287. if !lo.Contains(obj.PinnedAt, blk.StorageID) {
  288. blocks = append(blocks, ObjectBlockDetail{
  289. ObjectID: obj.Object.ObjectID,
  290. Type: "Rep",
  291. FileHash: blk.FileHash,
  292. LocationType: "Agent",
  293. LocationName: allStgs[blk.StorageID].Name,
  294. })
  295. }
  296. }
  297. case *cdssdk.ECRedundancy:
  298. for _, blk := range obj.Blocks {
  299. blocks = append(blocks, ObjectBlockDetail{
  300. ObjectID: obj.Object.ObjectID,
  301. Type: "Block",
  302. FileHash: blk.FileHash,
  303. LocationType: "Agent",
  304. LocationName: allStgs[blk.StorageID].Name,
  305. })
  306. }
  307. }
  308. // for _, node := range pkgs[obj.Object.PackageID].Loaded {
  309. // blocks = append(blocks, ObjectBlockDetail{
  310. // ObjectID: obj.Object.ObjectID,
  311. // Type: "Rep",
  312. // FileHash: obj.Object.FileHash,
  313. // LocationType: "Storage",
  314. // LocationName: allNodes[node.HubID].Name,
  315. // })
  316. // }
  317. }
  318. ctx.JSON(http.StatusOK, OK(TempGetDatabaseAllResp{
  319. Buckets: lo.Map(lo.Values(bkts), func(b *BucketDetail, _ int) BucketDetail { return *b }),
  320. Objects: objs,
  321. Blocks: blocks,
  322. }))
  323. }
  324. func initTemp(rt gin.IRoutes, s *Server) {
  325. rt.GET("/bucket/listDetails", s.Temp().ListDetails)
  326. rt.GET("/bucket/getObjects", s.Temp().GetObjects)
  327. rt.GET("/object/getDetail", s.Temp().GetObjectDetail)
  328. rt.GET("/temp/getDatabaseAll", s.Temp().GetDatabaseAll)
  329. }
  330. func auth(ctx *gin.Context) {
  331. token := ctx.Request.Header.Get("X-CDS-Auth")
  332. if token != "cloudream@123" {
  333. ctx.AbortWithStatus(http.StatusUnauthorized)
  334. }
  335. }

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