release.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package version
  2. import (
  3. "encoding/json"
  4. "io"
  5. "net/http"
  6. "time"
  7. "github.com/pkg/errors"
  8. )
  9. type ReleaseType string
  10. const (
  11. ReleaseTypeStable ReleaseType = "stable"
  12. ReleaseTypePrerelease ReleaseType = "prerelease"
  13. ReleaseTypeDev ReleaseType = "dev"
  14. )
  15. type TReleaseAsset struct {
  16. Name string `json:"name"`
  17. BrowserDownloadUrl string `json:"browser_download_url"`
  18. Size uint `json:"size"`
  19. }
  20. type TRelease struct {
  21. TagName string `json:"tag_name"`
  22. Name string `json:"name"`
  23. PublishedAt time.Time `json:"published_at"`
  24. Body string `json:"body"`
  25. Prerelease bool `json:"prerelease"`
  26. Type ReleaseType `json:"type"`
  27. Assets []TReleaseAsset `json:"assets"`
  28. }
  29. func (t *TRelease) GetAssetsMap() (m map[string]TReleaseAsset) {
  30. m = make(map[string]TReleaseAsset)
  31. for _, v := range t.Assets {
  32. m[v.Name] = v
  33. }
  34. return
  35. }
  36. func getLatestRelease() (data TRelease, err error) {
  37. resp, err := http.Get(GetGithubLatestReleaseAPIUrl())
  38. if err != nil {
  39. }
  40. body, err := io.ReadAll(resp.Body)
  41. if err != nil {
  42. err = errors.Wrap(err, "service.getLatestRelease io.ReadAll err")
  43. return
  44. }
  45. defer resp.Body.Close()
  46. if resp.StatusCode != 200 {
  47. err = errors.New(string(body))
  48. return
  49. }
  50. err = json.Unmarshal(body, &data)
  51. if err != nil {
  52. err = errors.Wrap(err, "service.getLatestRelease json.Unmarshal err")
  53. return
  54. }
  55. data.Type = ReleaseTypeStable
  56. return
  57. }
  58. func getLatestPrerelease() (data TRelease, err error) {
  59. resp, err := http.Get(GetGithubReleasesListAPIUrl())
  60. if err != nil {
  61. err = errors.Wrap(err, "service.getLatestPrerelease http.Get err")
  62. return
  63. }
  64. body, err := io.ReadAll(resp.Body)
  65. if err != nil {
  66. err = errors.Wrap(err, "service.getLatestPrerelease io.ReadAll err")
  67. return
  68. }
  69. defer resp.Body.Close()
  70. if resp.StatusCode != 200 {
  71. err = errors.New(string(body))
  72. return
  73. }
  74. var releaseList []TRelease
  75. err = json.Unmarshal(body, &releaseList)
  76. if err != nil {
  77. err = errors.Wrap(err, "service.getLatestPrerelease json.Unmarshal err")
  78. return
  79. }
  80. latestDate := time.Time{}
  81. for _, release := range releaseList {
  82. if release.Prerelease && release.PublishedAt.After(latestDate) {
  83. data = release
  84. latestDate = release.PublishedAt
  85. data.Type = ReleaseTypePrerelease
  86. }
  87. }
  88. return
  89. }
  90. func GetRelease(channel string) (data TRelease, err error) {
  91. stableRelease, err := getLatestRelease()
  92. if err != nil {
  93. return TRelease{}, err
  94. }
  95. switch ReleaseType(channel) {
  96. default:
  97. fallthrough
  98. case ReleaseTypeStable:
  99. return stableRelease, nil
  100. case ReleaseTypePrerelease:
  101. preRelease, err := getLatestPrerelease()
  102. if err != nil {
  103. return TRelease{}, err
  104. }
  105. // if preRelease is newer than stableRelease, return preRelease
  106. // otherwise return stableRelease
  107. if preRelease.PublishedAt.After(stableRelease.PublishedAt) {
  108. return preRelease, nil
  109. }
  110. return stableRelease, nil
  111. case ReleaseTypeDev:
  112. devRelease, err := getDevBuild()
  113. if err != nil {
  114. return TRelease{}, err
  115. }
  116. return devRelease, nil
  117. }
  118. }