Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package system
  4. import (
  5. "context"
  6. "fmt"
  7. "time"
  8. "code.gitea.io/gitea/models/db"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/storage"
  11. "code.gitea.io/gitea/modules/timeutil"
  12. "code.gitea.io/gitea/modules/util"
  13. )
  14. // NoticeType describes the notice type
  15. type NoticeType int
  16. const (
  17. // NoticeRepository type
  18. NoticeRepository NoticeType = iota + 1
  19. // NoticeTask type
  20. NoticeTask
  21. )
  22. // Notice represents a system notice for admin.
  23. type Notice struct {
  24. ID int64 `xorm:"pk autoincr"`
  25. Type NoticeType
  26. Description string `xorm:"TEXT"`
  27. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  28. }
  29. func init() {
  30. db.RegisterModel(new(Notice))
  31. }
  32. // TrStr returns a translation format string.
  33. func (n *Notice) TrStr() string {
  34. return fmt.Sprintf("admin.notices.type_%d", n.Type)
  35. }
  36. // CreateNotice creates new system notice.
  37. func CreateNotice(ctx context.Context, tp NoticeType, desc string, args ...any) error {
  38. if len(args) > 0 {
  39. desc = fmt.Sprintf(desc, args...)
  40. }
  41. n := &Notice{
  42. Type: tp,
  43. Description: desc,
  44. }
  45. return db.Insert(ctx, n)
  46. }
  47. // CreateRepositoryNotice creates new system notice with type NoticeRepository.
  48. func CreateRepositoryNotice(desc string, args ...any) error {
  49. // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
  50. return CreateNotice(db.DefaultContext, NoticeRepository, desc, args...)
  51. }
  52. // RemoveAllWithNotice removes all directories in given path and
  53. // creates a system notice when error occurs.
  54. func RemoveAllWithNotice(ctx context.Context, title, path string) {
  55. if err := util.RemoveAll(path); err != nil {
  56. desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
  57. log.Warn(title+" [%s]: %v", path, err)
  58. // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
  59. if err = CreateNotice(db.DefaultContext, NoticeRepository, desc); err != nil {
  60. log.Error("CreateRepositoryNotice: %v", err)
  61. }
  62. }
  63. }
  64. // RemoveStorageWithNotice removes a file from the storage and
  65. // creates a system notice when error occurs.
  66. func RemoveStorageWithNotice(ctx context.Context, bucket storage.ObjectStorage, title, path string) {
  67. if err := bucket.Delete(path); err != nil {
  68. desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
  69. log.Warn(title+" [%s]: %v", path, err)
  70. // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
  71. if err = CreateNotice(db.DefaultContext, NoticeRepository, desc); err != nil {
  72. log.Error("CreateRepositoryNotice: %v", err)
  73. }
  74. }
  75. }
  76. // CountNotices returns number of notices.
  77. func CountNotices() int64 {
  78. count, _ := db.GetEngine(db.DefaultContext).Count(new(Notice))
  79. return count
  80. }
  81. // Notices returns notices in given page.
  82. func Notices(ctx context.Context, page, pageSize int) ([]*Notice, error) {
  83. notices := make([]*Notice, 0, pageSize)
  84. return notices, db.GetEngine(ctx).
  85. Limit(pageSize, (page-1)*pageSize).
  86. Desc("created_unix").
  87. Find(&notices)
  88. }
  89. // DeleteNotice deletes a system notice by given ID.
  90. func DeleteNotice(ctx context.Context, id int64) error {
  91. _, err := db.GetEngine(ctx).ID(id).Delete(new(Notice))
  92. return err
  93. }
  94. // DeleteNotices deletes all notices with ID from start to end (inclusive).
  95. func DeleteNotices(ctx context.Context, start, end int64) error {
  96. if start == 0 && end == 0 {
  97. _, err := db.GetEngine(ctx).Exec("DELETE FROM notice")
  98. return err
  99. }
  100. sess := db.GetEngine(ctx).Where("id >= ?", start)
  101. if end > 0 {
  102. sess.And("id <= ?", end)
  103. }
  104. _, err := sess.Delete(new(Notice))
  105. return err
  106. }
  107. // DeleteNoticesByIDs deletes notices by given IDs.
  108. func DeleteNoticesByIDs(ctx context.Context, ids []int64) error {
  109. if len(ids) == 0 {
  110. return nil
  111. }
  112. _, err := db.GetEngine(ctx).
  113. In("id", ids).
  114. Delete(new(Notice))
  115. return err
  116. }
  117. // DeleteOldSystemNotices deletes all old system notices from database.
  118. func DeleteOldSystemNotices(ctx context.Context, olderThan time.Duration) (err error) {
  119. if olderThan <= 0 {
  120. return nil
  121. }
  122. _, err = db.GetEngine(ctx).Where("created_unix < ?", time.Now().Add(-olderThan).Unix()).Delete(&Notice{})
  123. return err
  124. }