初始化
This commit is contained in:
72
server/repository/department_repo.go
Normal file
72
server/repository/department_repo.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
)
|
||||
|
||||
// DepartmentRepository 部门数据访问
|
||||
type DepartmentRepository struct{}
|
||||
|
||||
func NewDepartmentRepository() *DepartmentRepository {
|
||||
return &DepartmentRepository{}
|
||||
}
|
||||
|
||||
// Create 创建部门
|
||||
func (r *DepartmentRepository) Create(dept *model.Department) error {
|
||||
return config.DB.Create(dept).Error
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找部门
|
||||
func (r *DepartmentRepository) FindByID(id uint64) (*model.Department, error) {
|
||||
var dept model.Department
|
||||
err := config.DB.First(&dept, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &dept, nil
|
||||
}
|
||||
|
||||
// List 查询所有部门
|
||||
func (r *DepartmentRepository) List() ([]model.Department, error) {
|
||||
var depts []model.Department
|
||||
err := config.DB.Order("sort_order ASC, id ASC").Find(&depts).Error
|
||||
return depts, err
|
||||
}
|
||||
|
||||
// ListByParent 查询子部门
|
||||
func (r *DepartmentRepository) ListByParent(parentID uint64) ([]model.Department, error) {
|
||||
var depts []model.Department
|
||||
err := config.DB.Where("parent_id = ?", parentID).Order("sort_order ASC, id ASC").Find(&depts).Error
|
||||
return depts, err
|
||||
}
|
||||
|
||||
// Update 更新部门
|
||||
func (r *DepartmentRepository) Update(dept *model.Department) error {
|
||||
return config.DB.Save(dept).Error
|
||||
}
|
||||
|
||||
// Delete 删除部门
|
||||
func (r *DepartmentRepository) Delete(id uint64) error {
|
||||
// 检查是否有子部门
|
||||
var count int64
|
||||
config.DB.Model(&model.Department{}).Where("parent_id = ?", id).Count(&count)
|
||||
if count > 0 {
|
||||
return nil // 有子部门不允许删除, 由service层处理错误
|
||||
}
|
||||
return config.DB.Delete(&model.Department{}, id).Error
|
||||
}
|
||||
|
||||
// HasChildren 检查是否有子部门
|
||||
func (r *DepartmentRepository) HasChildren(id uint64) (bool, error) {
|
||||
var count int64
|
||||
err := config.DB.Model(&model.Department{}).Where("parent_id = ?", id).Count(&count).Error
|
||||
return count > 0, err
|
||||
}
|
||||
|
||||
// CountUsers 统计部门下的用户数
|
||||
func (r *DepartmentRepository) CountUsers(deptID uint64) (int64, error) {
|
||||
var count int64
|
||||
err := config.DB.Model(&model.User{}).Where("dept_id = ?", deptID).Count(&count).Error
|
||||
return count, err
|
||||
}
|
||||
288
server/repository/file_repo.go
Normal file
288
server/repository/file_repo.go
Normal file
@@ -0,0 +1,288 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
)
|
||||
|
||||
// FileRepository 文件数据访问
|
||||
type FileRepository struct{}
|
||||
|
||||
// NewFileRepository 创建文件Repository实例
|
||||
func NewFileRepository() *FileRepository {
|
||||
return &FileRepository{}
|
||||
}
|
||||
|
||||
// Create 创建文件记录
|
||||
func (r *FileRepository) Create(file *model.File) error {
|
||||
return config.DB.Create(file).Error
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找文件
|
||||
func (r *FileRepository) FindByID(id uint64) (*model.File, error) {
|
||||
var file model.File
|
||||
err := config.DB.First(&file, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &file, nil
|
||||
}
|
||||
|
||||
// FindByMD5 根据MD5查找文件(用于秒传)
|
||||
func (r *FileRepository) FindByMD5(md5 string) (*model.File, error) {
|
||||
var file model.File
|
||||
err := config.DB.Where("md5 = ? AND status = 1", md5).First(&file).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &file, nil
|
||||
}
|
||||
|
||||
// ListByFolder 查询文件夹下的文件列表(基于权限)
|
||||
// 使用 LEFT JOIN 一次性查出, 避免子查询
|
||||
func (r *FileRepository) ListByFolder(folderID uint64, userID uint64, roleIDs []uint64) ([]model.File, error) {
|
||||
var files []model.File
|
||||
|
||||
// 构建权限条件: 自己的 OR 直接授权 OR 角色授权
|
||||
permCond := "f.owner_id = ?"
|
||||
args := []interface{}{userID}
|
||||
|
||||
// 直接授权
|
||||
permCond += " OR fp_user.user_id = ?"
|
||||
args = append(args, userID)
|
||||
|
||||
// 角色授权
|
||||
if len(roleIDs) > 0 {
|
||||
permCond += " OR fp_role.role_id IN ?"
|
||||
args = append(args, roleIDs)
|
||||
}
|
||||
|
||||
query := config.DB.Table("fs_file f").
|
||||
Select("DISTINCT f.*").
|
||||
Joins("LEFT JOIN fs_file_permission fp_user ON fp_user.file_id = f.id AND fp_user.user_id = ?", userID)
|
||||
|
||||
if len(roleIDs) > 0 {
|
||||
query = query.Joins("LEFT JOIN fs_file_permission fp_role ON fp_role.file_id = f.id AND fp_role.role_id IN ?", roleIDs)
|
||||
}
|
||||
|
||||
query = query.Where("f.folder_id = ? AND f.status = 1 AND ("+permCond+")", append([]interface{}{folderID}, args...)...).
|
||||
Order("f.name ASC")
|
||||
|
||||
err := query.Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
// ListByOwner 查询用户的所有文件(仅自己的)
|
||||
func (r *FileRepository) ListByOwner(ownerID uint64) ([]model.File, error) {
|
||||
var files []model.File
|
||||
err := config.DB.Where("owner_id = ? AND status = 1", ownerID).
|
||||
Order("created_at DESC").Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
// SearchByName 按文件名搜索(基于权限, 使用JOIN优化)
|
||||
func (r *FileRepository) SearchByName(userID uint64, roleIDs []uint64, keyword string) ([]model.File, error) {
|
||||
var files []model.File
|
||||
|
||||
// 权限条件
|
||||
permCond := "f.owner_id = ? OR fp_user.user_id = ?"
|
||||
args := []interface{}{userID, userID}
|
||||
if len(roleIDs) > 0 {
|
||||
permCond += " OR fp_role.role_id IN ?"
|
||||
args = append(args, roleIDs)
|
||||
}
|
||||
|
||||
query := config.DB.Table("fs_file f").
|
||||
Select("DISTINCT f.*").
|
||||
Joins("LEFT JOIN fs_file_permission fp_user ON fp_user.file_id = f.id AND fp_user.user_id = ?", userID)
|
||||
|
||||
if len(roleIDs) > 0 {
|
||||
query = query.Joins("LEFT JOIN fs_file_permission fp_role ON fp_role.file_id = f.id AND fp_role.role_id IN ?", roleIDs)
|
||||
}
|
||||
|
||||
query = query.Where("f.status = 1 AND ("+permCond+")", args...)
|
||||
|
||||
// 多关键词: 用|分隔, OR匹配
|
||||
if keyword != "" {
|
||||
keywords := splitKeywords(keyword)
|
||||
if len(keywords) > 1 {
|
||||
conditions := make([]string, 0, len(keywords))
|
||||
args := make([]interface{}, 0, len(keywords))
|
||||
for _, kw := range keywords {
|
||||
conditions = append(conditions, "name LIKE ?")
|
||||
args = append(args, "%"+kw+"%")
|
||||
}
|
||||
query = query.Where("("+joinStrings(conditions, " OR ")+")", args...)
|
||||
} else {
|
||||
query = query.Where("name LIKE ?", "%"+keywords[0]+"%")
|
||||
}
|
||||
}
|
||||
|
||||
err := query.Order("created_at DESC").Limit(200).Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
// SearchByType 按文件类型搜索
|
||||
func (r *FileRepository) SearchByType(ownerID uint64, extensions []string) ([]model.File, error) {
|
||||
var files []model.File
|
||||
err := config.DB.Where("owner_id = ? AND status = 1 AND extension IN ?", ownerID, extensions).
|
||||
Order("created_at DESC").Limit(200).Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
// SearchByPolicy 按存储策略搜索(管理员用)
|
||||
func (r *FileRepository) SearchByPolicy(policyID uint64) ([]model.File, error) {
|
||||
var files []model.File
|
||||
err := config.DB.Where("storage_policy_id = ? AND status = 1", policyID).
|
||||
Order("created_at DESC").Limit(500).Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
func splitKeywords(s string) []string {
|
||||
var result []string
|
||||
for _, kw := range splitByChar(s, '|') {
|
||||
kw = trimSpace(kw)
|
||||
if kw != "" {
|
||||
result = append(result, kw)
|
||||
}
|
||||
}
|
||||
if len(result) == 0 {
|
||||
result = []string{s}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func splitByChar(s string, sep byte) []string {
|
||||
var result []string
|
||||
start := 0
|
||||
for i := 0; i < len(s); i++ {
|
||||
if s[i] == sep {
|
||||
result = append(result, s[start:i])
|
||||
start = i + 1
|
||||
}
|
||||
}
|
||||
result = append(result, s[start:])
|
||||
return result
|
||||
}
|
||||
|
||||
func trimSpace(s string) string {
|
||||
start, end := 0, len(s)
|
||||
for start < end && s[start] == ' ' {
|
||||
start++
|
||||
}
|
||||
for end > start && s[end-1] == ' ' {
|
||||
end--
|
||||
}
|
||||
return s[start:end]
|
||||
}
|
||||
|
||||
func joinStrings(strs []string, sep string) string {
|
||||
if len(strs) == 0 {
|
||||
return ""
|
||||
}
|
||||
result := strs[0]
|
||||
for i := 1; i < len(strs); i++ {
|
||||
result += sep + strs[i]
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// ListTrashed 查询回收站文件
|
||||
func (r *FileRepository) ListTrashed(ownerID uint64) ([]model.File, error) {
|
||||
var files []model.File
|
||||
err := config.DB.Where("owner_id = ? AND status = 0", ownerID).
|
||||
Order("updated_at DESC").Find(&files).Error
|
||||
return files, err
|
||||
}
|
||||
|
||||
// Update 更新文件信息
|
||||
func (r *FileRepository) Update(file *model.File) error {
|
||||
return config.DB.Save(file).Error
|
||||
}
|
||||
|
||||
// SoftDelete 软删除(移入回收站)
|
||||
func (r *FileRepository) SoftDelete(id uint64) error {
|
||||
return config.DB.Model(&model.File{}).Where("id = ?", id).Update("status", 0).Error
|
||||
}
|
||||
|
||||
// Restore 从回收站恢复
|
||||
func (r *FileRepository) Restore(id uint64) error {
|
||||
return config.DB.Model(&model.File{}).Where("id = ?", id).Update("status", 1).Error
|
||||
}
|
||||
|
||||
// HardDelete 永久删除
|
||||
func (r *FileRepository) HardDelete(id uint64) error {
|
||||
return config.DB.Unscoped().Delete(&model.File{}, id).Error
|
||||
}
|
||||
|
||||
// IncrementDownloadCount 增加下载次数
|
||||
func (r *FileRepository) IncrementDownloadCount(id uint64) error {
|
||||
return config.DB.Model(&model.File{}).Where("id = ?", id).
|
||||
Update("download_count", config.DB.Raw("download_count + 1")).Error
|
||||
}
|
||||
|
||||
// CountByOwner 统计用户文件数
|
||||
func (r *FileRepository) CountByOwner(ownerID uint64) (int64, error) {
|
||||
var count int64
|
||||
err := config.DB.Model(&model.File{}).Where("owner_id = ? AND status = 1", ownerID).Count(&count).Error
|
||||
return count, err
|
||||
}
|
||||
|
||||
// SumSizeByOwner 统计用户文件总大小
|
||||
func (r *FileRepository) SumSizeByOwner(ownerID uint64) (int64, error) {
|
||||
var total int64
|
||||
err := config.DB.Model(&model.File{}).Where("owner_id = ? AND status = 1", ownerID).
|
||||
Select("COALESCE(SUM(size), 0)").Scan(&total).Error
|
||||
return total, err
|
||||
}
|
||||
|
||||
// PolicyStats 存储策略统计
|
||||
type PolicyStats struct {
|
||||
PolicyID uint64 `json:"policy_id"`
|
||||
PolicyName string `json:"policy_name"`
|
||||
PolicyType string `json:"policy_type"`
|
||||
FileCount int64 `json:"file_count"`
|
||||
TotalSize int64 `json:"total_size"`
|
||||
UserCount int64 `json:"user_count"`
|
||||
}
|
||||
|
||||
// GetPolicyStats 获取所有存储策略的使用统计
|
||||
func (r *FileRepository) GetPolicyStats() ([]PolicyStats, error) {
|
||||
var stats []PolicyStats
|
||||
err := config.DB.Raw(`
|
||||
SELECT
|
||||
f.storage_policy_id as policy_id,
|
||||
COALESCE(sp.name, '未知') as policy_name,
|
||||
COALESCE(sp.policy_type, '') as policy_type,
|
||||
COUNT(*) as file_count,
|
||||
COALESCE(SUM(f.size), 0) as total_size,
|
||||
COUNT(DISTINCT f.owner_id) as user_count
|
||||
FROM fs_file f
|
||||
LEFT JOIN fs_storage_policy sp ON sp.id = f.storage_policy_id
|
||||
WHERE f.status = 1
|
||||
GROUP BY f.storage_policy_id, sp.name, sp.policy_type
|
||||
ORDER BY total_size DESC
|
||||
`).Scan(&stats).Error
|
||||
return stats, err
|
||||
}
|
||||
|
||||
// GetGlobalStats 获取全局统计
|
||||
func (r *FileRepository) GetGlobalStats() (map[string]interface{}, error) {
|
||||
var totalFiles int64
|
||||
var totalSize int64
|
||||
var totalUsers int64
|
||||
|
||||
config.DB.Model(&model.File{}).Where("status = 1").Count(&totalFiles)
|
||||
config.DB.Model(&model.File{}).Where("status = 1").Select("COALESCE(SUM(size), 0)").Scan(&totalSize)
|
||||
config.DB.Model(&model.File{}).Where("status = 1").Distinct("owner_id").Count(&totalUsers)
|
||||
|
||||
var totalFolders int64
|
||||
config.DB.Model(&model.Folder{}).Where("status = 1").Count(&totalFolders)
|
||||
|
||||
return map[string]interface{}{
|
||||
"total_files": totalFiles,
|
||||
"total_size": totalSize,
|
||||
"total_folders": totalFolders,
|
||||
"total_users": totalUsers,
|
||||
}, nil
|
||||
}
|
||||
94
server/repository/folder_repo.go
Normal file
94
server/repository/folder_repo.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
)
|
||||
|
||||
// FolderRepository 文件夹数据访问
|
||||
type FolderRepository struct{}
|
||||
|
||||
// NewFolderRepository 创建文件夹Repository实例
|
||||
func NewFolderRepository() *FolderRepository {
|
||||
return &FolderRepository{}
|
||||
}
|
||||
|
||||
// Create 创建文件夹
|
||||
func (r *FolderRepository) Create(folder *model.Folder) error {
|
||||
return config.DB.Create(folder).Error
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找文件夹
|
||||
func (r *FolderRepository) FindByID(id uint64) (*model.Folder, error) {
|
||||
var folder model.Folder
|
||||
err := config.DB.First(&folder, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &folder, nil
|
||||
}
|
||||
|
||||
// ListByParent 查询子文件夹列表
|
||||
func (r *FolderRepository) ListByParent(parentID uint64, ownerID uint64) ([]model.Folder, error) {
|
||||
var folders []model.Folder
|
||||
err := config.DB.Where("parent_id = ? AND owner_id = ? AND status = 1", parentID, ownerID).
|
||||
Order("name ASC").Find(&folders).Error
|
||||
return folders, err
|
||||
}
|
||||
|
||||
// FindByPath 根据路径查找文件夹
|
||||
func (r *FolderRepository) FindByPath(path string, ownerID uint64) (*model.Folder, error) {
|
||||
var folder model.Folder
|
||||
err := config.DB.Where("path = ? AND owner_id = ? AND status = 1", path, ownerID).First(&folder).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &folder, nil
|
||||
}
|
||||
|
||||
// FindByNameAndParent 根据名称和父文件夹查找(用于判断重名)
|
||||
func (r *FolderRepository) FindByNameAndParent(name string, parentID uint64, ownerID uint64) (*model.Folder, error) {
|
||||
var folder model.Folder
|
||||
err := config.DB.Where("name = ? AND parent_id = ? AND owner_id = ? AND status = 1",
|
||||
name, parentID, ownerID).First(&folder).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &folder, nil
|
||||
}
|
||||
|
||||
// ListTrashed 查询回收站文件夹
|
||||
func (r *FolderRepository) ListTrashed(ownerID uint64) ([]model.Folder, error) {
|
||||
var folders []model.Folder
|
||||
err := config.DB.Where("owner_id = ? AND status = 0", ownerID).
|
||||
Order("updated_at DESC").Find(&folders).Error
|
||||
return folders, err
|
||||
}
|
||||
|
||||
// Update 更新文件夹
|
||||
func (r *FolderRepository) Update(folder *model.Folder) error {
|
||||
return config.DB.Save(folder).Error
|
||||
}
|
||||
|
||||
// SoftDelete 软删除
|
||||
func (r *FolderRepository) SoftDelete(id uint64) error {
|
||||
return config.DB.Model(&model.Folder{}).Where("id = ?", id).Update("status", 0).Error
|
||||
}
|
||||
|
||||
// Restore 从回收站恢复
|
||||
func (r *FolderRepository) Restore(id uint64) error {
|
||||
return config.DB.Model(&model.Folder{}).Where("id = ?", id).Update("status", 1).Error
|
||||
}
|
||||
|
||||
// HardDelete 永久删除
|
||||
func (r *FolderRepository) HardDelete(id uint64) error {
|
||||
return config.DB.Unscoped().Delete(&model.Folder{}, id).Error
|
||||
}
|
||||
|
||||
// GetChildrenPath 获取所有子孙文件夹的路径前缀(用于级联操作)
|
||||
func (r *FolderRepository) GetChildrenByPath(pathPrefix string, ownerID uint64) ([]model.Folder, error) {
|
||||
var folders []model.Folder
|
||||
err := config.DB.Where("path LIKE ? AND owner_id = ?",
|
||||
pathPrefix+"%", ownerID).Find(&folders).Error
|
||||
return folders, err
|
||||
}
|
||||
82
server/repository/permission_repo.go
Normal file
82
server/repository/permission_repo.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// PermissionRepository 权限数据访问
|
||||
type PermissionRepository struct{}
|
||||
|
||||
func NewPermissionRepository() *PermissionRepository {
|
||||
return &PermissionRepository{}
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找权限
|
||||
func (r *PermissionRepository) FindByID(id uint64) (*model.Permission, error) {
|
||||
var perm model.Permission
|
||||
err := config.DB.First(&perm, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &perm, nil
|
||||
}
|
||||
|
||||
// FindByCode 根据权限标识查找
|
||||
func (r *PermissionRepository) FindByCode(code string) (*model.Permission, error) {
|
||||
var perm model.Permission
|
||||
err := config.DB.Where("code = ?", code).First(&perm).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &perm, nil
|
||||
}
|
||||
|
||||
// List 查询所有权限
|
||||
func (r *PermissionRepository) List() ([]model.Permission, error) {
|
||||
var perms []model.Permission
|
||||
err := config.DB.Order("resource ASC, action ASC").Find(&perms).Error
|
||||
return perms, err
|
||||
}
|
||||
|
||||
// ListByResource 按资源类型查询权限
|
||||
func (r *PermissionRepository) ListByResource(resource string) ([]model.Permission, error) {
|
||||
var perms []model.Permission
|
||||
err := config.DB.Where("resource = ?", resource).Order("action ASC").Find(&perms).Error
|
||||
return perms, err
|
||||
}
|
||||
|
||||
// GetUserPermissionCodes 获取用户的所有权限标识(通过角色)
|
||||
func (r *PermissionRepository) GetUserPermissionCodes(userID uint64) ([]string, error) {
|
||||
var codes []string
|
||||
err := config.DB.Table("fs_permission p").
|
||||
Select("DISTINCT p.code").
|
||||
Joins("JOIN fs_role_permission rp ON rp.permission_id = p.id").
|
||||
Joins("JOIN fs_user_role ur ON ur.role_id = rp.role_id").
|
||||
Where("ur.user_id = ?", userID).
|
||||
Pluck("p.code", &codes).Error
|
||||
return codes, err
|
||||
}
|
||||
|
||||
// Create 创建权限
|
||||
func (r *PermissionRepository) Create(perm *model.Permission) error {
|
||||
return config.DB.Create(perm).Error
|
||||
}
|
||||
|
||||
// Update 更新权限
|
||||
func (r *PermissionRepository) Update(perm *model.Permission) error {
|
||||
return config.DB.Save(perm).Error
|
||||
}
|
||||
|
||||
// Delete 删除权限
|
||||
func (r *PermissionRepository) Delete(id uint64) error {
|
||||
return config.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// 删除角色-权限关联
|
||||
if err := tx.Where("permission_id = ?", id).Delete(&model.RolePermission{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Delete(&model.Permission{}, id).Error
|
||||
})
|
||||
}
|
||||
86
server/repository/role_repo.go
Normal file
86
server/repository/role_repo.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// RoleRepository 角色数据访问
|
||||
type RoleRepository struct{}
|
||||
|
||||
func NewRoleRepository() *RoleRepository {
|
||||
return &RoleRepository{}
|
||||
}
|
||||
|
||||
// Create 创建角色
|
||||
func (r *RoleRepository) Create(role *model.Role) error {
|
||||
return config.DB.Create(role).Error
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找角色(含权限)
|
||||
func (r *RoleRepository) FindByID(id uint64) (*model.Role, error) {
|
||||
var role model.Role
|
||||
err := config.DB.Preload("Permissions").First(&role, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &role, nil
|
||||
}
|
||||
|
||||
// FindByName 根据标识查找角色
|
||||
func (r *RoleRepository) FindByName(name string) (*model.Role, error) {
|
||||
var role model.Role
|
||||
err := config.DB.Where("name = ?", name).First(&role).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &role, nil
|
||||
}
|
||||
|
||||
// List 查询所有角色
|
||||
func (r *RoleRepository) List() ([]model.Role, error) {
|
||||
var roles []model.Role
|
||||
err := config.DB.Preload("Permissions").Order("id ASC").Find(&roles).Error
|
||||
return roles, err
|
||||
}
|
||||
|
||||
// Update 更新角色
|
||||
func (r *RoleRepository) Update(role *model.Role) error {
|
||||
return config.DB.Save(role).Error
|
||||
}
|
||||
|
||||
// Delete 删除角色(仅非系统角色)
|
||||
func (r *RoleRepository) Delete(id uint64) error {
|
||||
return config.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// 删除角色-权限关联
|
||||
if err := tx.Where("role_id = ?", id).Delete(&model.RolePermission{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
// 删除用户-角色关联
|
||||
if err := tx.Where("role_id = ?", id).Delete(&model.UserRole{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
// 删除角色
|
||||
return tx.Delete(&model.Role{}, id).Error
|
||||
})
|
||||
}
|
||||
|
||||
// SetPermissions 设置角色权限(全量替换)
|
||||
func (r *RoleRepository) SetPermissions(roleID uint64, permissionIDs []uint64) error {
|
||||
return config.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// 先删除旧关联
|
||||
if err := tx.Where("role_id = ?", roleID).Delete(&model.RolePermission{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
// 插入新关联
|
||||
for _, pid := range permissionIDs {
|
||||
rp := model.RolePermission{RoleID: roleID, PermissionID: pid}
|
||||
if err := tx.Create(&rp).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
63
server/repository/share_repo.go
Normal file
63
server/repository/share_repo.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
)
|
||||
|
||||
// ShareRepository 分享数据访问
|
||||
type ShareRepository struct{}
|
||||
|
||||
// NewShareRepository 创建分享Repository实例
|
||||
func NewShareRepository() *ShareRepository {
|
||||
return &ShareRepository{}
|
||||
}
|
||||
|
||||
// Create 创建分享记录
|
||||
func (r *ShareRepository) Create(share *model.Share) error {
|
||||
return config.DB.Create(share).Error
|
||||
}
|
||||
|
||||
// FindByShareCode 根据分享码查找
|
||||
func (r *ShareRepository) FindByShareCode(code string) (*model.Share, error) {
|
||||
var share model.Share
|
||||
err := config.DB.Where("share_code = ? AND status = 1", code).First(&share).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &share, nil
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找
|
||||
func (r *ShareRepository) FindByID(id uint64) (*model.Share, error) {
|
||||
var share model.Share
|
||||
err := config.DB.First(&share, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &share, nil
|
||||
}
|
||||
|
||||
// ListByOwner 查询用户的分享列表
|
||||
func (r *ShareRepository) ListByOwner(ownerID uint64) ([]model.Share, error) {
|
||||
var shares []model.Share
|
||||
err := config.DB.Where("owner_id = ? AND status = 1", ownerID).
|
||||
Order("created_at DESC").Find(&shares).Error
|
||||
return shares, err
|
||||
}
|
||||
|
||||
// IncrementDownloadCount 增加下载次数
|
||||
func (r *ShareRepository) IncrementDownloadCount(id uint64) error {
|
||||
return config.DB.Model(&model.Share{}).Where("id = ?", id).
|
||||
Update("download_count", config.DB.Raw("download_count + 1")).Error
|
||||
}
|
||||
|
||||
// Cancel 取消分享
|
||||
func (r *ShareRepository) Cancel(id uint64) error {
|
||||
return config.DB.Model(&model.Share{}).Where("id = ?", id).Update("status", 0).Error
|
||||
}
|
||||
|
||||
// Delete 永久删除
|
||||
func (r *ShareRepository) Delete(id uint64) error {
|
||||
return config.DB.Unscoped().Delete(&model.Share{}, id).Error
|
||||
}
|
||||
94
server/repository/sso_repo.go
Normal file
94
server/repository/sso_repo.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// SSORepository SSO数据访问
|
||||
type SSORepository struct{}
|
||||
|
||||
func NewSSORepository() *SSORepository {
|
||||
return &SSORepository{}
|
||||
}
|
||||
|
||||
// ========== SSO 提供商 ==========
|
||||
|
||||
// CreateProvider 创建SSO提供商
|
||||
func (r *SSORepository) CreateProvider(provider *model.SSOProvider) error {
|
||||
return config.DB.Create(provider).Error
|
||||
}
|
||||
|
||||
// FindProviderByID 根据ID查找提供商
|
||||
func (r *SSORepository) FindProviderByID(id uint64) (*model.SSOProvider, error) {
|
||||
var provider model.SSOProvider
|
||||
err := config.DB.First(&provider, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &provider, nil
|
||||
}
|
||||
|
||||
// ListProviders 查询所有启用的提供商
|
||||
func (r *SSORepository) ListProviders() ([]model.SSOProvider, error) {
|
||||
var providers []model.SSOProvider
|
||||
err := config.DB.Where("status = 1").Order("sort_order ASC, id ASC").Find(&providers).Error
|
||||
return providers, err
|
||||
}
|
||||
|
||||
// ListAllProviders 查询所有提供商(含禁用)
|
||||
func (r *SSORepository) ListAllProviders() ([]model.SSOProvider, error) {
|
||||
var providers []model.SSOProvider
|
||||
err := config.DB.Order("sort_order ASC, id ASC").Find(&providers).Error
|
||||
return providers, err
|
||||
}
|
||||
|
||||
// UpdateProvider 更新提供商
|
||||
func (r *SSORepository) UpdateProvider(provider *model.SSOProvider) error {
|
||||
return config.DB.Save(provider).Error
|
||||
}
|
||||
|
||||
// DeleteProvider 删除提供商
|
||||
func (r *SSORepository) DeleteProvider(id uint64) error {
|
||||
return config.DB.Transaction(func(tx *gorm.DB) error {
|
||||
if err := tx.Where("provider_id = ?", id).Delete(&model.SSOSession{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Delete(&model.SSOProvider{}, id).Error
|
||||
})
|
||||
}
|
||||
|
||||
// ========== SSO 会话 ==========
|
||||
|
||||
// CreateSession 创建SSO会话
|
||||
func (r *SSORepository) CreateSession(session *model.SSOSession) error {
|
||||
return config.DB.Create(session).Error
|
||||
}
|
||||
|
||||
// FindSessionByExternalID 根据外部用户ID查找会话
|
||||
func (r *SSORepository) FindSessionByExternalID(providerID uint64, externalID string) (*model.SSOSession, error) {
|
||||
var session model.SSOSession
|
||||
err := config.DB.Where("provider_id = ? AND external_id = ?", providerID, externalID).
|
||||
First(&session).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &session, nil
|
||||
}
|
||||
|
||||
// FindSessionByUserID 根据本地用户ID查找SSO会话
|
||||
func (r *SSORepository) FindSessionByUserID(userID uint64) (*model.SSOSession, error) {
|
||||
var session model.SSOSession
|
||||
err := config.DB.Where("user_id = ?", userID).Order("last_login_at DESC").First(&session).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &session, nil
|
||||
}
|
||||
|
||||
// UpdateSession 更新会话
|
||||
func (r *SSORepository) UpdateSession(session *model.SSOSession) error {
|
||||
return config.DB.Save(session).Error
|
||||
}
|
||||
45
server/repository/storage_policy_repo.go
Normal file
45
server/repository/storage_policy_repo.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
)
|
||||
|
||||
// StoragePolicyRepository 存储策略数据访问
|
||||
type StoragePolicyRepository struct{}
|
||||
|
||||
func NewStoragePolicyRepository() *StoragePolicyRepository {
|
||||
return &StoragePolicyRepository{}
|
||||
}
|
||||
|
||||
// Create 创建存储策略
|
||||
func (r *StoragePolicyRepository) Create(policy *model.StoragePolicy) error {
|
||||
return config.DB.Create(policy).Error
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找
|
||||
func (r *StoragePolicyRepository) FindByID(id uint64) (*model.StoragePolicy, error) {
|
||||
var policy model.StoragePolicy
|
||||
err := config.DB.First(&policy, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &policy, nil
|
||||
}
|
||||
|
||||
// List 查询所有存储策略
|
||||
func (r *StoragePolicyRepository) List() ([]model.StoragePolicy, error) {
|
||||
var policies []model.StoragePolicy
|
||||
err := config.DB.Order("id ASC").Find(&policies).Error
|
||||
return policies, err
|
||||
}
|
||||
|
||||
// Update 更新存储策略
|
||||
func (r *StoragePolicyRepository) Update(policy *model.StoragePolicy) error {
|
||||
return config.DB.Save(policy).Error
|
||||
}
|
||||
|
||||
// Delete 删除存储策略
|
||||
func (r *StoragePolicyRepository) Delete(id uint64) error {
|
||||
return config.DB.Delete(&model.StoragePolicy{}, id).Error
|
||||
}
|
||||
68
server/repository/user_repo.go
Normal file
68
server/repository/user_repo.go
Normal file
@@ -0,0 +1,68 @@
|
||||
// Package repository 提供数据访问层
|
||||
// 封装GORM的数据库操作, 供Service层调用
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
)
|
||||
|
||||
// UserRepository 用户数据访问
|
||||
type UserRepository struct{}
|
||||
|
||||
// NewUserRepository 创建用户Repository实例
|
||||
func NewUserRepository() *UserRepository {
|
||||
return &UserRepository{}
|
||||
}
|
||||
|
||||
// Create 创建用户
|
||||
func (r *UserRepository) Create(user *model.User) error {
|
||||
return config.DB.Create(user).Error
|
||||
}
|
||||
|
||||
// FindByID 根据ID查找用户
|
||||
func (r *UserRepository) FindByID(id uint64) (*model.User, error) {
|
||||
var user model.User
|
||||
err := config.DB.First(&user, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &user, nil
|
||||
}
|
||||
|
||||
// FindByUsername 根据用户名查找用户
|
||||
func (r *UserRepository) FindByUsername(username string) (*model.User, error) {
|
||||
var user model.User
|
||||
err := config.DB.Where("username = ?", username).First(&user).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &user, nil
|
||||
}
|
||||
|
||||
// Update 更新用户信息
|
||||
func (r *UserRepository) Update(user *model.User) error {
|
||||
return config.DB.Save(user).Error
|
||||
}
|
||||
|
||||
// UpdateStorageUsed 更新用户已用存储空间
|
||||
func (r *UserRepository) UpdateStorageUsed(userID uint64, delta int64) error {
|
||||
return config.DB.Model(&model.User{}).
|
||||
Where("id = ?", userID).
|
||||
Update("used_storage", config.DB.Raw("used_storage + ?", delta)).Error
|
||||
}
|
||||
|
||||
// List 分页查询用户列表
|
||||
func (r *UserRepository) List(page, size int) ([]model.User, int64, error) {
|
||||
var users []model.User
|
||||
var total int64
|
||||
|
||||
config.DB.Model(&model.User{}).Count(&total)
|
||||
err := config.DB.Offset((page - 1) * size).Limit(size).Order("id DESC").Find(&users).Error
|
||||
return users, total, err
|
||||
}
|
||||
|
||||
// Delete 删除用户(软删除)
|
||||
func (r *UserRepository) Delete(id uint64) error {
|
||||
return config.DB.Delete(&model.User{}, id).Error
|
||||
}
|
||||
53
server/repository/user_role_repo.go
Normal file
53
server/repository/user_role_repo.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"seeyon-filesystem/config"
|
||||
"seeyon-filesystem/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// UserRoleRepository 用户-角色关联数据访问
|
||||
type UserRoleRepository struct{}
|
||||
|
||||
func NewUserRoleRepository() *UserRoleRepository {
|
||||
return &UserRoleRepository{}
|
||||
}
|
||||
|
||||
// SetUserRoles 设置用户角色(全量替换)
|
||||
func (r *UserRoleRepository) SetUserRoles(userID uint64, roleIDs []uint64) error {
|
||||
return config.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// 先删除旧关联
|
||||
if err := tx.Where("user_id = ?", userID).Delete(&model.UserRole{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
// 插入新关联
|
||||
for _, rid := range roleIDs {
|
||||
ur := model.UserRole{UserID: userID, RoleID: rid}
|
||||
if err := tx.Create(&ur).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// GetUserRoles 获取用户的角色列表
|
||||
func (r *UserRoleRepository) GetUserRoles(userID uint64) ([]model.Role, error) {
|
||||
var roles []model.Role
|
||||
err := config.DB.Table("fs_role ro").
|
||||
Joins("JOIN fs_user_role ur ON ur.role_id = ro.id").
|
||||
Where("ur.user_id = ? AND ro.status = 1", userID).
|
||||
Find(&roles).Error
|
||||
return roles, err
|
||||
}
|
||||
|
||||
// GetRoleUsers 获取角色下的用户列表
|
||||
func (r *UserRoleRepository) GetRoleUsers(roleID uint64) ([]model.User, error) {
|
||||
var users []model.User
|
||||
err := config.DB.Table("fs_user u").
|
||||
Joins("JOIN fs_user_role ur ON ur.user_id = u.id").
|
||||
Where("ur.role_id = ?", roleID).
|
||||
Find(&users).Error
|
||||
return users, err
|
||||
}
|
||||
Reference in New Issue
Block a user