package service import ( "context" db "server/internal/db/sqlc" "server/internal/model/common" "server/internal/model/enum" "server/internal/model/request" "server/internal/pkg/cache" "server/internal/pkg/dberr" "server/internal/pkg/errs" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgxpool" ) type SysRoleService struct { queries *db.Queries pool *pgxpool.Pool cache *cache.Caches } func NewSysRoleService(queries *db.Queries, pool *pgxpool.Pool, cache *cache.Caches) *SysRoleService { return &SysRoleService{ queries: queries, pool: pool, cache: cache, } } func (s *SysRoleService) ListPage(ctx context.Context, p *common.Pagination) ([]db.SysRole, int64, error) { params := db.ListSysRolesParams{ Limit: p.PageSize, Offset: (p.Page - 1) * p.PageSize, } total, err := s.queries.CountSysRoles(ctx) if err != nil { return nil, 0, err } list, err := s.queries.ListSysRoles(ctx, params) if err != nil { return nil, 0, err } return list, total, nil } func (s *SysRoleService) GetRoles(ctx context.Context) ([]db.SysRole, error) { return s.queries.GetAllSysRoles(ctx) } func (s *SysRoleService) GetRoleMenus(ctx context.Context, id int32) ([]db.GetSysRoleMenusRow, error) { _, err := s.queries.GetSysRoleByID(ctx, id) if err != nil { return nil, dberr.MapNoRows(err, errs.ErrSysRoleNotFound) } return s.queries.GetSysRoleMenus(ctx, id) } func (s *SysRoleService) GetRoleApis(ctx context.Context, id int32) ([]db.GetSysRoleApisRow, error) { _, err := s.queries.GetSysRoleByID(ctx, id) if err != nil { return nil, dberr.MapNoRows(err, errs.ErrSysRoleNotFound) } return s.queries.GetSysRoleApis(ctx, id) } func (s *SysRoleService) Create(ctx context.Context, req request.CreateSysRoleRequest) error { params := db.CreateSysRoleParams{ Name: req.Name, Code: req.Code, } // 清理缓存 s.cache.ClearAllSysUserCache() err := s.queries.CreateSysRole(ctx, params) if err != nil { return dberr.MapUniqueViolation(err, dberr.SysRoleCodeKey, errs.ErrCodeAlreadyExists) } return nil } func (s *SysRoleService) Update(ctx context.Context, id int32, req request.UpdateSysRoleRequest) error { params := db.UpdateSysRoleParams{ ID: id, Name: req.Name, } // 清理缓存 s.cache.ClearAllSysUserCache() rows, err := s.queries.UpdateSysRole(ctx, params) return dberr.MapRowsAffected(rows, err, errs.ErrSysRoleNotFound) } func (s *SysRoleService) SetRoleMenus(ctx context.Context, roleID int32, req request.SetSysRoleMenusRequest) error { _, err := s.queries.GetSysRoleByID(ctx, roleID) if err != nil { return dberr.MapNoRows(err, errs.ErrSysRoleNotFound) } tx, err := s.pool.BeginTx(ctx, pgx.TxOptions{}) if err != nil { return err } defer func(ctx context.Context) { _ = tx.Rollback(ctx) }(ctx) q := db.New(tx) permissionIds, err := s.queries.GetSysPermissionIdsByMenuIDs(ctx, req.MenuIDs) if err != nil { return err } params := make([]db.CreateSysRolePermissionParams, 0, len(permissionIds)) for _, id := range permissionIds { params = append(params, db.CreateSysRolePermissionParams{ RoleID: roleID, PermissionID: id, }) } if err = q.DeleteSysRolePermission(ctx, db.DeleteSysRolePermissionParams{ RoleID: roleID, Type: int16(enum.PermissionTypeMenu), }); err != nil { return err } _, err = q.CreateSysRolePermission(ctx, params) if err != nil { return err } if err = tx.Commit(ctx); err != nil { return err } // 清理缓存 s.cache.ClearAllSysUserCache() return err } func (s *SysRoleService) SetRoleApis(ctx context.Context, roleID int32, req request.SetSysRoleApisRequest) error { _, err := s.queries.GetSysRoleByID(ctx, roleID) if err != nil { return dberr.MapNoRows(err, errs.ErrSysRoleNotFound) } tx, err := s.pool.BeginTx(ctx, pgx.TxOptions{}) if err != nil { return err } defer func(ctx context.Context) { _ = tx.Rollback(ctx) }(ctx) q := db.New(tx) permissionIds, err := s.queries.GetSysPermissionIdsByApiIDs(ctx, req.ApiIDs) if err != nil { return err } params := make([]db.CreateSysRolePermissionParams, 0, len(permissionIds)) for _, id := range permissionIds { params = append(params, db.CreateSysRolePermissionParams{ RoleID: roleID, PermissionID: id, }) } if err = q.DeleteSysRolePermission(ctx, db.DeleteSysRolePermissionParams{ RoleID: roleID, Type: int16(enum.PermissionTypeApi), }); err != nil { return err } _, err = q.CreateSysRolePermission(ctx, params) if err != nil { return err } if err = tx.Commit(ctx); err != nil { return err } // 清理缓存 s.cache.ClearAllSysUserCache() return err } func (s *SysRoleService) Delete(ctx context.Context, id int32) error { // 清理缓存 s.cache.ClearAllSysUserCache() rows, err := s.queries.DeleteSysRole(ctx, id) return dberr.MapRowsAffected(rows, err, errs.ErrSysRoleNotFound) }