release.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. HTMLURL string `json:"html_url"`
  28. Assets []TReleaseAsset `json:"assets"`
  29. }
  30. func (t *TRelease) GetAssetsMap() (m map[string]TReleaseAsset) {
  31. m = make(map[string]TReleaseAsset)
  32. for _, v := range t.Assets {
  33. m[v.Name] = v
  34. }
  35. return
  36. }
  37. func getLatestRelease() (data TRelease, err error) {
  38. resp, err := http.Get(GetGithubLatestReleaseAPIUrl())
  39. if err != nil {
  40. err = errors.Wrap(err, "service.getLatestRelease http.Get err")
  41. return
  42. }
  43. body, err := io.ReadAll(resp.Body)
  44. if err != nil {
  45. err = errors.Wrap(err, "service.getLatestRelease io.ReadAll err")
  46. return
  47. }
  48. defer resp.Body.Close()
  49. if resp.StatusCode != 200 {
  50. err = errors.New(string(body))
  51. return
  52. }
  53. err = json.Unmarshal(body, &data)
  54. if err != nil {
  55. err = errors.Wrap(err, "service.getLatestRelease json.Unmarshal err")
  56. return
  57. }
  58. data.Type = ReleaseTypeStable
  59. return
  60. }
  61. func getLatestPrerelease() (data TRelease, err error) {
  62. resp, err := http.Get(GetGithubReleasesListAPIUrl())
  63. if err != nil {
  64. err = errors.Wrap(err, "service.getLatestPrerelease http.Get err")
  65. return
  66. }
  67. body, err := io.ReadAll(resp.Body)
  68. if err != nil {
  69. err = errors.Wrap(err, "service.getLatestPrerelease io.ReadAll err")
  70. return
  71. }
  72. defer resp.Body.Close()
  73. if resp.StatusCode != 200 {
  74. err = errors.New(string(body))
  75. return
  76. }
  77. var releaseList []TRelease
  78. err = json.Unmarshal(body, &releaseList)
  79. if err != nil {
  80. err = errors.Wrap(err, "service.getLatestPrerelease json.Unmarshal err")
  81. return
  82. }
  83. latestDate := time.Time{}
  84. for _, release := range releaseList {
  85. if release.Prerelease && release.PublishedAt.After(latestDate) {
  86. data = release
  87. latestDate = release.PublishedAt
  88. data.Type = ReleaseTypePrerelease
  89. }
  90. }
  91. return
  92. }
  93. func GetRelease(channel string) (data TRelease, err error) {
  94. stableRelease, err := getLatestRelease()
  95. if err != nil {
  96. return TRelease{}, err
  97. }
  98. switch ReleaseType(channel) {
  99. default:
  100. fallthrough
  101. case ReleaseTypeStable:
  102. return stableRelease, nil
  103. case ReleaseTypePrerelease:
  104. preRelease, err := getLatestPrerelease()
  105. if err != nil {
  106. return TRelease{}, err
  107. }
  108. // if preRelease is newer than stableRelease, return preRelease
  109. // otherwise return stableRelease
  110. if preRelease.PublishedAt.After(stableRelease.PublishedAt) {
  111. return preRelease, nil
  112. }
  113. return stableRelease, nil
  114. case ReleaseTypeDev:
  115. devRelease, err := getDevBuild()
  116. if err != nil {
  117. return TRelease{}, err
  118. }
  119. return devRelease, nil
  120. }
  121. }