2014-10-08 18:29:18 -04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2020-08-18 12:23:45 +08:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2014-10-08 18:29:18 -04:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
2016-02-05 14:11:53 -05:00
"fmt"
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.
2020-05-17 00:31:38 +01:00
func CreateNotice ( tp NoticeType , desc string , args ... interface { } ) error {
2021-09-23 16:45:36 +01:00
return createNotice ( db . GetEngine ( db . DefaultContext ) , tp , desc , args ... )
2017-02-24 23:19:13 +08:00
}
2016-05-06 16:48:18 -03:00
2021-09-19 19:49:59 +08:00
func createNotice ( e db . Engine , tp NoticeType , desc string , args ... interface { } ) 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 ,
}
2017-02-24 23:19:13 +08:00
_ , err := e . Insert ( n )
2014-10-08 18:29:18 -04:00
return err
}
2016-11-07 17:24:59 +01:00
// CreateRepositoryNotice creates new system notice with type NoticeRepository.
2020-05-17 00:31:38 +01:00
func CreateRepositoryNotice ( desc string , args ... interface { } ) error {
2021-09-23 16:45:36 +01:00
return createNotice ( db . GetEngine ( 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.
func RemoveAllWithNotice ( title , path string ) {
2021-09-23 16:45:36 +01:00
removeAllWithNotice ( db . GetEngine ( db . DefaultContext ) , title , path )
2017-02-24 23:19:13 +08:00
}
2020-08-18 12:23:45 +08:00
// RemoveStorageWithNotice removes a file from the storage and
// creates a system notice when error occurs.
func RemoveStorageWithNotice ( bucket storage . ObjectStorage , title , path string ) {
2021-09-23 16:45:36 +01:00
removeStorageWithNotice ( db . GetEngine ( db . DefaultContext ) , bucket , title , path )
2020-09-29 17:05:13 +08:00
}
2021-09-19 19:49:59 +08:00
func removeStorageWithNotice ( e db . Engine , bucket storage . ObjectStorage , title , path string ) {
2020-08-18 12:23:45 +08:00
if err := bucket . Delete ( path ) ; err != nil {
desc := fmt . Sprintf ( "%s [%s]: %v" , title , path , err )
log . Warn ( title + " [%s]: %v" , path , err )
2021-01-22 03:56:19 +01:00
if err = createNotice ( e , NoticeRepository , desc ) ; err != nil {
2020-08-18 12:23:45 +08:00
log . Error ( "CreateRepositoryNotice: %v" , err )
}
}
}
2021-09-19 19:49:59 +08:00
func removeAllWithNotice ( e db . Engine , title , path string ) {
2020-08-11 21:05:34 +01:00
if err := util . RemoveAll ( 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 )
2017-02-24 23:19:13 +08:00
if err = createNotice ( e , 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.
func CountNotices ( ) int64 {
2021-09-23 16:45:36 +01:00
count , _ := db . GetEngine ( db . DefaultContext ) . 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.
2015-09-25 18:13:38 +02:00
func Notices ( page , pageSize int ) ( [ ] * Notice , error ) {
notices := make ( [ ] * Notice , 0 , pageSize )
2021-09-23 16:45:36 +01:00
return notices , db . GetEngine ( db . DefaultContext ) .
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
}
// DeleteNotice deletes a system notice by given ID.
func DeleteNotice ( id int64 ) error {
2021-09-23 16:45:36 +01:00
_ , err := db . GetEngine ( db . DefaultContext ) . ID ( id ) . Delete ( new ( Notice ) )
2014-10-08 18:29:18 -04:00
return err
}
2015-12-01 23:33:08 -05:00
// DeleteNotices deletes all notices with ID from start to end (inclusive).
func DeleteNotices ( start , end int64 ) error {
2021-05-16 19:58:26 +08:00
if start == 0 && end == 0 {
2021-09-23 16:45:36 +01:00
_ , err := db . GetEngine ( db . DefaultContext ) . Exec ( "DELETE FROM notice" )
2021-05-16 19:58:26 +08:00
return err
}
2021-09-23 16:45:36 +01:00
sess := db . GetEngine ( db . DefaultContext ) . 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
// DeleteNoticesByIDs deletes notices by given IDs.
func DeleteNoticesByIDs ( ids [ ] int64 ) error {
if len ( ids ) == 0 {
return nil
}
2021-09-23 16:45:36 +01:00
_ , err := db . GetEngine ( db . DefaultContext ) .
2016-11-12 16:29:18 +08:00
In ( "id" , ids ) .
2016-11-10 16:16:32 +01:00
Delete ( new ( Notice ) )
2015-12-05 01:09:14 -05:00
return err
}
2020-12-27 11:34:19 +08:00
// GetAdminUser returns the first administrator
func GetAdminUser ( ) ( * User , error ) {
var admin User
2021-09-23 16:45:36 +01:00
has , err := db . GetEngine ( db . DefaultContext ) . Where ( "is_admin=?" , true ) . Get ( & admin )
2020-12-27 11:34:19 +08:00
if err != nil {
return nil , err
} else if ! has {
return nil , ErrUserNotExist { }
}
return & admin , nil
}