2020-07-22 22:17:53 +08:00
package models
import (
2023-06-30 18:10:11 +08:00
"encoding/json"
2022-03-27 12:22:47 +08:00
dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils"
2020-12-02 20:31:29 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/errors"
2022-08-15 15:05:47 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/utils"
2023-06-30 18:10:11 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/langs"
2020-07-22 22:17:53 +08:00
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
2020-12-02 20:31:29 +08:00
"github.com/iwind/TeaGo/types"
2020-11-20 16:36:07 +08:00
timeutil "github.com/iwind/TeaGo/utils/time"
"regexp"
"strings"
2020-12-02 20:31:29 +08:00
"time"
2020-07-22 22:17:53 +08:00
)
type LogDAO dbs . DAO
func NewLogDAO ( ) * LogDAO {
return dbs . NewDAO ( & LogDAO {
DAOObject : dbs . DAOObject {
DB : Tea . Env ,
Table : "edgeLogs" ,
Model : new ( Log ) ,
PkName : "id" ,
} ,
} ) . ( * LogDAO )
}
2020-10-13 20:05:13 +08:00
var SharedLogDAO * LogDAO
func init ( ) {
dbs . OnReady ( func ( ) {
SharedLogDAO = NewLogDAO ( )
} )
}
2020-07-22 22:17:53 +08:00
2022-03-08 09:53:10 +08:00
// CreateLog 创建管理员日志
2023-06-30 18:10:11 +08:00
func ( this * LogDAO ) CreateLog ( tx * dbs . Tx , adminType string , adminId int64 , level string , description string , action string , ip string , langMessageCode langs . MessageCode , langMessageArgs [ ] any ) error {
2022-07-24 09:56:27 +08:00
var op = NewLogOperator ( )
2020-12-14 21:25:11 +08:00
op . Level = level
2022-08-15 15:05:47 +08:00
op . Description = utils . LimitString ( description , 1000 )
2020-12-14 21:25:11 +08:00
op . Action = action
op . Ip = ip
2020-11-10 20:30:55 +08:00
op . Type = adminType
2020-12-14 21:25:11 +08:00
switch adminType {
case "admin" :
op . AdminId = adminId
case "user" :
op . UserId = adminId
case "provider" :
op . ProviderId = adminId
}
2023-06-30 18:10:11 +08:00
// i18n
op . LangMessageCode = langMessageCode
if len ( langMessageArgs ) > 0 {
langMessageArgsJSON , err := json . Marshal ( langMessageArgs )
if err != nil {
return err
}
op . LangMesageArgs = langMessageArgsJSON
}
2020-11-20 16:36:07 +08:00
op . Day = timeutil . Format ( "Ymd" )
2020-07-22 22:17:53 +08:00
op . Type = LogTypeAdmin
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2020-07-22 22:17:53 +08:00
return err
}
2020-11-10 20:30:55 +08:00
2022-03-08 09:53:10 +08:00
// CountLogs 计算所有日志数量
2023-04-06 10:06:56 +08:00
func ( this * LogDAO ) CountLogs ( tx * dbs . Tx , dayFrom string , dayTo string , keyword string , userType string , level string ) ( int64 , error ) {
2020-11-20 16:36:07 +08:00
dayFrom = this . formatDay ( dayFrom )
dayTo = this . formatDay ( dayTo )
2023-04-06 10:06:56 +08:00
var query = this . Query ( tx )
2020-11-20 16:36:07 +08:00
if len ( dayFrom ) > 0 {
query . Gte ( "day" , dayFrom )
}
if len ( dayTo ) > 0 {
query . Lte ( "day" , dayTo )
}
if len ( keyword ) > 0 {
query . Where ( "(description LIKE :keyword OR ip LIKE :keyword OR action LIKE :keyword)" ) .
2022-03-27 12:22:47 +08:00
Param ( "keyword" , dbutils . QuoteLike ( keyword ) )
2020-11-20 16:36:07 +08:00
}
2023-04-06 10:06:56 +08:00
if len ( level ) > 0 {
query . Attr ( "level" , level )
}
2020-11-20 16:36:07 +08:00
2020-12-23 11:56:55 +08:00
// 用户类型
switch userType {
case "admin" :
query . Where ( "adminId>0" )
case "user" :
query . Where ( "userId>0" )
}
2020-11-20 16:36:07 +08:00
return query . Count ( )
2020-11-10 20:30:55 +08:00
}
2022-03-08 09:53:10 +08:00
// ListLogs 列出单页日志
2023-04-06 10:06:56 +08:00
func ( this * LogDAO ) ListLogs ( tx * dbs . Tx , offset int64 , size int64 , dayFrom string , dayTo string , keyword string , userType string , level string ) ( result [ ] * Log , err error ) {
2020-11-20 16:36:07 +08:00
dayFrom = this . formatDay ( dayFrom )
dayTo = this . formatDay ( dayTo )
2023-04-06 10:06:56 +08:00
var query = this . Query ( tx )
2020-11-20 16:36:07 +08:00
if len ( dayFrom ) > 0 {
query . Gte ( "day" , dayFrom )
}
if len ( dayTo ) > 0 {
query . Lte ( "day" , dayTo )
}
if len ( keyword ) > 0 {
query . Where ( "(description LIKE :keyword OR ip LIKE :keyword OR action LIKE :keyword)" ) .
2022-03-27 12:22:47 +08:00
Param ( "keyword" , dbutils . QuoteLike ( keyword ) )
2020-11-20 16:36:07 +08:00
}
2023-04-06 10:06:56 +08:00
if len ( level ) > 0 {
query . Attr ( "level" , level )
}
2020-12-23 11:56:55 +08:00
// 用户类型
switch userType {
case "admin" :
query . Where ( "adminId>0" )
case "user" :
query . Where ( "userId>0" )
}
2020-11-20 16:36:07 +08:00
_ , err = query .
2020-11-10 20:30:55 +08:00
Offset ( offset ) .
Limit ( size ) .
Slice ( & result ) .
DescPk ( ) .
FindAll ( )
return
}
2020-11-20 16:36:07 +08:00
2022-03-08 09:53:10 +08:00
// DeleteLogPermanently 物理删除日志
2021-01-01 23:31:30 +08:00
func ( this * LogDAO ) DeleteLogPermanently ( tx * dbs . Tx , logId int64 ) error {
2020-12-02 20:31:29 +08:00
if logId <= 0 {
return errors . New ( "invalid logId" )
}
2021-01-01 23:31:30 +08:00
_ , err := this . Delete ( tx , logId )
2020-12-02 20:31:29 +08:00
return err
}
2022-03-08 09:53:10 +08:00
// DeleteAllLogsPermanently 物理删除所有日志
2021-01-01 23:31:30 +08:00
func ( this * LogDAO ) DeleteAllLogsPermanently ( tx * dbs . Tx ) error {
_ , err := this . Query ( tx ) .
2020-12-02 20:31:29 +08:00
Delete ( )
return err
}
2022-03-08 09:53:10 +08:00
// DeleteLogsPermanentlyBeforeDays 物理删除某些天之前的日志
2021-01-01 23:31:30 +08:00
func ( this * LogDAO ) DeleteLogsPermanentlyBeforeDays ( tx * dbs . Tx , days int ) error {
2020-12-02 20:31:29 +08:00
if days <= 0 {
days = 0
}
untilDay := timeutil . Format ( "Ymd" , time . Now ( ) . AddDate ( 0 , 0 , - days ) )
2021-01-01 23:31:30 +08:00
_ , err := this . Query ( tx ) .
2020-12-02 20:31:29 +08:00
Lte ( "day" , untilDay ) .
Delete ( )
return err
}
2022-03-08 09:53:10 +08:00
// SumLogsSize 计算当前日志容量大小
2020-12-02 20:31:29 +08:00
func ( this * LogDAO ) SumLogsSize ( ) ( int64 , error ) {
col , err := this . Instance . FindCol ( 0 , "SELECT DATA_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA=? AND TABLE_NAME=? LIMIT 1" , this . Instance . Name ( ) , this . Table )
if err != nil {
return 0 , err
}
return types . Int64 ( col ) , nil
}
2020-11-20 16:36:07 +08:00
// 格式化日期
func ( this * LogDAO ) formatDay ( day string ) string {
if ! regexp . MustCompile ( ` ^\d { 4}-\d { 2}-\d { 2}$ ` ) . MatchString ( day ) {
return ""
}
day = strings . ReplaceAll ( day , "-" , "" )
return day
}