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 }