version.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. VPlatforms util.SafeMap[string, *PlatformVersions]
  18. }
  19. type PlatformVersions 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. VersionConfigTask.Reload()
  35. var versions = make([]*version.Version, 0)
  36. err := mgm.Coll(&version.Version{}).SimpleFind(&versions, bson.M{})
  37. if err == nil {
  38. this.VPlatforms.Clear()
  39. for _, v := range versions {
  40. key := strings.TrimSpace(v.Platform)
  41. if _, ok := this.VPlatforms.Get(key); !ok {
  42. this.VPlatforms.Set(key, new(PlatformVersions))
  43. }
  44. platformVersions, _ := this.VPlatforms.Get(key)
  45. platformVersions.VList.Push(v)
  46. platformVersions.VMap.Set(versionMapKey(v.Version, NormalizeEnvVersion(v.EnvVersion)), v)
  47. }
  48. }
  49. }
  50. func (this *Versions) Check(version string, platform string, envVersion string) *version.Version {
  51. envVersionRequired := strings.TrimSpace(envVersion) != ""
  52. if strings.EqualFold(strings.TrimSpace(envVersion), "develop") {
  53. envVersion = trialEnvVersion
  54. }
  55. envVersion = NormalizeEnvVersion(envVersion)
  56. platform = strings.TrimSpace(platform)
  57. if result := this.checkPlatform(platform, version, envVersion, envVersionRequired); result != nil {
  58. return result
  59. }
  60. // Historical records did not carry platform. They remain a read-only fallback
  61. // until data is migrated, and never override platform-specific records.
  62. if platform != "" {
  63. if result := this.checkPlatform("", version, envVersion, envVersionRequired); result != nil {
  64. return result
  65. }
  66. }
  67. candidates := []string{platform}
  68. if platform != "" {
  69. candidates = append(candidates, "")
  70. }
  71. for _, candidate := range candidates {
  72. if result := this.checkPlatform(candidate, version, releaseEnvVersion, true); result != nil {
  73. return result
  74. }
  75. if result := this.checkPlatform(candidate, "", releaseEnvVersion, true); result != nil {
  76. return result
  77. }
  78. }
  79. return nil
  80. }
  81. func (this *Versions) checkPlatform(platform, version, envVersion string, envVersionRequired bool) *version.Version {
  82. platformVersions, ok := this.VPlatforms.Get(strings.TrimSpace(platform))
  83. if !ok {
  84. return nil
  85. }
  86. if strings.TrimSpace(version) == "" {
  87. return this.defaultVersion(platformVersions, envVersion)
  88. }
  89. if envVersionRequired {
  90. if data, ok := platformVersions.VMap.Get(versionMapKey(version, envVersion)); ok {
  91. return data
  92. }
  93. return this.defaultVersion(platformVersions, envVersion)
  94. }
  95. if data, ok := platformVersions.VMap.Get(versionMapKey(version, releaseEnvVersion)); ok {
  96. return data
  97. }
  98. if data, ok := platformVersions.VMap.Get(versionMapKey(version, trialEnvVersion)); ok {
  99. return data
  100. }
  101. return nil
  102. }
  103. func (this *Versions) defaultVersion(platformVersions *PlatformVersions, envVersion string) *version.Version {
  104. var fallback *version.Version
  105. var selected *version.Version
  106. for _, v := range platformVersions.VList.View() {
  107. if NormalizeEnvVersion(v.EnvVersion) != envVersion {
  108. continue
  109. }
  110. if fallback == nil || CompareConfigVersion(v.Version, fallback.Version) > 0 {
  111. fallback = v
  112. }
  113. if v.Default && (selected == nil || CompareConfigVersion(v.Version, selected.Version) > 0) {
  114. selected = v
  115. }
  116. }
  117. if selected != nil {
  118. return selected
  119. }
  120. return fallback
  121. }
  122. func versionMapKey(version string, envVersion string) string {
  123. return envVersion + ":" + version
  124. }
  125. func (this *Versions) Servers(platform string) []*version.Version {
  126. var res = make([]*version.Version, 0)
  127. if platformVersions, ok := this.VPlatforms.Get(strings.TrimSpace(platform)); ok {
  128. res = append(res, platformVersions.VList.View()...)
  129. }
  130. if len(res) == 0 && strings.TrimSpace(platform) != "" {
  131. if legacyVersions, ok := this.VPlatforms.Get(""); ok {
  132. res = append(res, legacyVersions.VList.View()...)
  133. }
  134. }
  135. return res
  136. }