version.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package service
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "strconv"
  7. "time"
  8. "dsbqj-admin/app/task"
  9. "dsbqj-admin/model/mongo/version"
  10. "dsbqj-admin/tool"
  11. "github.com/kamva/mgm/v3"
  12. "go.mongodb.org/mongo-driver/bson"
  13. "go.mongodb.org/mongo-driver/bson/primitive"
  14. )
  15. const versionExternalReqTimeoutSec = 30 * 60
  16. type VersionReloadService struct {
  17. }
  18. func (service *VersionReloadService) Reload() error {
  19. task.VersionTask.Exec()
  20. return nil
  21. }
  22. type VersionServerService struct {
  23. Channel string `json:"channel" binding:"required"`
  24. }
  25. func (service *VersionServerService) Servers() ([]*version.Version, error) {
  26. return task.VersionTask.Servers(service.Channel), nil
  27. }
  28. type VersionCheckService struct {
  29. Version string `json:"version" binding:"required"`
  30. Channel string `json:"channel" binding:"required"`
  31. EnvVersion string `json:"envVersion"`
  32. }
  33. func (service *VersionCheckService) Check() (*version.Version, error) {
  34. return task.VersionTask.Check(service.Version, service.Channel, service.EnvVersion), nil
  35. }
  36. type VersionShowService struct {
  37. CondPage
  38. Channel string `form:"channel" json:"channel"`
  39. EnvVersion string `form:"envVersion" json:"envVersion"`
  40. }
  41. func (service *VersionShowService) List() ([]version.Version, error) {
  42. versions := make([]version.Version, 0)
  43. var queryDoc = bson.M{}
  44. if service.Channel != "" {
  45. queryDoc["channel"] = service.Channel
  46. }
  47. if service.EnvVersion != "" {
  48. envVersion := task.NormalizeEnvVersion(service.EnvVersion)
  49. if envVersion == "release" {
  50. queryDoc["$or"] = []bson.M{
  51. {"envVersion": envVersion},
  52. {"envVersion": ""},
  53. {"envVersion": bson.M{"$exists": false}},
  54. }
  55. } else {
  56. queryDoc["envVersion"] = envVersion
  57. }
  58. }
  59. err := mgm.Coll(&version.Version{}).SimpleFind(&versions, queryDoc)
  60. return versions, err
  61. }
  62. type VersionCreateService struct {
  63. Channel string `json:"channel" binding:"required"`
  64. EnvVersion string `json:"envVersion"`
  65. Version string `json:"version" binding:"required"`
  66. Name string `json:"name" binding:"required"`
  67. CDN string `json:"cdn" binding:"required"`
  68. Url string `json:"url" binding:"required"`
  69. }
  70. func (service *VersionCreateService) Create() error {
  71. version := new(version.Version)
  72. version.Channel = service.Channel
  73. version.EnvVersion = task.NormalizeEnvVersion(service.EnvVersion)
  74. version.Name = service.Name
  75. version.Version = service.Version
  76. version.CDN = service.CDN
  77. version.Url = service.Url
  78. return mgm.Coll(version).Create(version)
  79. }
  80. type VersionEditService struct {
  81. Id string `json:"id" binding:"required"`
  82. Channel *string `json:"channel"`
  83. EnvVersion *string `json:"envVersion"`
  84. Version *string `json:"version"`
  85. Name *string `json:"name"`
  86. CDN *string `json:"cdn"`
  87. Url *string `json:"url"`
  88. Default *bool `json:"default"`
  89. }
  90. func (service *VersionEditService) Edit() error {
  91. version := new(version.Version)
  92. objectId, _ := primitive.ObjectIDFromHex(service.Id)
  93. filterDoc := bson.M{"_id": objectId}
  94. updateDoc := bson.M{}
  95. if service.Channel != nil {
  96. updateDoc["channel"] = service.Channel
  97. }
  98. if service.EnvVersion != nil {
  99. updateDoc["envVersion"] = task.NormalizeEnvVersion(*service.EnvVersion)
  100. }
  101. if service.Name != nil {
  102. updateDoc["name"] = service.Name
  103. }
  104. if service.Version != nil {
  105. updateDoc["version"] = service.Version
  106. }
  107. if service.CDN != nil {
  108. updateDoc["cdn"] = service.CDN
  109. }
  110. if service.Url != nil {
  111. updateDoc["url"] = service.Url
  112. }
  113. if service.Default != nil {
  114. updateDoc["default"] = service.Default
  115. }
  116. _, err := mgm.Coll(version).UpdateOne(context.Background(), filterDoc, bson.M{"$set": updateDoc})
  117. return err
  118. }
  119. type VersionProdService struct {
  120. Id string `json:"id" binding:"required"`
  121. IsProd bool `json:"isProd"`
  122. }
  123. func (service *VersionProdService) Update() error {
  124. objectId, err := primitive.ObjectIDFromHex(service.Id)
  125. if err != nil {
  126. return err
  127. }
  128. coll := mgm.Coll(&version.Version{})
  129. var current version.Version
  130. if err := coll.FindByID(objectId, &current); err != nil {
  131. return err
  132. }
  133. if service.IsProd {
  134. if _, err := coll.UpdateMany(
  135. context.Background(),
  136. bson.M{"_id": bson.M{"$ne": objectId}},
  137. bson.M{"$set": bson.M{"isProd": false}},
  138. ); err != nil {
  139. return err
  140. }
  141. }
  142. _, err = coll.UpdateOne(
  143. context.Background(),
  144. bson.M{"_id": objectId},
  145. bson.M{"$set": bson.M{"isProd": service.IsProd}},
  146. )
  147. return err
  148. }
  149. type VersionExternalConfigService struct {
  150. Channel string `form:"channel" json:"channel" binding:"required"`
  151. Version string `form:"version" json:"version" binding:"required"`
  152. AbVer *string `form:"abVer" json:"abVer"`
  153. MD5 *string `form:"md5" json:"md5"`
  154. TimeSec int64 `form:"timesec" json:"timesec" binding:"required"`
  155. Sign string `form:"sign" json:"sign" binding:"required"`
  156. }
  157. func (service *VersionExternalConfigService) Save() error {
  158. if service.AbVer == nil && service.MD5 == nil {
  159. return errors.New("abVer or md5 is required")
  160. }
  161. filterDoc := bson.M{
  162. "channel": service.Channel,
  163. "version": service.Version,
  164. }
  165. coll := mgm.Coll(&version.Version{})
  166. var current version.Version
  167. if err := coll.First(filterDoc, &current); err != nil {
  168. return errors.New("version not found")
  169. }
  170. if current.IsProd {
  171. return errors.New("production version does not allow external upload")
  172. }
  173. updateDoc := bson.M{}
  174. if service.AbVer != nil {
  175. updateDoc["abVer"] = *service.AbVer
  176. }
  177. if service.MD5 != nil {
  178. updateDoc["md5"] = *service.MD5
  179. }
  180. _, err := coll.UpdateOne(
  181. context.Background(),
  182. bson.M{"_id": current.ID},
  183. bson.M{"$set": updateDoc},
  184. )
  185. return err
  186. }
  187. func (service *VersionExternalConfigService) ValidateAuth() error {
  188. deltaTime := time.Now().Unix() - service.TimeSec
  189. if deltaTime < 0 {
  190. deltaTime = -deltaTime
  191. }
  192. if deltaTime > versionExternalReqTimeoutSec {
  193. return fmt.Errorf("timesec timeout")
  194. }
  195. params := map[string]any{
  196. "channel": service.Channel,
  197. "version": service.Version,
  198. "timesec": strconv.FormatInt(service.TimeSec, 10),
  199. }
  200. if service.AbVer != nil {
  201. params["abVer"] = *service.AbVer
  202. }
  203. if service.MD5 != nil {
  204. params["md5"] = *service.MD5
  205. }
  206. sign := tool.GenSign(params)
  207. if sign != service.Sign {
  208. return fmt.Errorf("sign error")
  209. }
  210. return nil
  211. }
  212. type VersionDeleteService struct {
  213. Id string `json:"id" binding:"required"`
  214. }
  215. func (service *VersionDeleteService) Delete() error {
  216. version := new(version.Version)
  217. objectId, _ := primitive.ObjectIDFromHex(service.Id)
  218. filterDoc := bson.M{"_id": objectId}
  219. _, err := mgm.Coll(version).DeleteOne(context.Background(), filterDoc)
  220. return err
  221. }