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 }