更新前后端代码
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
"filestoragesystem/internal/model"
|
||||
)
|
||||
|
||||
// FileListFilter 文件列表过滤条件
|
||||
type FileListFilter struct {
|
||||
UserID uint
|
||||
ProjectID uint
|
||||
Filename string // 模糊匹配
|
||||
Prefix string // 虚拟目录前缀
|
||||
Trashed bool // 查询回收站
|
||||
Visibility int8 // 0为不过滤
|
||||
Page int
|
||||
PageSize int
|
||||
}
|
||||
|
||||
// FileRepo 文件数据访问
|
||||
type FileRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *FileRepo) Create(f *model.File) error { return r.DB.Create(f).Error }
|
||||
|
||||
func (r *FileRepo) FindByID(id uint) (*model.File, error) {
|
||||
var f model.File
|
||||
err := r.DB.First(&f, id).Error
|
||||
return &f, err
|
||||
}
|
||||
|
||||
// List 分页查询文件
|
||||
func (r *FileRepo) List(filter FileListFilter) ([]model.File, int64, error) {
|
||||
q := r.DB.Model(&model.File{})
|
||||
if filter.UserID > 0 {
|
||||
q = q.Where("user_id = ?", filter.UserID)
|
||||
}
|
||||
if filter.ProjectID > 0 {
|
||||
q = q.Where("project_id = ?", filter.ProjectID)
|
||||
}
|
||||
if filter.Filename != "" {
|
||||
q = q.Where("filename LIKE ?", "%"+filter.Filename+"%")
|
||||
}
|
||||
if filter.Prefix != "" {
|
||||
q = q.Where("(filename = ? OR filename LIKE ?)", filter.Prefix, filter.Prefix+"/%")
|
||||
}
|
||||
if filter.Trashed {
|
||||
q = q.Where("status = 0")
|
||||
} else {
|
||||
q = q.Where("status = 1")
|
||||
}
|
||||
if filter.Visibility > 0 {
|
||||
q = q.Where("visibility = ?", filter.Visibility)
|
||||
}
|
||||
var total int64
|
||||
if err := q.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
var files []model.File
|
||||
err := q.Preload("Project").Order("id DESC").
|
||||
Offset((filter.Page - 1) * filter.PageSize).Limit(filter.PageSize).Find(&files).Error
|
||||
return files, total, err
|
||||
}
|
||||
|
||||
func (r *FileRepo) Update(f *model.File) error { return r.DB.Save(f).Error }
|
||||
|
||||
// SoftDelete 软删除(进入回收站)
|
||||
func (r *FileRepo) SoftDelete(id uint) error {
|
||||
now := time.Now()
|
||||
return r.DB.Model(&model.File{}).Where("id = ?", id).
|
||||
Updates(map[string]interface{}{"status": 0, "deleted_at": now}).Error
|
||||
}
|
||||
|
||||
// Restore 从回收站恢复
|
||||
func (r *FileRepo) Restore(id uint) error {
|
||||
return r.DB.Model(&model.File{}).Where("id = ?", id).
|
||||
Updates(map[string]interface{}{"status": 1, "deleted_at": nil}).Error
|
||||
}
|
||||
|
||||
func (r *FileRepo) Delete(id uint) error { return r.DB.Delete(&model.File{}, id).Error }
|
||||
|
||||
// CountByStoredPath 统计引用同一物理文件的记录数(用于去重删除)
|
||||
func (r *FileRepo) CountByStoredPath(storedPath string) (int64, error) {
|
||||
var n int64
|
||||
err := r.DB.Model(&model.File{}).Where("stored_path = ?", storedPath).Count(&n).Error
|
||||
return n, err
|
||||
}
|
||||
|
||||
// FindByMD5AndPath 基于MD5查找可复用的物理文件记录
|
||||
func (r *FileRepo) FindByMD5AndPath(md5 string) (*model.File, error) {
|
||||
var f model.File
|
||||
err := r.DB.Where("md5 = ? AND stored_path != ''", md5).Order("id ASC").First(&f).Error
|
||||
return &f, err
|
||||
}
|
||||
|
||||
// ListByProject 项目下所有文件(用于项目删除级联)
|
||||
func (r *FileRepo) ListByProject(projectID uint) ([]model.File, error) {
|
||||
var files []model.File
|
||||
err := r.DB.Where("project_id = ?", projectID).Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
// ListByUser 用户所有文件(用于用户删除级联)
|
||||
func (r *FileRepo) ListByUser(userID uint) ([]model.File, error) {
|
||||
var files []model.File
|
||||
err := r.DB.Where("user_id = ?", userID).Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
// StatsByProject 项目文件统计
|
||||
func (r *FileRepo) StatsByProject(projectID uint) (count int64, size int64, err error) {
|
||||
var res struct {
|
||||
Count int64 `json:"count"`
|
||||
Size int64 `json:"size"`
|
||||
}
|
||||
err = r.DB.Model(&model.File{}).
|
||||
Where("project_id = ? AND status = 1", projectID).
|
||||
Select("COUNT(*) as count, COALESCE(SUM(size),0) as size").
|
||||
Scan(&res).Error
|
||||
return res.Count, res.Size, err
|
||||
}
|
||||
|
||||
// StatsByUser 用户文件统计
|
||||
func (r *FileRepo) StatsByUser(userID uint) (count int64, size int64, err error) {
|
||||
var res struct {
|
||||
Count int64 `json:"count"`
|
||||
Size int64 `json:"size"`
|
||||
}
|
||||
err = r.DB.Model(&model.File{}).
|
||||
Where("user_id = ? AND status = 1", userID).
|
||||
Select("COUNT(*) as count, COALESCE(SUM(size),0) as size").
|
||||
Scan(&res).Error
|
||||
return res.Count, res.Size, err
|
||||
}
|
||||
|
||||
// IncrDownloadCount 下载计数
|
||||
func (r *FileRepo) IncrDownloadCount(id uint) error {
|
||||
return r.DB.Model(&model.File{}).Where("id = ?", id).
|
||||
UpdateColumn("download_count", gorm.Expr("download_count + 1")).Error
|
||||
}
|
||||
|
||||
// ---- 临时链接 ----
|
||||
|
||||
// TempLinkRepo 临时链接数据访问
|
||||
type TempLinkRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *TempLinkRepo) Create(l *model.TempLink) error { return r.DB.Create(l).Error }
|
||||
|
||||
func (r *TempLinkRepo) FindByToken(token string) (*model.TempLink, error) {
|
||||
var l model.TempLink
|
||||
err := r.DB.Where("token = ?", token).First(&l).Error
|
||||
return &l, err
|
||||
}
|
||||
|
||||
func (r *TempLinkRepo) IncrUsed(id uint) error {
|
||||
return r.DB.Model(&model.TempLink{}).Where("id = ?", id).
|
||||
UpdateColumn("used_count", gorm.Expr("used_count + 1")).Error
|
||||
}
|
||||
|
||||
func (r *TempLinkRepo) DeleteByFile(fileID uint) error {
|
||||
return r.DB.Where("file_id = ?", fileID).Delete(&model.TempLink{}).Error
|
||||
}
|
||||
|
||||
// ---- 流量日志 ----
|
||||
|
||||
// TrafficRepo 流量日志数据访问
|
||||
type TrafficRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *TrafficRepo) Create(t *model.TrafficLog) error { return r.DB.Create(t).Error }
|
||||
|
||||
// DailyStats 按天/类型聚合流量
|
||||
func (r *TrafficRepo) DailyStats(userID uint, days int) ([]map[string]interface{}, error) {
|
||||
var rows []map[string]interface{}
|
||||
err := r.DB.Model(&model.TrafficLog{}).
|
||||
Select("date(created_at) as date, type, COALESCE(SUM(size),0) as size, COUNT(*) as count").
|
||||
Where("user_id = ? AND created_at >= date('now', ?)", userID, "-"+itoa(days)+" day").
|
||||
Group("date(created_at), type").
|
||||
Order("date DESC").
|
||||
Find(&rows).Error
|
||||
return rows, err
|
||||
}
|
||||
|
||||
// SumByUser 汇总用户上传/下载流量
|
||||
func (r *TrafficRepo) SumByUser(userID uint, days int) (upload, download int64, err error) {
|
||||
var res []struct {
|
||||
Type int64 `json:"type"`
|
||||
Size int64 `json:"size"`
|
||||
}
|
||||
q := r.DB.Model(&model.TrafficLog{}).
|
||||
Select("type, COALESCE(SUM(size),0) as size").
|
||||
Where("user_id = ?", userID)
|
||||
if days > 0 {
|
||||
q = q.Where("created_at >= date('now', ?)", "-"+itoa(days)+" day")
|
||||
}
|
||||
err = q.Group("type").Scan(&res).Error
|
||||
for _, r := range res {
|
||||
if r.Type == 1 {
|
||||
upload = r.Size
|
||||
} else if r.Type == 2 {
|
||||
download = r.Size
|
||||
}
|
||||
}
|
||||
return upload, download, err
|
||||
}
|
||||
|
||||
func itoa(n int) string {
|
||||
if n == 0 {
|
||||
return "0"
|
||||
}
|
||||
var buf [12]byte
|
||||
i := len(buf)
|
||||
for n > 0 {
|
||||
i--
|
||||
buf[i] = byte('0' + n%10)
|
||||
n /= 10
|
||||
}
|
||||
return string(buf[i:])
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
"filestoragesystem/internal/model"
|
||||
)
|
||||
|
||||
// ProjectRepo 项目数据访问
|
||||
type ProjectRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *ProjectRepo) Create(p *model.Project) error { return r.DB.Create(p).Error }
|
||||
|
||||
func (r *ProjectRepo) FindByID(id uint) (*model.Project, error) {
|
||||
var p model.Project
|
||||
err := r.DB.First(&p, id).Error
|
||||
return &p, err
|
||||
}
|
||||
|
||||
func (r *ProjectRepo) FindByName(userID uint, name string) (*model.Project, error) {
|
||||
var p model.Project
|
||||
err := r.DB.Where("user_id = ? AND name = ?", userID, name).First(&p).Error
|
||||
return &p, err
|
||||
}
|
||||
|
||||
// List 分页查询项目;keyword匹配名称;all为true时跨用户(管理员)
|
||||
func (r *ProjectRepo) List(userID uint, keyword string, all bool, page, pageSize int) ([]model.Project, int64, error) {
|
||||
q := r.DB.Model(&model.Project{})
|
||||
if !all {
|
||||
q = q.Where("user_id = ?", userID)
|
||||
}
|
||||
if keyword != "" {
|
||||
q = q.Where("name LIKE ?", "%"+keyword+"%")
|
||||
}
|
||||
var total int64
|
||||
if err := q.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
var projects []model.Project
|
||||
err := q.Order("id DESC").
|
||||
Offset((page - 1) * pageSize).Limit(pageSize).Find(&projects).Error
|
||||
return projects, total, err
|
||||
}
|
||||
|
||||
func (r *ProjectRepo) Update(p *model.Project) error { return r.DB.Save(p).Error }
|
||||
|
||||
func (r *ProjectRepo) Delete(id uint) error { return r.DB.Delete(&model.Project{}, id).Error }
|
||||
|
||||
// UpdateStorageUsed 增减项目已用存储
|
||||
func (r *ProjectRepo) UpdateStorageUsed(id uint, delta int64) error {
|
||||
return r.DB.Model(&model.Project{}).Where("id = ?", id).
|
||||
UpdateColumn("storage_used", gorm.Expr("storage_used + ?", delta)).Error
|
||||
}
|
||||
|
||||
// ListByUser 用户全部项目(用于统计)
|
||||
func (r *ProjectRepo) ListByUser(userID uint) ([]model.Project, error) {
|
||||
var projects []model.Project
|
||||
err := r.DB.Where("user_id = ?", userID).Find(&projects).Error
|
||||
return projects, err
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
"filestoragesystem/internal/model"
|
||||
)
|
||||
|
||||
// RoleRepo 角色数据访问
|
||||
type RoleRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *RoleRepo) Create(role *model.Role) error { return r.DB.Create(role).Error }
|
||||
|
||||
func (r *RoleRepo) FindByID(id uint) (*model.Role, error) {
|
||||
var role model.Role
|
||||
err := r.DB.Preload("Permissions").First(&role, id).Error
|
||||
return &role, err
|
||||
}
|
||||
|
||||
func (r *RoleRepo) FindByCode(code string) (*model.Role, error) {
|
||||
var role model.Role
|
||||
err := r.DB.Where("code = ?", code).First(&role).Error
|
||||
return &role, err
|
||||
}
|
||||
|
||||
func (r *RoleRepo) List() ([]model.Role, error) {
|
||||
var roles []model.Role
|
||||
err := r.DB.Preload("Permissions").Order("id ASC").Find(&roles).Error
|
||||
return roles, err
|
||||
}
|
||||
|
||||
func (r *RoleRepo) Update(role *model.Role) error { return r.DB.Save(role).Error }
|
||||
|
||||
func (r *RoleRepo) Delete(id uint) error { return r.DB.Delete(&model.Role{}, id).Error }
|
||||
|
||||
// ReplacePermissions 覆盖式更新角色权限
|
||||
func (r *RoleRepo) ReplacePermissions(roleID uint, permIDs []uint) error {
|
||||
return r.DB.Transaction(func(tx *gorm.DB) error {
|
||||
if err := tx.Exec("DELETE FROM role_permissions WHERE role_id = ?", roleID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
for _, pid := range permIDs {
|
||||
if err := tx.Exec("INSERT INTO role_permissions (role_id, permission_id) VALUES (?, ?)", roleID, pid).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// CountUsersByRole 统计角色下的用户数
|
||||
func (r *RoleRepo) CountUsersByRole(roleID uint) (int64, error) {
|
||||
var n int64
|
||||
err := r.DB.Model(&model.User{}).Where("role_id = ?", roleID).Count(&n).Error
|
||||
return n, err
|
||||
}
|
||||
|
||||
// PermissionRepo 权限数据访问
|
||||
type PermissionRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *PermissionRepo) List() ([]model.Permission, error) {
|
||||
var perms []model.Permission
|
||||
err := r.DB.Order("module ASC, id ASC").Find(&perms).Error
|
||||
return perms, err
|
||||
}
|
||||
|
||||
func (r *PermissionRepo) ListByIDs(ids []uint) ([]model.Permission, error) {
|
||||
var perms []model.Permission
|
||||
err := r.DB.Where("id IN ?", ids).Find(&perms).Error
|
||||
return perms, err
|
||||
}
|
||||
|
||||
func (r *PermissionRepo) ListByRole(roleID uint) ([]model.Permission, error) {
|
||||
var perms []model.Permission
|
||||
err := r.DB.
|
||||
Joins("JOIN role_permissions rp ON rp.permission_id = permissions.id").
|
||||
Where("rp.role_id = ?", roleID).Find(&perms).Error
|
||||
return perms, err
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
"filestoragesystem/internal/model"
|
||||
)
|
||||
|
||||
// UserRepo 用户数据访问
|
||||
type UserRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *UserRepo) Create(u *model.User) error { return r.DB.Create(u).Error }
|
||||
|
||||
func (r *UserRepo) FindByID(id uint) (*model.User, error) {
|
||||
var u model.User
|
||||
err := r.DB.Preload("Role.Permissions").First(&u, id).Error
|
||||
return &u, err
|
||||
}
|
||||
|
||||
func (r *UserRepo) FindByUsernameOrEmail(account string) (*model.User, error) {
|
||||
var u model.User
|
||||
err := r.DB.Preload("Role.Permissions").
|
||||
Where("username = ? OR email = ?", account, account).First(&u).Error
|
||||
return &u, err
|
||||
}
|
||||
|
||||
func (r *UserRepo) FindByUsername(username string) (*model.User, error) {
|
||||
var u model.User
|
||||
err := r.DB.Where("username = ?", username).First(&u).Error
|
||||
return &u, err
|
||||
}
|
||||
|
||||
func (r *UserRepo) FindByEmail(email string) (*model.User, error) {
|
||||
var u model.User
|
||||
err := r.DB.Where("email = ?", email).First(&u).Error
|
||||
return &u, err
|
||||
}
|
||||
|
||||
// List 分页查询用户,keyword匹配用户名/邮箱,roleID/status可选
|
||||
func (r *UserRepo) List(keyword, roleID, status string, page, pageSize int) ([]model.User, int64, error) {
|
||||
q := r.DB.Model(&model.User{})
|
||||
if keyword != "" {
|
||||
like := "%" + keyword + "%"
|
||||
q = q.Where("username LIKE ? OR email LIKE ?", like, like)
|
||||
}
|
||||
if roleID != "" {
|
||||
q = q.Where("role_id = ?", roleID)
|
||||
}
|
||||
if status != "" {
|
||||
q = q.Where("status = ?", status)
|
||||
}
|
||||
var total int64
|
||||
if err := q.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
var users []model.User
|
||||
err := q.Preload("Role").Order("id DESC").
|
||||
Offset((page - 1) * pageSize).Limit(pageSize).Find(&users).Error
|
||||
return users, total, err
|
||||
}
|
||||
|
||||
func (r *UserRepo) Update(u *model.User) error { return r.DB.Save(u).Error }
|
||||
|
||||
func (r *UserRepo) UpdateFields(id uint, fields map[string]interface{}) error {
|
||||
return r.DB.Model(&model.User{}).Where("id = ?", id).Updates(fields).Error
|
||||
}
|
||||
|
||||
func (r *UserRepo) Delete(id uint) error { return r.DB.Delete(&model.User{}, id).Error }
|
||||
|
||||
// UpdateStorageUsed 增减用户已用存储(delta可正可负)
|
||||
func (r *UserRepo) UpdateStorageUsed(id uint, delta int64) error {
|
||||
return r.DB.Model(&model.User{}).Where("id = ?", id).
|
||||
UpdateColumn("storage_used", gorm.Expr("storage_used + ?", delta)).Error
|
||||
}
|
||||
|
||||
// ---- API Key ----
|
||||
|
||||
// APIKeyRepo API密钥数据访问
|
||||
type APIKeyRepo struct{ DB *gorm.DB }
|
||||
|
||||
func (r *APIKeyRepo) Create(k *model.APIKey) error { return r.DB.Create(k).Error }
|
||||
|
||||
func (r *APIKeyRepo) FindByID(id uint) (*model.APIKey, error) {
|
||||
var k model.APIKey
|
||||
err := r.DB.First(&k, id).Error
|
||||
return &k, err
|
||||
}
|
||||
|
||||
func (r *APIKeyRepo) FindByAccessKey(accessKey string) (*model.APIKey, error) {
|
||||
var k model.APIKey
|
||||
err := r.DB.Where("access_key = ?", accessKey).First(&k).Error
|
||||
return &k, err
|
||||
}
|
||||
|
||||
func (r *APIKeyRepo) ListByUser(userID uint) ([]model.APIKey, error) {
|
||||
var keys []model.APIKey
|
||||
err := r.DB.Where("user_id = ?", userID).Order("id DESC").Find(&keys).Error
|
||||
return keys, err
|
||||
}
|
||||
|
||||
func (r *APIKeyRepo) Delete(id, userID uint) error {
|
||||
return r.DB.Where("id = ? AND user_id = ?", id, userID).Delete(&model.APIKey{}).Error
|
||||
}
|
||||
|
||||
func (r *APIKeyRepo) Touch(id uint) error {
|
||||
return r.DB.Model(&model.APIKey{}).Where("id = ?", id).
|
||||
UpdateColumn("last_used_at", gorm.Expr("CURRENT_TIMESTAMP")).Error
|
||||
}
|
||||
Reference in New Issue
Block a user