package postgres import ( "context" "gorm.io/gorm" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/internal/store" ) // PermissionStore 权限数据访问层 type PermissionStore struct { db *gorm.DB } // NewPermissionStore 创建权限 Store func NewPermissionStore(db *gorm.DB) *PermissionStore { return &PermissionStore{db: db} } // Create 创建权限 func (s *PermissionStore) Create(ctx context.Context, permission *model.Permission) error { return s.db.WithContext(ctx).Create(permission).Error } // GetByID 根据 ID 获取权限 func (s *PermissionStore) GetByID(ctx context.Context, id uint) (*model.Permission, error) { var permission model.Permission if err := s.db.WithContext(ctx).First(&permission, id).Error; err != nil { return nil, err } return &permission, nil } // GetByCode 根据权限编码获取权限 func (s *PermissionStore) GetByCode(ctx context.Context, code string) (*model.Permission, error) { var permission model.Permission if err := s.db.WithContext(ctx).Where("perm_code = ?", code).First(&permission).Error; err != nil { return nil, err } return &permission, nil } // Update 更新权限 func (s *PermissionStore) Update(ctx context.Context, permission *model.Permission) error { return s.db.WithContext(ctx).Save(permission).Error } // Delete 软删除权限 func (s *PermissionStore) Delete(ctx context.Context, id uint) error { return s.db.WithContext(ctx).Delete(&model.Permission{}, id).Error } // List 查询权限列表 func (s *PermissionStore) List(ctx context.Context, opts *store.QueryOptions, filters map[string]interface{}) ([]*model.Permission, int64, error) { var permissions []*model.Permission var total int64 query := s.db.WithContext(ctx).Model(&model.Permission{}) // 应用过滤条件 if name, ok := filters["perm_name"].(string); ok && name != "" { query = query.Where("perm_name LIKE ?", "%"+name+"%") } if code, ok := filters["perm_code"].(string); ok && code != "" { query = query.Where("perm_code LIKE ?", "%"+code+"%") } if permType, ok := filters["perm_type"].(int); ok { query = query.Where("perm_type = ?", permType) } if platform, ok := filters["platform"].(string); ok && platform != "" { query = query.Where("platform = ?", platform) } if parentID, ok := filters["parent_id"].(uint); ok { query = query.Where("parent_id = ?", parentID) } if status, ok := filters["status"].(int); ok { query = query.Where("status = ?", status) } // 计算总数 if err := query.Count(&total).Error; err != nil { return nil, 0, err } // 分页 if opts == nil { opts = store.DefaultQueryOptions() } offset := (opts.Page - 1) * opts.PageSize query = query.Offset(offset).Limit(opts.PageSize) // 排序 if opts.OrderBy != "" { query = query.Order(opts.OrderBy) } else { query = query.Order("sort ASC, id ASC") } // 执行查询 if err := query.Find(&permissions).Error; err != nil { return nil, 0, err } return permissions, total, nil } // GetByIDs 根据 ID 列表获取权限 func (s *PermissionStore) GetByIDs(ctx context.Context, ids []uint) ([]*model.Permission, error) { var permissions []*model.Permission if err := s.db.WithContext(ctx).Where("id IN ?", ids).Find(&permissions).Error; err != nil { return nil, err } return permissions, nil } // GetAll 获取所有权限(用于构建权限树) func (s *PermissionStore) GetAll(ctx context.Context) ([]*model.Permission, error) { var permissions []*model.Permission if err := s.db.WithContext(ctx).Order("sort ASC, id ASC").Find(&permissions).Error; err != nil { return nil, err } return permissions, nil } // GetByPlatform 根据端口获取权限列表 // platform: 端口类型(all/web/h5),如果为空则返回所有权限 func (s *PermissionStore) GetByPlatform(ctx context.Context, platform string) ([]*model.Permission, error) { var permissions []*model.Permission query := s.db.WithContext(ctx).Where("status = ?", 1) // 只获取启用的权限 if platform != "" { // 获取指定端口的权限或通用权限(platform='all') query = query.Where("platform = ? OR platform = ?", platform, "all") } if err := query.Order("sort ASC, id ASC").Find(&permissions).Error; err != nil { return nil, err } return permissions, nil }