196 lines
5.2 KiB
Go
196 lines
5.2 KiB
Go
package repository
|
||
|
||
import (
|
||
"time"
|
||
|
||
"gorm.io/gorm"
|
||
|
||
"filestoragesystem/internal/model"
|
||
)
|
||
|
||
// SettingRepo 系统设置数据访问
|
||
type SettingRepo struct{ DB *gorm.DB }
|
||
|
||
// GetAll 获取全部设置
|
||
func (r *SettingRepo) GetAll() ([]model.SystemSetting, error) {
|
||
var settings []model.SystemSetting
|
||
err := r.DB.Order("group_name ASC, id ASC").Find(&settings).Error
|
||
return settings, err
|
||
}
|
||
|
||
// GetByGroup 按分组获取设置
|
||
func (r *SettingRepo) GetByGroup(group string) ([]model.SystemSetting, error) {
|
||
var settings []model.SystemSetting
|
||
err := r.DB.Where("group_name = ?", group).Find(&settings).Error
|
||
return settings, err
|
||
}
|
||
|
||
// GetValue 获取指定键的值
|
||
func (r *SettingRepo) GetValue(key string) (string, error) {
|
||
var s model.SystemSetting
|
||
err := r.DB.Where("`key` = ?", key).First(&s).Error
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return s.Value, nil
|
||
}
|
||
|
||
// UpdateValues 批量更新键值
|
||
func (r *SettingRepo) UpdateValues(values map[string]string) error {
|
||
return r.DB.Transaction(func(tx *gorm.DB) error {
|
||
for k, v := range values {
|
||
if err := tx.Model(&model.SystemSetting{}).
|
||
Where("`key` = ?", k).
|
||
Updates(map[string]interface{}{"value": v, "updated_at": time.Now()}).Error; err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
})
|
||
}
|
||
|
||
// ---- 操作日志 ----
|
||
|
||
// OpLogRepo 操作日志数据访问
|
||
type OpLogRepo struct{ DB *gorm.DB }
|
||
|
||
func (r *OpLogRepo) Create(l *model.OperationLog) error { return r.DB.Create(l).Error }
|
||
|
||
func (r *OpLogRepo) FindByID(id uint) (*model.OperationLog, error) {
|
||
var l model.OperationLog
|
||
err := r.DB.First(&l, id).Error
|
||
return &l, err
|
||
}
|
||
|
||
// OpLogFilter 操作日志过滤
|
||
type OpLogFilter struct {
|
||
UserID *uint
|
||
Username string
|
||
Action string
|
||
Status string // "1"/"0"
|
||
Days int
|
||
Page int
|
||
PageSize int
|
||
}
|
||
|
||
func (r *OpLogRepo) List(f OpLogFilter) ([]model.OperationLog, int64, error) {
|
||
q := r.DB.Model(&model.OperationLog{})
|
||
if f.UserID != nil {
|
||
q = q.Where("user_id = ?", *f.UserID)
|
||
}
|
||
if f.Username != "" {
|
||
q = q.Where("username LIKE ?", "%"+f.Username+"%")
|
||
}
|
||
if f.Action != "" {
|
||
q = q.Where("action = ?", f.Action)
|
||
}
|
||
if f.Status != "" {
|
||
q = q.Where("status = ?", f.Status)
|
||
}
|
||
if f.Days > 0 {
|
||
q = q.Where("created_at >= date('now', ?)", "-"+itoa(f.Days)+" day")
|
||
}
|
||
var total int64
|
||
if err := q.Count(&total).Error; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
var logs []model.OperationLog
|
||
err := q.Order("id DESC").
|
||
Offset((f.Page - 1) * f.PageSize).Limit(f.PageSize).Find(&logs).Error
|
||
return logs, total, err
|
||
}
|
||
|
||
// DeleteBefore 删除指定天数前的日志,返回删除条数
|
||
func (r *OpLogRepo) DeleteBefore(days int) (int64, error) {
|
||
res := r.DB.Where("created_at < date('now', ?)", "-"+itoa(days)+" day").
|
||
Delete(&model.OperationLog{})
|
||
return res.RowsAffected, res.Error
|
||
}
|
||
|
||
// ---- 系统日志 ----
|
||
|
||
// SysLogRepo 系统日志数据访问
|
||
type SysLogRepo struct{ DB *gorm.DB }
|
||
|
||
func (r *SysLogRepo) FindByID(id uint) (*model.SystemLog, error) {
|
||
var l model.SystemLog
|
||
err := r.DB.First(&l, id).Error
|
||
return &l, err
|
||
}
|
||
|
||
// SysLogFilter 系统日志过滤
|
||
type SysLogFilter struct {
|
||
Level string
|
||
Module string
|
||
Days int
|
||
Page int
|
||
PageSize int
|
||
}
|
||
|
||
func (r *SysLogRepo) List(f SysLogFilter) ([]model.SystemLog, int64, error) {
|
||
q := r.DB.Model(&model.SystemLog{})
|
||
if f.Level != "" {
|
||
q = q.Where("level = ?", f.Level)
|
||
}
|
||
if f.Module != "" {
|
||
q = q.Where("module = ?", f.Module)
|
||
}
|
||
if f.Days > 0 {
|
||
q = q.Where("created_at >= date('now', ?)", "-"+itoa(f.Days)+" day")
|
||
}
|
||
var total int64
|
||
if err := q.Count(&total).Error; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
var logs []model.SystemLog
|
||
err := q.Order("id DESC").
|
||
Offset((f.Page - 1) * f.PageSize).Limit(f.PageSize).Find(&logs).Error
|
||
return logs, total, err
|
||
}
|
||
|
||
// DeleteBefore 删除指定天数前的日志
|
||
func (r *SysLogRepo) DeleteBefore(days int) (int64, error) {
|
||
res := r.DB.Where("created_at < date('now', ?)", "-"+itoa(days)+" day").
|
||
Delete(&model.SystemLog{})
|
||
return res.RowsAffected, res.Error
|
||
}
|
||
|
||
// ---- Webhook ----
|
||
|
||
// WebhookRepo Webhook数据访问
|
||
type WebhookRepo struct{ DB *gorm.DB }
|
||
|
||
func (r *WebhookRepo) Create(w *model.Webhook) error { return r.DB.Create(w).Error }
|
||
|
||
func (r *WebhookRepo) FindByID(id uint) (*model.Webhook, error) {
|
||
var w model.Webhook
|
||
err := r.DB.First(&w, id).Error
|
||
return &w, err
|
||
}
|
||
|
||
func (r *WebhookRepo) Update(w *model.Webhook) error { return r.DB.Save(w).Error }
|
||
|
||
func (r *WebhookRepo) Delete(id, userID uint) error {
|
||
return r.DB.Where("id = ? AND user_id = ?", id, userID).Delete(&model.Webhook{}).Error
|
||
}
|
||
|
||
// ListByUser 用户webhook列表
|
||
func (r *WebhookRepo) ListByUser(userID uint) ([]model.Webhook, error) {
|
||
var hooks []model.Webhook
|
||
err := r.DB.Where("user_id = ?", userID).Order("id DESC").Find(&hooks).Error
|
||
return hooks, err
|
||
}
|
||
|
||
// ListActive 查询匹配事件的启用webhook:projectID为0表示仅用户级别
|
||
func (r *WebhookRepo) ListActive(userID uint, projectID uint) ([]model.Webhook, error) {
|
||
var hooks []model.Webhook
|
||
err := r.DB.Where("user_id = ? AND status = 1 AND (project_id IS NULL OR project_id = 0 OR project_id = ?)",
|
||
userID, projectID).Find(&hooks).Error
|
||
return hooks, err
|
||
}
|
||
|
||
func (r *WebhookRepo) Touch(id uint) error {
|
||
return r.DB.Model(&model.Webhook{}).Where("id = ?", id).
|
||
UpdateColumn("last_triggered_at", gorm.Expr("CURRENT_TIMESTAMP")).Error
|
||
}
|