You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

notice.go 2.2 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package notice
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/log"
  5. "code.gitea.io/gitea/modules/setting"
  6. "encoding/json"
  7. "github.com/patrickmn/go-cache"
  8. "time"
  9. )
  10. var noticeCache = cache.New(2*time.Minute, 1*time.Minute)
  11. const (
  12. NOTICE_CACHE_KEY = "notice"
  13. )
  14. type Notice struct {
  15. Title string
  16. Link string
  17. Visible int //0 invisible, 1 visible
  18. }
  19. type NoticeResponse struct {
  20. Notices []*Notice
  21. CommitId string
  22. }
  23. var lock int32 = 0
  24. func GetNewestNotice() (*NoticeResponse, error) {
  25. defer func() {
  26. if err := recover(); err != nil {
  27. log.Error("recover error", err)
  28. }
  29. }()
  30. var notice *NoticeResponse
  31. var err error
  32. if setting.CacheOn {
  33. notice, err = getNewestNoticesFromCacheAndDisk()
  34. } else {
  35. notice, err = getNewestNoticesFromDisk()
  36. }
  37. if err != nil {
  38. return nil, err
  39. }
  40. return notice, nil
  41. }
  42. func getNoticeTimeout() time.Duration {
  43. return time.Duration(setting.CacheTimeOutSecond) * time.Second
  44. }
  45. func getNewestNoticesFromDisk() (*NoticeResponse, error) {
  46. log.Debug("Get notice from disk")
  47. repo, err := models.GetRepositoryByOwnerAndAlias(setting.UserNameOfNoticeRepo, setting.RepoNameOfNoticeRepo)
  48. if err != nil {
  49. log.Error("get notice repo failed, error=%v", err)
  50. return nil, err
  51. }
  52. repoFile, err := models.ReadLatestFileInRepo(repo.OwnerName, repo.Name, setting.RefNameOfNoticeRepo, setting.TreePathOfNoticeRepo)
  53. if err != nil {
  54. log.Error("GetNewestNotice failed, error=%v", err)
  55. return nil, err
  56. }
  57. res := &NoticeResponse{}
  58. json.Unmarshal(repoFile.Content, res)
  59. if res == nil || len(res.Notices) == 0 {
  60. return nil, err
  61. }
  62. res.CommitId = repoFile.CommitId
  63. return res, nil
  64. }
  65. func getNewestNoticesFromCacheAndDisk() (*NoticeResponse, error) {
  66. v, success := noticeCache.Get(NOTICE_CACHE_KEY)
  67. if success {
  68. log.Debug("Get notice from cache,value = %v", v)
  69. if v == nil {
  70. return nil, nil
  71. }
  72. n := v.(*NoticeResponse)
  73. return n, nil
  74. }
  75. notice, err := getNewestNoticesFromDisk()
  76. if err != nil {
  77. log.Error("GetNewestNotice failed, error=%v", err)
  78. noticeCache.Set(NOTICE_CACHE_KEY, nil, 30*time.Second)
  79. return nil, err
  80. }
  81. noticeCache.Set(NOTICE_CACHE_KEY, notice, getNoticeTimeout())
  82. return notice, nil
  83. }