file_qiniu.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package fileManager
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/qiniu/api.v7/v7/auth/qbox"
  6. "github.com/qiniu/api.v7/v7/storage"
  7. "gorm.io/gorm"
  8. "log-server/global"
  9. "log-server/model/fileManager"
  10. "log-server/model/fileManager/request"
  11. "log-server/model/fileManager/response"
  12. "log-server/model/task"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. type ServiceFileQiniu struct {
  18. }
  19. // 公司七牛信息
  20. const accessKey = "B81Gsvry2StqKVE3txS-7v9GBBfqykC9zhebmxnW" //七牛云ak,sk,bucket
  21. const secretKey = "YEZJuYcdeF7vRvzffxpopAVR-jMPZg9pZ-4IKTVW"
  22. const bucket0 = "pinaishop"
  23. const CName = "http://cdn.pinaishop.kfzs.com/" //七牛云外链
  24. // QueryVersionByType 查询某一类文件最新的版本号
  25. func (s *ServiceFileQiniu) QueryVersionByType(req request.FileQiniuRequest) (int64, error) {
  26. file := fileManager.FileQiniu{}
  27. if errors.Is(global.GVA_DB.Model(&fileManager.FileQiniu{}).Where("task_id = ? and file_type = ?", req.TaskId, req.FileType).Order("file_version desc").First(&file).Error, gorm.ErrRecordNotFound) {
  28. return 0, nil
  29. }
  30. return file.FileVersion, nil
  31. }
  32. // AddQiniuFile 新增文件
  33. func (s *ServiceFileQiniu) AddQiniuFile(requestCoding request.FileQiniuRequest) (err error) {
  34. //查询真实的父文件夹ID
  35. parentFolder := fileManager.FileFolder{}
  36. if errors.Is(global.GVA_DB.Where("task_id = ? and name = ?", requestCoding.TaskId, requestCoding.FileTypeName).First(&parentFolder).Error, gorm.ErrRecordNotFound) {
  37. return errors.New("父文件夹不存在")
  38. }
  39. //==================================
  40. if !errors.Is(global.GVA_DB.Where("parent_id = ? and file_name = ?", requestCoding.ParentId, requestCoding.FileName).First(&fileManager.FileQiniu{}).Error, gorm.ErrRecordNotFound) {
  41. return errors.New("该目录下已存在同名文件")
  42. }
  43. file := new(fileManager.FileQiniu)
  44. file.ParentId = parentFolder.Id
  45. file.TaskId = requestCoding.TaskId
  46. file.FileName = requestCoding.FileName
  47. file.FileVersion = requestCoding.FileVersion
  48. file.QiniuAddress = requestCoding.QiniuAddress
  49. file.QiniuKey = requestCoding.QiniuKey
  50. file.QiniuHash = requestCoding.QiniuHash
  51. file.FileType = requestCoding.FileType
  52. file.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  53. file.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
  54. global.GVA_LOG.Warn(requestCoding.MD5)
  55. global.GVA_LOG.Warn(strconv.Itoa(requestCoding.PushPolicy))
  56. global.GVA_LOG.Warn(requestCoding.PushTime)
  57. file.MD5 = requestCoding.MD5
  58. file.PushPolicy = requestCoding.PushPolicy
  59. file.PushTime = requestCoding.PushTime
  60. return global.GVA_DB.Create(&file).Error
  61. }
  62. // QueryFilesByParentId 查询当前目录下的文件
  63. func (s *ServiceFileQiniu) QueryFilesByParentId(parentId int) (interface{}, error) {
  64. db := global.GVA_DB.Model(&fileManager.FileQiniu{})
  65. db = db.Where("parent_id = ?", parentId)
  66. var fileList []*response.FileQiniuResponse
  67. err := db.Order("create_time desc").Find(&fileList).Error
  68. if err != nil {
  69. return nil, err
  70. }
  71. return fileList, err
  72. }
  73. // CheckIsExistMirror 查询所有游戏任务下是否有镜像
  74. func (s *ServiceFileQiniu) CheckIsExistMirror() (interface{}, error) {
  75. // 查询所有任务
  76. var taskList []task.GameTask
  77. db := global.GVA_DB.Model(&task.GameTask{}).Where("status = 1")
  78. err := db.Order("user").Find(&taskList).Error
  79. if err != nil {
  80. return nil, err
  81. }
  82. // 查询所有镜像
  83. var mirrorList []fileManager.FileQiniu
  84. db2 := global.GVA_DB.Model(&fileManager.FileQiniu{}).Where(`file_name LIKE '%.ldbk' OR file_name LIKE '%.npbk'`)
  85. err = db2.Order("id").Find(&mirrorList).Error
  86. if err != nil {
  87. return nil, err
  88. }
  89. var noMirrorList []task.GameTask
  90. for _, gameTask := range taskList {
  91. exist := false
  92. for _, qiniu := range mirrorList {
  93. if gameTask.TaskId == qiniu.TaskId {
  94. exist = true
  95. break
  96. }
  97. }
  98. if exist == false {
  99. noMirrorList = append(noMirrorList, gameTask)
  100. }
  101. }
  102. //for _, gameTask := range noMirrorList {
  103. // global.GVA_LOG.Warn(gameTask.TaskName)
  104. //}
  105. return noMirrorList, err
  106. }
  107. // GetMirrorDownloadByTaskId 根据任务id获取最新镜像下载链接
  108. func (s *ServiceFileQiniu) GetMirrorDownloadByTaskId(taskId string) (interface{}, error) {
  109. //SELECT * FROM file_qiniu WHERE task_id = 1000605 AND (file_type = 2 OR file_type = 4) AND push_policy = 1 ORDER BY file_version DESC LIMIT 1
  110. db := global.GVA_DB.Model(&fileManager.FileQiniu{})
  111. db = db.Where("task_id = ? AND (file_type = 2 OR file_type = 4) AND push_policy = 1", taskId)
  112. file := fileManager.FileQiniu{}
  113. err := db.Order("file_version desc").First(&file).Error
  114. if err != nil {
  115. return nil, err
  116. }
  117. qiniuMirrorMessage := new(response.QiniuMirrorMessage)
  118. qiniuMirrorMessage.TaskId = file.TaskId
  119. qiniuMirrorMessage.FileName = file.FileName
  120. qiniuMirrorMessage.FileVersion = file.FileVersion
  121. qiniuMirrorMessage.QiniuAddress = file.QiniuAddress
  122. qiniuMirrorMessage.QiniuHash = file.QiniuHash
  123. qiniuMirrorMessage.MD5 = file.MD5
  124. //qiniuMirrorMessage.CreateTime = file.CreateTime
  125. //qiniuMirrorMessage.PushPolicy = file.PushPolicy
  126. //qiniuMirrorMessage.PushTime = file.PushTime
  127. return qiniuMirrorMessage, err
  128. }
  129. // CheckPushTime 定时查看延迟更新的镜像是否到期
  130. func (s *ServiceFileQiniu) CheckPushTime() {
  131. global.GVA_LOG.Info("定时查看延迟更新的镜像是否到期开始执行:" + time.Now().Format("2006-01-02 15:04:05"))
  132. db := global.GVA_DB.Model(&fileManager.FileQiniu{})
  133. db = db.Where("(file_type = 2 OR file_type = 4) AND push_policy = 2")
  134. db = db.Where("push_time >= ?", time.Now().Format("2006-01-02 15:04:05"))
  135. db.Update("push_policy", 1)
  136. global.GVA_LOG.Info("定时查看延迟更新的镜像是否到期执行成功:" + time.Now().Format("2006-01-02 15:04:05"))
  137. return
  138. }
  139. // GetQiniuToken 获取七牛上传token
  140. func (s *ServiceFileQiniu) GetQiniuToken() interface{} {
  141. putPolicy := storage.PutPolicy{
  142. Scope: bucket0,
  143. ReturnBody: `{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`,
  144. }
  145. putPolicy.Expires = 3600 * 5 //设置有效期时长为5小时
  146. mac := qbox.NewMac(accessKey, secretKey)
  147. uploadToken := putPolicy.UploadToken(mac)
  148. date := map[string]string{
  149. "token": uploadToken,
  150. "cName": CName,
  151. }
  152. return date
  153. }
  154. // DeleteQiniuFile 删除单个文件
  155. func (s *ServiceFileQiniu) DeleteQiniuFile(requestCoding request.FileQiniuRequest) (err error) {
  156. mac := qbox.NewMac(accessKey, secretKey)
  157. cfg := storage.Config{
  158. // 是否使用https域名进行资源管理
  159. UseHTTPS: true,
  160. }
  161. // 指定空间所在的区域,如果不指定将自动探测
  162. // 如果没有特殊需求,默认不需要指定
  163. //cfg.Region=&storage.ZoneHuabei
  164. bucketManager := storage.NewBucketManager(mac, &cfg)
  165. bucket := bucket0
  166. key := requestCoding.QiniuKey
  167. //
  168. err = bucketManager.Delete(bucket, key)
  169. if err != nil {
  170. fmt.Println(err)
  171. return err
  172. }
  173. return err
  174. }
  175. // DeleteQiniuFileAndRecord 从七牛云删除文件并且清除数据库记录
  176. func (s *ServiceFileQiniu) DeleteQiniuFileAndRecord(requestCoding request.FileQiniuRequest) (err error) {
  177. mac := qbox.NewMac(accessKey, secretKey)
  178. cfg := storage.Config{
  179. // 是否使用https域名进行资源管理
  180. UseHTTPS: true,
  181. }
  182. // 指定空间所在的区域,如果不指定将自动探测
  183. // 如果没有特殊需求,默认不需要指定
  184. //cfg.Region=&storage.ZoneHuabei
  185. bucketManager := storage.NewBucketManager(mac, &cfg)
  186. bucket := bucket0
  187. key := requestCoding.QiniuKey
  188. //
  189. err = bucketManager.Delete(bucket, key)
  190. if err != nil {
  191. fmt.Println(err)
  192. return err
  193. }
  194. err = global.GVA_DB.Delete(&fileManager.FileQiniu{}, "id = ?", requestCoding.Id).Error
  195. return err
  196. }
  197. // RenameQiniuFileAndRecord 重命名七牛云文件和数据库记录
  198. func (s *ServiceFileQiniu) RenameQiniuFileAndRecord(requestCoding request.FileQiniuRequest) (err error) {
  199. file := fileManager.FileQiniu{}
  200. if errors.Is(global.GVA_DB.Where("id = ?", requestCoding.Id).First(&file).Error, gorm.ErrRecordNotFound) {
  201. return errors.New("数据库中未找到该记录")
  202. }
  203. mac := qbox.NewMac(accessKey, secretKey)
  204. cfg := storage.Config{
  205. // 是否使用https域名进行资源管理
  206. UseHTTPS: true,
  207. }
  208. bucketManager := storage.NewBucketManager(mac, &cfg)
  209. bucket := bucket0
  210. srcKey := requestCoding.QiniuKey
  211. //处理字段
  212. s2 := file.QiniuKey[0:strings.Index(file.QiniuKey, file.FileName)]
  213. //global.GVA_LOG.Info(s2)
  214. destKey := s2 + requestCoding.FileNameNew
  215. //如果目标文件存在,是否强制覆盖,如果不覆盖,默认返回614 file exists
  216. err = bucketManager.Move(bucket, srcKey, bucket, destKey, false)
  217. if err != nil {
  218. return err
  219. }
  220. s3 := file.QiniuAddress[0:strings.Index(file.QiniuAddress, file.FileName)]
  221. file.QiniuAddress = s3 + requestCoding.FileNameNew
  222. file.FileName = requestCoding.FileNameNew
  223. file.QiniuKey = destKey
  224. err = global.GVA_DB.Save(file).Error
  225. return err
  226. }
  227. // UpdateMirrorPushPolicy 修改镜像更新策略
  228. func (s *ServiceFileQiniu) UpdateMirrorPushPolicy(requestCoding request.FileQiniuRequest) (err error) {
  229. file := fileManager.FileQiniu{}
  230. if errors.Is(global.GVA_DB.Where("id = ?", requestCoding.Id).First(&file).Error, gorm.ErrRecordNotFound) {
  231. return errors.New("数据库中未找到该记录")
  232. }
  233. file.PushPolicy = requestCoding.PushPolicy
  234. file.PushTime = requestCoding.PushTime
  235. err = global.GVA_DB.Save(file).Error
  236. return err
  237. }