version.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. }
  32. func (service *VersionCheckService) Check() (*version.Version, error) {
  33. return task.VersionTask.Check(service.Version, service.Channel), nil
  34. }
  35. type VersionShowService struct {
  36. CondPage
  37. Channel string `form:"channel" json:"channel"`
  38. }
  39. func (service *VersionShowService) List() ([]version.Version, error) {
  40. versions := make([]version.Version, 0)
  41. var queryDoc = bson.M{}
  42. if service.Channel != "" {
  43. queryDoc["channel"] = service.Channel
  44. }
  45. err := mgm.Coll(&version.Version{}).SimpleFind(&versions, queryDoc)
  46. return versions, err
  47. }
  48. type VersionCreateService struct {
  49. Channel string `json:"channel" binding:"required"`
  50. Version string `json:"version" binding:"required"`
  51. Name string `json:"name" binding:"required"`
  52. CDN string `json:"cdn" binding:"required"`
  53. Url string `json:"url" binding:"required"`
  54. }
  55. func (service *VersionCreateService) Create() error {
  56. version := new(version.Version)
  57. version.Channel = service.Channel
  58. version.Name = service.Name
  59. version.Version = service.Version
  60. version.CDN = service.CDN
  61. version.Url = service.Url
  62. return mgm.Coll(version).Create(version)
  63. }
  64. type VersionEditService struct {
  65. Id string `json:"id" binding:"required"`
  66. Channel *string `json:"channel"`
  67. Version *string `json:"version"`
  68. Name *string `json:"name"`
  69. CDN *string `json:"cdn"`
  70. Url *string `json:"url"`
  71. Default *bool `json:"default"`
  72. }
  73. func (service *VersionEditService) Edit() error {
  74. version := new(version.Version)
  75. objectId, _ := primitive.ObjectIDFromHex(service.Id)
  76. filterDoc := bson.M{"_id": objectId}
  77. updateDoc := bson.M{}
  78. if service.Channel != nil {
  79. updateDoc["channel"] = service.Channel
  80. }
  81. if service.Name != nil {
  82. updateDoc["name"] = service.Name
  83. }
  84. if service.Version != nil {
  85. updateDoc["version"] = service.Version
  86. }
  87. if service.CDN != nil {
  88. updateDoc["cdn"] = service.CDN
  89. }
  90. if service.Url != nil {
  91. updateDoc["url"] = service.Url
  92. }
  93. if service.Default != nil {
  94. updateDoc["default"] = service.Default
  95. }
  96. _, err := mgm.Coll(version).UpdateOne(context.Background(), filterDoc, bson.M{"$set": updateDoc})
  97. return err
  98. }
  99. type VersionProdService struct {
  100. Id string `json:"id" binding:"required"`
  101. IsProd bool `json:"isProd"`
  102. }
  103. func (service *VersionProdService) Update() error {
  104. objectId, err := primitive.ObjectIDFromHex(service.Id)
  105. if err != nil {
  106. return err
  107. }
  108. coll := mgm.Coll(&version.Version{})
  109. var current version.Version
  110. if err := coll.FindByID(objectId, &current); err != nil {
  111. return err
  112. }
  113. if service.IsProd {
  114. if _, err := coll.UpdateMany(
  115. context.Background(),
  116. bson.M{"_id": bson.M{"$ne": objectId}},
  117. bson.M{"$set": bson.M{"isProd": false}},
  118. ); err != nil {
  119. return err
  120. }
  121. }
  122. _, err = coll.UpdateOne(
  123. context.Background(),
  124. bson.M{"_id": objectId},
  125. bson.M{"$set": bson.M{"isProd": service.IsProd}},
  126. )
  127. return err
  128. }
  129. type VersionExternalConfigService struct {
  130. Channel string `form:"channel" json:"channel" binding:"required"`
  131. Version string `form:"version" json:"version" binding:"required"`
  132. AbVer *string `form:"abVer" json:"abVer"`
  133. MD5 *string `form:"md5" json:"md5"`
  134. TimeSec int64 `form:"timesec" json:"timesec" binding:"required"`
  135. Sign string `form:"sign" json:"sign" binding:"required"`
  136. }
  137. func (service *VersionExternalConfigService) Save() error {
  138. if service.AbVer == nil && service.MD5 == nil {
  139. return errors.New("abVer or md5 is required")
  140. }
  141. filterDoc := bson.M{
  142. "channel": service.Channel,
  143. "version": service.Version,
  144. }
  145. coll := mgm.Coll(&version.Version{})
  146. var current version.Version
  147. if err := coll.First(filterDoc, &current); err != nil {
  148. return errors.New("version not found")
  149. }
  150. if current.IsProd {
  151. return errors.New("production version does not allow external upload")
  152. }
  153. updateDoc := bson.M{}
  154. if service.AbVer != nil {
  155. updateDoc["abVer"] = *service.AbVer
  156. }
  157. if service.MD5 != nil {
  158. updateDoc["md5"] = *service.MD5
  159. }
  160. _, err := coll.UpdateOne(
  161. context.Background(),
  162. bson.M{"_id": current.ID},
  163. bson.M{"$set": updateDoc},
  164. )
  165. return err
  166. }
  167. func (service *VersionExternalConfigService) ValidateAuth() error {
  168. deltaTime := time.Now().Unix() - service.TimeSec
  169. if deltaTime < 0 {
  170. deltaTime = -deltaTime
  171. }
  172. if deltaTime > versionExternalReqTimeoutSec {
  173. return fmt.Errorf("timesec timeout")
  174. }
  175. params := map[string]any{
  176. "channel": service.Channel,
  177. "version": service.Version,
  178. "timesec": strconv.FormatInt(service.TimeSec, 10),
  179. }
  180. if service.AbVer != nil {
  181. params["abVer"] = *service.AbVer
  182. }
  183. if service.MD5 != nil {
  184. params["md5"] = *service.MD5
  185. }
  186. sign := tool.GenSign(params)
  187. if sign != service.Sign {
  188. return fmt.Errorf("sign error")
  189. }
  190. return nil
  191. }
  192. type VersionDeleteService struct {
  193. Id string `json:"id" binding:"required"`
  194. }
  195. func (service *VersionDeleteService) Delete() error {
  196. version := new(version.Version)
  197. objectId, _ := primitive.ObjectIDFromHex(service.Id)
  198. filterDoc := bson.M{"_id": objectId}
  199. _, err := mgm.Coll(version).DeleteOne(context.Background(), filterDoc)
  200. return err
  201. }