Files
filestoragesystem/go/internal/repository/system.go
T
2026-08-23 00:48:10 +08:00

196 lines
5.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}