gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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/graceful"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/storage"
  12. "code.gitea.io/gitea/modules/timeutil"
  13. "code.gitea.io/gitea/modules/util"
  14. )
  15. // NoticeType describes the notice type
  16. type NoticeType int
  17. const (
  18. // NoticeRepository type
  19. NoticeRepository NoticeType = iota + 1
  20. // NoticeTask type
  21. NoticeTask
  22. )
  23. // Notice represents a system notice for admin.
  24. type Notice struct {
  25. ID int64 `xorm:"pk autoincr"`
  26. Type NoticeType
  27. Description string `xorm:"LONGTEXT"`
  28. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  29. }
  30. func init() {
  31. db.RegisterModel(new(Notice))
  32. }
  33. // TrStr returns a translation format string.
  34. func (n *Notice) TrStr() string {
  35. return fmt.Sprintf("admin.notices.type_%d", n.Type)
  36. }
  37. // CreateNotice creates new system notice.
  38. func CreateNotice(ctx context.Context, tp NoticeType, desc string, args ...any) error {
  39. if len(args) > 0 {
  40. desc = fmt.Sprintf(desc, args...)
  41. }
  42. n := &Notice{
  43. Type: tp,
  44. Description: desc,
  45. }
  46. return db.Insert(ctx, n)
  47. }
  48. // CreateRepositoryNotice creates new system notice with type NoticeRepository.
  49. func CreateRepositoryNotice(desc string, args ...any) error {
  50. return CreateNotice(graceful.GetManager().ShutdownContext(), 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. if err = CreateNotice(graceful.GetManager().ShutdownContext(), NoticeRepository, desc); err != nil {
  59. log.Error("CreateRepositoryNotice: %v", err)
  60. }
  61. }
  62. }
  63. // RemoveStorageWithNotice removes a file from the storage and
  64. // creates a system notice when error occurs.
  65. func RemoveStorageWithNotice(ctx context.Context, bucket storage.ObjectStorage, title, path string) {
  66. if err := bucket.Delete(path); err != nil {
  67. desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
  68. log.Warn(title+" [%s]: %v", path, err)
  69. if err = CreateNotice(graceful.GetManager().ShutdownContext(), NoticeRepository, desc); err != nil {
  70. log.Error("CreateRepositoryNotice: %v", err)
  71. }
  72. }
  73. }
  74. // CountNotices returns number of notices.
  75. func CountNotices(ctx context.Context) int64 {
  76. count, _ := db.GetEngine(ctx).Count(new(Notice))
  77. return count
  78. }
  79. // Notices returns notices in given page.
  80. func Notices(ctx context.Context, page, pageSize int) ([]*Notice, error) {
  81. notices := make([]*Notice, 0, pageSize)
  82. return notices, db.GetEngine(ctx).
  83. Limit(pageSize, (page-1)*pageSize).
  84. Desc("created_unix").
  85. Find(&notices)
  86. }
  87. // DeleteNotices deletes all notices with ID from start to end (inclusive).
  88. func DeleteNotices(ctx context.Context, start, end int64) error {
  89. if start == 0 && end == 0 {
  90. _, err := db.GetEngine(ctx).Exec("DELETE FROM notice")
  91. return err
  92. }
  93. sess := db.GetEngine(ctx).Where("id >= ?", start)
  94. if end > 0 {
  95. sess.And("id <= ?", end)
  96. }
  97. _, err := sess.Delete(new(Notice))
  98. return err
  99. }
  100. // DeleteOldSystemNotices deletes all old system notices from database.
  101. func DeleteOldSystemNotices(ctx context.Context, olderThan time.Duration) (err error) {
  102. if olderThan <= 0 {
  103. return nil
  104. }
  105. _, err = db.GetEngine(ctx).Where("created_unix < ?", time.Now().Add(-olderThan).Unix()).Delete(&Notice{})
  106. return err
  107. }