sysRolePermModel.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package roleperm
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "strings"
  7. "github.com/zeromicro/go-zero/core/stores/cache"
  8. "github.com/zeromicro/go-zero/core/stores/sqlx"
  9. )
  10. var _ SysRolePermModel = (*customSysRolePermModel)(nil)
  11. type (
  12. SysRolePermModel interface {
  13. sysRolePermModel
  14. FindPermIdsByRoleId(ctx context.Context, roleId int64) ([]int64, error)
  15. FindPermIdsByRoleIds(ctx context.Context, roleIds []int64) ([]int64, error)
  16. DeleteByRoleIdTx(ctx context.Context, session sqlx.Session, roleId int64) error
  17. DeleteByRoleIdAndPermIdsTx(ctx context.Context, session sqlx.Session, roleId int64, permIds []int64) error
  18. }
  19. customSysRolePermModel struct {
  20. *defaultSysRolePermModel
  21. }
  22. )
  23. func NewSysRolePermModel(conn sqlx.SqlConn, c cache.CacheConf, cachePrefix string, opts ...cache.Option) SysRolePermModel {
  24. return &customSysRolePermModel{
  25. defaultSysRolePermModel: newSysRolePermModel(conn, c, cachePrefix, opts...),
  26. }
  27. }
  28. func (m *customSysRolePermModel) FindPermIdsByRoleId(ctx context.Context, roleId int64) ([]int64, error) {
  29. var ids []int64
  30. query := fmt.Sprintf("SELECT `permId` FROM %s WHERE `roleId` = ?", m.table)
  31. if err := m.QueryRowsNoCacheCtx(ctx, &ids, query, roleId); err != nil {
  32. return nil, err
  33. }
  34. return ids, nil
  35. }
  36. func (m *customSysRolePermModel) FindPermIdsByRoleIds(ctx context.Context, roleIds []int64) ([]int64, error) {
  37. if len(roleIds) == 0 {
  38. return nil, nil
  39. }
  40. placeholders := make([]string, len(roleIds))
  41. args := make([]interface{}, len(roleIds))
  42. for i, id := range roleIds {
  43. placeholders[i] = "?"
  44. args[i] = id
  45. }
  46. var ids []int64
  47. query := fmt.Sprintf("SELECT DISTINCT `permId` FROM %s WHERE `roleId` IN (%s)", m.table, strings.Join(placeholders, ","))
  48. if err := m.QueryRowsNoCacheCtx(ctx, &ids, query, args...); err != nil {
  49. return nil, err
  50. }
  51. return ids, nil
  52. }
  53. func (m *customSysRolePermModel) buildCacheKeys(list []*SysRolePerm) []string {
  54. keys := make([]string, 0, len(list)*2)
  55. for _, data := range list {
  56. keys = append(keys,
  57. fmt.Sprintf("%s%v", cacheSysRolePermIdPrefix, data.Id),
  58. fmt.Sprintf("%s%v:%v", cacheSysRolePermRoleIdPermIdPrefix, data.RoleId, data.PermId),
  59. )
  60. }
  61. return keys
  62. }
  63. func (m *customSysRolePermModel) DeleteByRoleIdTx(ctx context.Context, session sqlx.Session, roleId int64) error {
  64. var list []*SysRolePerm
  65. findQuery := fmt.Sprintf("SELECT %s FROM %s WHERE `roleId` = ? FOR UPDATE", sysRolePermRows, m.table)
  66. if err := session.QueryRowsCtx(ctx, &list, findQuery, roleId); err != nil {
  67. return err
  68. }
  69. if len(list) == 0 {
  70. return nil
  71. }
  72. keys := m.buildCacheKeys(list)
  73. _, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (sql.Result, error) {
  74. query := fmt.Sprintf("DELETE FROM %s WHERE `roleId` = ?", m.table)
  75. return session.ExecCtx(ctx, query, roleId)
  76. }, keys...)
  77. return err
  78. }
  79. func (m *customSysRolePermModel) DeleteByRoleIdAndPermIdsTx(ctx context.Context, session sqlx.Session, roleId int64, permIds []int64) error {
  80. if len(permIds) == 0 {
  81. return nil
  82. }
  83. placeholders := make([]string, len(permIds))
  84. args := make([]interface{}, 0, len(permIds)+1)
  85. args = append(args, roleId)
  86. for i, id := range permIds {
  87. placeholders[i] = "?"
  88. args = append(args, id)
  89. }
  90. inClause := strings.Join(placeholders, ",")
  91. var list []*SysRolePerm
  92. findQuery := fmt.Sprintf("SELECT %s FROM %s WHERE `roleId` = ? AND `permId` IN (%s) FOR UPDATE", sysRolePermRows, m.table, inClause)
  93. if err := session.QueryRowsCtx(ctx, &list, findQuery, args...); err != nil {
  94. return err
  95. }
  96. if len(list) == 0 {
  97. return nil
  98. }
  99. keys := m.buildCacheKeys(list)
  100. _, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (sql.Result, error) {
  101. query := fmt.Sprintf("DELETE FROM %s WHERE `roleId` = ? AND `permId` IN (%s)", m.table, inClause)
  102. return session.ExecCtx(ctx, query, args...)
  103. }, keys...)
  104. return err
  105. }