2021-11-18 13:58:42 +08:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2014-10-08 18:29:18 -04:00
2022-10-17 07:29:26 +08:00
package system
2014-10-08 18:29:18 -04:00
import (
2021-11-18 13:58:42 +08:00
"context"
2016-02-05 14:11:53 -05:00
"fmt"
2022-03-28 14:54:59 +02:00
"time"
2014-10-08 18:29:18 -04:00
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2017-03-29 10:05:23 +08:00
"code.gitea.io/gitea/modules/log"
2020-08-18 12:23:45 +08:00
"code.gitea.io/gitea/modules/storage"
2019-08-15 22:46:21 +08:00
"code.gitea.io/gitea/modules/timeutil"
2020-08-11 21:05:34 +01:00
"code.gitea.io/gitea/modules/util"
2014-10-08 18:29:18 -04:00
)
2021-03-15 02:52:12 +08:00
// NoticeType describes the notice type
2014-10-08 18:29:18 -04:00
type NoticeType int
const (
2021-03-15 02:52:12 +08:00
// NoticeRepository type
2016-11-07 17:24:59 +01:00
NoticeRepository NoticeType = iota + 1
2020-05-17 00:31:38 +01:00
// NoticeTask type
NoticeTask
2014-10-08 18:29:18 -04:00
)
// Notice represents a system notice for admin.
type Notice struct {
2015-12-05 01:09:14 -05:00
ID int64 ` xorm:"pk autoincr" `
2014-10-08 18:29:18 -04:00
Type NoticeType
2019-08-15 22:46:21 +08:00
Description string ` xorm:"TEXT" `
CreatedUnix timeutil . TimeStamp ` xorm:"INDEX created" `
2014-10-08 18:29:18 -04:00
}
2021-09-19 19:49:59 +08:00
func init ( ) {
db . RegisterModel ( new ( Notice ) )
}
2014-10-08 18:29:18 -04:00
// TrStr returns a translation format string.
func ( n * Notice ) TrStr ( ) string {
2020-12-25 09:59:32 +00:00
return fmt . Sprintf ( "admin.notices.type_%d" , n . Type )
2014-10-08 18:29:18 -04:00
}
// CreateNotice creates new system notice.
2023-07-04 20:36:08 +02:00
func CreateNotice ( ctx context . Context , tp NoticeType , desc string , args ... any ) error {
2020-05-17 00:31:38 +01:00
if len ( args ) > 0 {
desc = fmt . Sprintf ( desc , args ... )
}
2014-10-08 18:29:18 -04:00
n := & Notice {
Type : tp ,
Description : desc ,
}
2021-11-18 13:58:42 +08:00
return db . Insert ( ctx , n )
2014-10-08 18:29:18 -04:00
}
2016-11-07 17:24:59 +01:00
// CreateRepositoryNotice creates new system notice with type NoticeRepository.
2023-07-04 20:36:08 +02:00
func CreateRepositoryNotice ( desc string , args ... any ) error {
2022-01-19 23:26:57 +00:00
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
2021-11-18 18:42:27 +01:00
return CreateNotice ( db . DefaultContext , NoticeRepository , desc , args ... )
2014-10-08 18:29:18 -04:00
}
2016-02-05 14:11:53 -05:00
// RemoveAllWithNotice removes all directories in given path and
// creates a system notice when error occurs.
2021-11-18 18:42:27 +01:00
func RemoveAllWithNotice ( ctx context . Context , title , path string ) {
if err := util . RemoveAll ( path ) ; err != nil {
2020-08-18 12:23:45 +08:00
desc := fmt . Sprintf ( "%s [%s]: %v" , title , path , err )
log . Warn ( title + " [%s]: %v" , path , err )
2022-01-19 23:26:57 +00:00
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
if err = CreateNotice ( db . DefaultContext , NoticeRepository , desc ) ; err != nil {
2020-08-18 12:23:45 +08:00
log . Error ( "CreateRepositoryNotice: %v" , err )
}
}
}
2021-11-18 18:42:27 +01:00
// RemoveStorageWithNotice removes a file from the storage and
2021-11-18 13:58:42 +08:00
// creates a system notice when error occurs.
2021-11-18 18:42:27 +01:00
func RemoveStorageWithNotice ( ctx context . Context , bucket storage . ObjectStorage , title , path string ) {
if err := bucket . Delete ( path ) ; err != nil {
2016-02-05 14:11:53 -05:00
desc := fmt . Sprintf ( "%s [%s]: %v" , title , path , err )
2019-06-15 23:20:29 +01:00
log . Warn ( title + " [%s]: %v" , path , err )
2022-01-19 23:26:57 +00:00
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
if err = CreateNotice ( db . DefaultContext , NoticeRepository , desc ) ; err != nil {
2019-04-02 08:48:31 +01:00
log . Error ( "CreateRepositoryNotice: %v" , err )
2016-02-05 14:11:53 -05:00
}
}
}
2014-10-08 18:29:18 -04:00
// CountNotices returns number of notices.
2023-10-03 12:30:41 +02:00
func CountNotices ( ctx context . Context ) int64 {
count , _ := db . GetEngine ( ctx ) . Count ( new ( Notice ) )
2014-10-08 18:29:18 -04:00
return count
}
2017-01-09 13:26:05 -05:00
// Notices returns notices in given page.
2023-09-25 15:17:37 +02:00
func Notices ( ctx context . Context , page , pageSize int ) ( [ ] * Notice , error ) {
2015-09-25 18:13:38 +02:00
notices := make ( [ ] * Notice , 0 , pageSize )
2023-09-25 15:17:37 +02:00
return notices , db . GetEngine ( ctx ) .
2016-11-10 16:16:32 +01:00
Limit ( pageSize , ( page - 1 ) * pageSize ) .
2021-10-06 22:36:24 +02:00
Desc ( "created_unix" ) .
2016-11-10 16:16:32 +01:00
Find ( & notices )
2014-10-08 18:29:18 -04:00
}
2015-12-01 23:33:08 -05:00
// DeleteNotices deletes all notices with ID from start to end (inclusive).
2023-09-25 15:17:37 +02:00
func DeleteNotices ( ctx context . Context , start , end int64 ) error {
2021-05-16 19:58:26 +08:00
if start == 0 && end == 0 {
2023-09-25 15:17:37 +02:00
_ , err := db . GetEngine ( ctx ) . Exec ( "DELETE FROM notice" )
2021-05-16 19:58:26 +08:00
return err
}
2023-09-25 15:17:37 +02:00
sess := db . GetEngine ( ctx ) . Where ( "id >= ?" , start )
2015-12-01 23:33:08 -05:00
if end > 0 {
sess . And ( "id <= ?" , end )
}
_ , err := sess . Delete ( new ( Notice ) )
return err
}
2015-12-05 01:09:14 -05:00
2022-03-28 14:54:59 +02:00
// DeleteOldSystemNotices deletes all old system notices from database.
2023-09-25 15:17:37 +02:00
func DeleteOldSystemNotices ( ctx context . Context , olderThan time . Duration ) ( err error ) {
2022-03-28 14:54:59 +02:00
if olderThan <= 0 {
return nil
}
2023-09-25 15:17:37 +02:00
_ , err = db . GetEngine ( ctx ) . Where ( "created_unix < ?" , time . Now ( ) . Add ( - olderThan ) . Unix ( ) ) . Delete ( & Notice { } )
2022-06-20 12:02:49 +02:00
return err
2022-03-28 14:54:59 +02:00
}