package notice import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "encoding/json" "github.com/patrickmn/go-cache" "time" ) var noticeCache = cache.New(2*time.Minute, 1*time.Minute) const ( NOTICE_CACHE_KEY = "notice" ) type Notice struct { Title string Link string Visible int //0 invisible, 1 visible } type NoticeResponse struct { Notices []*Notice CommitId string } var lock int32 = 0 func GetNewestNotice() (*NoticeResponse, error) { defer func() { if err := recover(); err != nil { log.Error("recover error", err) } }() var notice *NoticeResponse var err error if setting.CacheOn { notice, err = getNewestNoticesFromCacheAndDisk() } else { notice, err = getNewestNoticesFromDisk() } if err != nil { return nil, err } return notice, nil } func getNoticeTimeout() time.Duration { return time.Duration(setting.CacheTimeOutSecond) * time.Second } func getNewestNoticesFromDisk() (*NoticeResponse, error) { log.Debug("Get notice from disk") repo, err := models.GetRepositoryByOwnerAndAlias(setting.UserNameOfNoticeRepo, setting.RepoNameOfNoticeRepo) if err != nil { log.Error("get notice repo failed, error=%v", err) return nil, err } repoFile, err := models.ReadLatestFileInRepo(repo.OwnerName, repo.Name, setting.RefNameOfNoticeRepo, setting.TreePathOfNoticeRepo) if err != nil { log.Error("GetNewestNotice failed, error=%v", err) return nil, err } res := &NoticeResponse{} json.Unmarshal(repoFile.Content, res) if res == nil || len(res.Notices) == 0 { return nil, err } res.CommitId = repoFile.CommitId return res, nil } func getNewestNoticesFromCacheAndDisk() (*NoticeResponse, error) { v, success := noticeCache.Get(NOTICE_CACHE_KEY) if success { log.Debug("Get notice from cache,value = %v", v) if v == nil { return nil, nil } n := v.(*NoticeResponse) return n, nil } notice, err := getNewestNoticesFromDisk() if err != nil { log.Error("GetNewestNotice failed, error=%v", err) noticeCache.Set(NOTICE_CACHE_KEY, nil, 30*time.Second) return nil, err } noticeCache.Set(NOTICE_CACHE_KEY, notice, getNoticeTimeout()) return notice, nil }