version.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. envVersion = NormalizeEnvVersion(envVersion)
  53. platform = strings.TrimSpace(platform)
  54. if result := this.checkPlatform(platform, version, envVersion, envVersionRequired); result != nil {
  55. return result
  56. }
  57. // Historical records did not carry platform. They remain a read-only fallback
  58. // until data is migrated, and never override platform-specific records.
  59. if platform != "" {
  60. if result := this.checkPlatform("", version, envVersion, envVersionRequired); result != nil {
  61. return result
  62. }
  63. }
  64. candidates := []string{platform}
  65. if platform != "" {
  66. candidates = append(candidates, "")
  67. }
  68. for _, candidate := range candidates {
  69. if result := this.checkPlatform(candidate, version, releaseEnvVersion, true); result != nil {
  70. return result
  71. }
  72. if result := this.checkPlatform(candidate, "", releaseEnvVersion, true); result != nil {
  73. return result
  74. }
  75. }
  76. return nil
  77. }
  78. func (this *Versions) checkPlatform(platform, version, envVersion string, envVersionRequired bool) *version.Version {
  79. platformVersions, ok := this.VPlatforms.Get(strings.TrimSpace(platform))
  80. if !ok {
  81. return nil
  82. }
  83. if strings.TrimSpace(version) == "" {
  84. return this.defaultVersion(platformVersions, envVersion)
  85. }
  86. if envVersionRequired {
  87. if data, ok := platformVersions.VMap.Get(versionMapKey(version, envVersion)); ok {
  88. return data
  89. }
  90. return nil
  91. }
  92. if data, ok := platformVersions.VMap.Get(versionMapKey(version, releaseEnvVersion)); ok {
  93. return data
  94. }
  95. if data, ok := platformVersions.VMap.Get(versionMapKey(version, trialEnvVersion)); ok {
  96. return data
  97. }
  98. return nil
  99. }
  100. func (this *Versions) defaultVersion(platformVersions *PlatformVersions, envVersion string) *version.Version {
  101. var fallback *version.Version
  102. var selected *version.Version
  103. for _, v := range platformVersions.VList.View() {
  104. if NormalizeEnvVersion(v.EnvVersion) != envVersion {
  105. continue
  106. }
  107. if fallback == nil || CompareConfigVersion(v.Version, fallback.Version) > 0 {
  108. fallback = v
  109. }
  110. if v.Default && (selected == nil || CompareConfigVersion(v.Version, selected.Version) > 0) {
  111. selected = v
  112. }
  113. }
  114. if selected != nil {
  115. return selected
  116. }
  117. return fallback
  118. }
  119. func versionMapKey(version string, envVersion string) string {
  120. return envVersion + ":" + version
  121. }
  122. func (this *Versions) Servers(platform string) []*version.Version {
  123. var res = make([]*version.Version, 0)
  124. if platformVersions, ok := this.VPlatforms.Get(strings.TrimSpace(platform)); ok {
  125. res = append(res, platformVersions.VList.View()...)
  126. }
  127. if len(res) == 0 && strings.TrimSpace(platform) != "" {
  128. if legacyVersions, ok := this.VPlatforms.Get(""); ok {
  129. res = append(res, legacyVersions.VList.View()...)
  130. }
  131. }
  132. return res
  133. }