sysRoleModel.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package role
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "github.com/zeromicro/go-zero/core/stores/cache"
  7. "github.com/zeromicro/go-zero/core/stores/sqlx"
  8. )
  9. var _ SysRoleModel = (*customSysRoleModel)(nil)
  10. type (
  11. SysRoleModel interface {
  12. sysRoleModel
  13. FindListByProductCode(ctx context.Context, productCode string, page, pageSize int64) ([]*SysRole, int64, error)
  14. FindByIds(ctx context.Context, ids []int64) ([]*SysRole, error)
  15. FindMinPermsLevelByUserIdAndProductCode(ctx context.Context, userId int64, productCode string) (int64, error)
  16. }
  17. customSysRoleModel struct {
  18. *defaultSysRoleModel
  19. }
  20. )
  21. func NewSysRoleModel(conn sqlx.SqlConn, c cache.CacheConf, cachePrefix string, opts ...cache.Option) SysRoleModel {
  22. return &customSysRoleModel{
  23. defaultSysRoleModel: newSysRoleModel(conn, c, cachePrefix, opts...),
  24. }
  25. }
  26. func (m *customSysRoleModel) FindListByProductCode(ctx context.Context, productCode string, page, pageSize int64) ([]*SysRole, int64, error) {
  27. var total int64
  28. countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `productCode` = ?", m.table)
  29. if err := m.QueryRowNoCacheCtx(ctx, &total, countQuery, productCode); err != nil {
  30. return nil, 0, err
  31. }
  32. var list []*SysRole
  33. query := fmt.Sprintf("SELECT %s FROM %s WHERE `productCode` = ? ORDER BY `permsLevel` ASC, id DESC LIMIT ?,?", sysRoleRows, m.table)
  34. if err := m.QueryRowsNoCacheCtx(ctx, &list, query, productCode, (page-1)*pageSize, pageSize); err != nil {
  35. return nil, 0, err
  36. }
  37. return list, total, nil
  38. }
  39. func (m *customSysRoleModel) FindByIds(ctx context.Context, ids []int64) ([]*SysRole, error) {
  40. if len(ids) == 0 {
  41. return nil, nil
  42. }
  43. args := make([]interface{}, len(ids))
  44. marks := make([]string, len(ids))
  45. for i, id := range ids {
  46. args[i] = id
  47. marks[i] = "?"
  48. }
  49. var list []*SysRole
  50. query := fmt.Sprintf("SELECT %s FROM %s WHERE `id` IN (%s)", sysRoleRows, m.table, strings.Join(marks, ","))
  51. if err := m.QueryRowsNoCacheCtx(ctx, &list, query, args...); err != nil {
  52. return nil, err
  53. }
  54. return list, nil
  55. }
  56. func (m *customSysRoleModel) FindMinPermsLevelByUserIdAndProductCode(ctx context.Context, userId int64, productCode string) (int64, error) {
  57. var level int64
  58. query := fmt.Sprintf(
  59. "SELECT IFNULL(MIN(r.`permsLevel`), -1) FROM %s r INNER JOIN `sys_user_role` ur ON r.`id` = ur.`roleId` WHERE ur.`userId` = ? AND r.`productCode` = ? AND r.`status` = 1",
  60. m.table,
  61. )
  62. if err := m.QueryRowNoCacheCtx(ctx, &level, query, userId, productCode); err != nil {
  63. return 0, err
  64. }
  65. if level < 0 {
  66. return 0, ErrNotFound
  67. }
  68. return level, nil
  69. }