易云轻量版服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
6.2 KiB

  1. package handler
  2. import (
  3. "bytes"
  4. "crypto/md5"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "io/ioutil"
  9. "locking-kit-server/consts"
  10. "locking-kit-server/db"
  11. "locking-kit-server/env"
  12. "locking-kit-server/utils"
  13. "log"
  14. "net/http"
  15. "os"
  16. "path/filepath"
  17. "strings"
  18. )
  19. /**
  20. * @author yuanrh
  21. * @description http服务核心逻辑
  22. * @date 2021/6/28 11:11
  23. **/
  24. //@title 同步文件夹至工作空间
  25. //@param ids 项目id,逗号分隔
  26. func SyncFolderToWorkSpace(w http.ResponseWriter, r *http.Request){
  27. //参数解析
  28. defer r.Body.Close()
  29. data := r.URL.Query()
  30. ids := strings.Split(data.Get("ids"),",")
  31. if len(ids) == 0{
  32. fmt.Fprintln(w, utils.BuildFail("ids为必填参数"))
  33. return
  34. }
  35. //遍历文件夹
  36. for _, id := range ids {
  37. //查询文件列表
  38. task,err := postQueryArchiveListByProjectId(id)
  39. if err !=nil{
  40. fmt.Fprintln(w, utils.BuildFail("同步失败!"))
  41. return
  42. }
  43. //添加同步任务
  44. err = batchInsertTask(task)
  45. if err !=nil{
  46. fmt.Fprintln(w, utils.BuildFail("同步失败!"))
  47. return
  48. }
  49. }
  50. fmt.Fprintln(w, utils.BuildSuccess())
  51. }
  52. //批量插入同步任务
  53. func batchInsertTask(task []interface{}) error{
  54. for _, archiveObj := range task {
  55. //key=userId:TASK_SYNC_STATUS_WAIT:taskId
  56. taskId := utils.GeneraatorId()
  57. addAttribute(archiveObj.(map[string] interface{}), taskId, consts.TASK_SYNC_STATUS_WAIT, 0)
  58. archiveByte,err := json.Marshal(archiveObj)
  59. if err !=nil{
  60. return err
  61. }
  62. // key -> /userid/TASK_SYNC/417367746536689664
  63. key := fmt.Sprintf("/%v%v%v",env.CurrentUserPhone, consts.ETCD_DIRECTOR_TASK_SYNC,taskId)
  64. err = db.ReplaceInto(key,string(archiveByte))
  65. if err !=nil{
  66. return err
  67. }
  68. //添加到下载队列
  69. TaskToDownloadChanel <- archiveObj.(map[string] interface{})
  70. }
  71. return nil
  72. }
  73. func addAttribute(archiveObj map[string] interface{}, taskId int64, taskSyncStatus string, progress float64){
  74. archiveObj[consts.TASK_ID] = taskId
  75. archiveObj[consts.TASK_SYNC_STATUS] = taskSyncStatus
  76. archiveObj[consts.TASK_SYNC_PROGRESS] = progress
  77. }
  78. //@title 文件/文件夹下载
  79. //@param filePath 文件/文件夹路径
  80. func DownloadFile(w http.ResponseWriter, r *http.Request){
  81. //参数解析
  82. defer r.Body.Close()
  83. data := r.URL.Query()
  84. filePath := data.Get("filePath")
  85. if len(filePath) == 0{
  86. fmt.Fprintln(w, utils.BuildFail("filePath为必填参数"))
  87. return
  88. }
  89. var task []interface{}
  90. var err error
  91. fileInfo,err := os.Stat(filePath)
  92. if err != nil{
  93. fmt.Fprintln(w, utils.BuildFail("filePath参数无效"))
  94. return
  95. }
  96. absFilePath := strings.Replace(filePath, env.WorkSpace, "", 1)
  97. blocks := strings.Split(absFilePath, string(os.PathSeparator))
  98. projectName := blocks[1]
  99. folderName := blocks[2]
  100. if fileInfo.IsDir() {
  101. relativePath := strings.Replace(absFilePath, blocks[0]+string(os.PathSeparator)+projectName+string(os.PathSeparator)+folderName, "", 1)
  102. task, err = postQueryArchiveListByCondition(projectName, folderName, "", "", relativePath)
  103. }else{
  104. extension := strings.Replace(filepath.Ext(filePath), ".", "", 1)
  105. archName := strings.Replace(filepath.Base(filePath), filepath.Ext(filePath), "", 1)
  106. relativePath := strings.Replace(absFilePath, projectName+string(os.PathSeparator)+folderName, "", 1)
  107. relativePath = strings.Replace(relativePath, filepath.Base(filePath), "", 1)
  108. task, err = postQueryArchiveListByCondition(projectName, folderName, archName, extension, filepath.Clean(relativePath))
  109. }
  110. if err != nil{
  111. log.Printf("文件列表查询失败,%v", err)
  112. fmt.Fprintln(w, utils.BuildFail("同步失败!"))
  113. return
  114. }
  115. //添加同步任务
  116. err = batchInsertTask(task)
  117. if err !=nil{
  118. fmt.Fprintln(w, utils.BuildFail("同步失败!"))
  119. return
  120. }
  121. fmt.Fprintln(w, utils.BuildSuccess())
  122. }
  123. //根据项目Id查询所有文件列表
  124. func postQueryArchiveListByProjectId(id string)(data []interface{},err error){
  125. url:=consts.SERVER_IP_PORT+"/api/pms/sdk/queryArchiveListByProjectId"
  126. var param struct{Id string; Digest string}
  127. param.Id = id
  128. //摘要
  129. text:=fmt.Sprintf("%v",param.Id)
  130. textByte := []byte(text)
  131. md5Byte := md5.Sum(textByte)
  132. digest := fmt.Sprintf("%x", md5Byte)
  133. param.Digest=digest
  134. jsonData,err :=json.Marshal(param)
  135. if err!=nil{
  136. log.Printf("json序列化化错误!")
  137. return nil,err
  138. }
  139. resp, err := http.Post(url, consts.CONTENT_TYPE, bytes.NewReader(jsonData))
  140. if err != nil {
  141. log.Printf("post failed, err:%v\n", err)
  142. return nil,err
  143. }
  144. defer resp.Body.Close()
  145. b, err := ioutil.ReadAll(resp.Body)
  146. if err != nil {
  147. log.Printf("get resp failed,err:%v\n", err)
  148. return nil,err
  149. }
  150. returnValue := make(map[string] interface{})
  151. err=json.Unmarshal(b,&returnValue)
  152. if err!=nil{
  153. log.Printf("字符串%v反序列化出错", string(b[:]))
  154. }
  155. //成功
  156. if returnValue["Code"].(float64)==0{
  157. return returnValue["Data"].([] interface{}),nil
  158. }
  159. //失败
  160. return nil,errors.New(returnValue["Msg"].(string))
  161. }
  162. //根据条件查询所有文件列表
  163. func postQueryArchiveListByCondition( projectName, folderName, archName, extension, relativePath string)(data []interface{},err error){
  164. url:=consts.SERVER_IP_PORT+"/api/pms/sdk/queryArchiveListByCondition"
  165. var param struct{ ProjectName, FolderName, ArchName, Extension, RelativePath, Digest string}
  166. param.ProjectName = projectName
  167. param.FolderName = folderName
  168. param.ArchName = archName
  169. param.Extension = extension
  170. param.RelativePath = relativePath
  171. //摘要
  172. text:=fmt.Sprintf("%v|%v|%v|%v|%v", param.ProjectName, param.FolderName, param.ArchName, param.Extension, param.RelativePath)
  173. textByte := []byte(text)
  174. md5Byte := md5.Sum(textByte)
  175. digest := fmt.Sprintf("%x", md5Byte)
  176. param.Digest=digest
  177. jsonData,err :=json.Marshal(param)
  178. if err!=nil{
  179. log.Printf("json序列化化错误!")
  180. return nil,err
  181. }
  182. resp, err := http.Post(url, consts.CONTENT_TYPE, bytes.NewReader(jsonData))
  183. if err != nil {
  184. log.Printf("post failed, err:%v\n", err)
  185. return nil,err
  186. }
  187. defer resp.Body.Close()
  188. b, err := ioutil.ReadAll(resp.Body)
  189. if err != nil {
  190. log.Printf("get resp failed,err:%v\n", err)
  191. return nil,err
  192. }
  193. returnValue := make(map[string] interface{})
  194. err=json.Unmarshal(b,&returnValue)
  195. if err!=nil{
  196. log.Printf("字符串%v反序列化出错", string(b[:]))
  197. }
  198. //成功
  199. if returnValue["Code"].(float64)==0{
  200. return returnValue["Data"].([] interface{}),nil
  201. }
  202. //失败
  203. return nil,errors.New(returnValue["Msg"].(string))
  204. }