version.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package task
  2. import (
  3. "dsbqj-admin/model/mongo/version"
  4. "dsbqj-admin/pkg/util"
  5. "strings"
  6. "sync"
  7. "github.com/kamva/mgm/v3"
  8. "go.mongodb.org/mongo-driver/bson"
  9. )
  10. const (
  11. releaseEnvVersion = "release"
  12. trialEnvVersion = "trial"
  13. )
  14. var VersionTask *Versions
  15. type Versions struct {
  16. sync.Mutex
  17. VChannels util.SafeMap[string, *ChannelVersions]
  18. }
  19. type ChannelVersions struct {
  20. VList util.SafeArray[*version.Version]
  21. VMap util.SafeMap[string, *version.Version]
  22. }
  23. func NormalizeEnvVersion(envVersion string) string {
  24. if strings.EqualFold(strings.TrimSpace(envVersion), trialEnvVersion) {
  25. return trialEnvVersion
  26. }
  27. return releaseEnvVersion
  28. }
  29. func VersionInit() *Versions {
  30. VersionTask = new(Versions)
  31. return VersionTask
  32. }
  33. func (this *Versions) Exec() {
  34. var versions = make([]*version.Version, 0)
  35. err := mgm.Coll(&version.Version{}).SimpleFind(&versions, bson.M{})
  36. if err == nil {
  37. this.VChannels.Clear()
  38. for _, v := range versions {
  39. if _, ok := this.VChannels.Get(v.Channel); !ok {
  40. this.VChannels.Set(v.Channel, new(ChannelVersions))
  41. }
  42. channelVersion, _ := this.VChannels.Get(v.Channel)
  43. channelVersion.VList.Push(v)
  44. channelVersion.VMap.Set(versionMapKey(v.Version, NormalizeEnvVersion(v.EnvVersion)), v)
  45. }
  46. }
  47. }
  48. func (this *Versions) Check(version string, channel string, envVersion string) *version.Version {
  49. envVersionRequired := strings.TrimSpace(envVersion) != ""
  50. envVersion = NormalizeEnvVersion(envVersion)
  51. channelVersions, ok := this.VChannels.Get(channel)
  52. if !ok { // 遍历列表
  53. return nil
  54. }
  55. if envVersionRequired {
  56. if data := this.defaultVersion(channelVersions, channel, envVersion); data != nil {
  57. return data
  58. }
  59. if data, ok := channelVersions.VMap.Get(versionMapKey(version, envVersion)); ok {
  60. return data
  61. }
  62. return nil
  63. }
  64. if data := this.version(channelVersions, channel, version); data != nil {
  65. return data
  66. }
  67. return this.defaultVersion(channelVersions, channel, envVersion)
  68. }
  69. func (this *Versions) version(channelVersions *ChannelVersions, channel string, version string) *version.Version {
  70. for _, v := range channelVersions.VList.View() {
  71. if v.Channel == channel && v.Version == version {
  72. return v
  73. }
  74. }
  75. return nil
  76. }
  77. func (this *Versions) defaultVersion(channelVersions *ChannelVersions, channel string, envVersion string) *version.Version {
  78. for _, v := range channelVersions.VList.View() {
  79. if v.Default && v.Channel == channel && NormalizeEnvVersion(v.EnvVersion) == envVersion {
  80. return v
  81. }
  82. }
  83. return nil
  84. }
  85. func versionMapKey(version string, envVersion string) string {
  86. return envVersion + ":" + version
  87. }
  88. func (this *Versions) Servers(channel string) []*version.Version {
  89. var res = make([]*version.Version, 0)
  90. if channelVersions, ok := this.VChannels.Get(channel); ok {
  91. for _, v := range channelVersions.VList.View() {
  92. if v.Channel == channel {
  93. res = append(res, v)
  94. }
  95. }
  96. }
  97. return res
  98. }