132 lines
3.4 KiB
Go
132 lines
3.4 KiB
Go
package system
|
|
|
|
import (
|
|
"context"
|
|
|
|
"kra/internal/biz/system"
|
|
"kra/internal/data/model"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type operationRecordRepo struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewOperationRecordRepo 创建操作记录仓储
|
|
func NewOperationRecordRepo(db *gorm.DB) system.OperationRecordRepo {
|
|
return &operationRecordRepo{db: db}
|
|
}
|
|
|
|
func (r *operationRecordRepo) Create(ctx context.Context, record *system.OperationRecord) error {
|
|
m := toModelOperationRecord(record)
|
|
if err := r.db.WithContext(ctx).Create(m).Error; err != nil {
|
|
return err
|
|
}
|
|
record.ID = uint(m.ID)
|
|
return nil
|
|
}
|
|
|
|
func (r *operationRecordRepo) Delete(ctx context.Context, id uint) error {
|
|
return r.db.WithContext(ctx).Delete(&model.SysOperationRecord{}, id).Error
|
|
}
|
|
|
|
func (r *operationRecordRepo) DeleteByIds(ctx context.Context, ids []uint) error {
|
|
return r.db.WithContext(ctx).Delete(&model.SysOperationRecord{}, "id in (?)", ids).Error
|
|
}
|
|
|
|
func (r *operationRecordRepo) FindByID(ctx context.Context, id uint) (*system.OperationRecord, error) {
|
|
var m model.SysOperationRecord
|
|
if err := r.db.WithContext(ctx).Where("id = ?", id).First(&m).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return toBizOperationRecord(&m, nil), nil
|
|
}
|
|
|
|
func (r *operationRecordRepo) List(ctx context.Context, page, pageSize int, filters map[string]interface{}) ([]*system.OperationRecord, int64, error) {
|
|
db := r.db.WithContext(ctx).Model(&model.SysOperationRecord{})
|
|
|
|
if v, ok := filters["method"]; ok && v != "" {
|
|
db = db.Where("method = ?", v)
|
|
}
|
|
if v, ok := filters["path"]; ok && v != "" {
|
|
db = db.Where("path LIKE ?", "%"+v.(string)+"%")
|
|
}
|
|
if v, ok := filters["status"]; ok && v.(int) != 0 {
|
|
db = db.Where("status = ?", v)
|
|
}
|
|
|
|
var total int64
|
|
if err := db.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
offset := (page - 1) * pageSize
|
|
var list []model.SysOperationRecord
|
|
if err := db.Order("id desc").Offset(offset).Limit(pageSize).Find(&list).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// 预加载用户信息
|
|
userIDs := make([]int64, 0)
|
|
for _, m := range list {
|
|
userIDs = append(userIDs, m.UserID)
|
|
}
|
|
userMap := make(map[int64]*model.SysUser)
|
|
if len(userIDs) > 0 {
|
|
var users []model.SysUser
|
|
r.db.WithContext(ctx).Where("id in (?)", userIDs).Find(&users)
|
|
for i := range users {
|
|
userMap[users[i].ID] = &users[i]
|
|
}
|
|
}
|
|
|
|
result := make([]*system.OperationRecord, len(list))
|
|
for i, m := range list {
|
|
user := userMap[m.UserID]
|
|
result[i] = toBizOperationRecord(&m, user)
|
|
}
|
|
return result, total, nil
|
|
}
|
|
|
|
// 转换函数
|
|
func toModelOperationRecord(r *system.OperationRecord) *model.SysOperationRecord {
|
|
return &model.SysOperationRecord{
|
|
ID: int64(r.ID),
|
|
IP: r.IP,
|
|
Method: r.Method,
|
|
Path: r.Path,
|
|
Status: int64(r.Status),
|
|
Latency: r.Latency,
|
|
Agent: r.Agent,
|
|
ErrorMessage: r.ErrorMessage,
|
|
Body: r.Body,
|
|
Resp: r.Resp,
|
|
UserID: int64(r.UserID),
|
|
}
|
|
}
|
|
|
|
func toBizOperationRecord(m *model.SysOperationRecord, user *model.SysUser) *system.OperationRecord {
|
|
r := &system.OperationRecord{
|
|
ID: uint(m.ID),
|
|
IP: m.IP,
|
|
Method: m.Method,
|
|
Path: m.Path,
|
|
Status: int(m.Status),
|
|
Latency: m.Latency,
|
|
Agent: m.Agent,
|
|
ErrorMessage: m.ErrorMessage,
|
|
Body: m.Body,
|
|
Resp: m.Resp,
|
|
UserID: uint(m.UserID),
|
|
}
|
|
if user != nil {
|
|
r.User = &system.User{
|
|
ID: uint(user.ID),
|
|
Username: user.Username,
|
|
NickName: user.NickName,
|
|
}
|
|
}
|
|
return r
|
|
}
|