add role based permissions

This commit is contained in:
Aditya Siregar
2025-08-19 21:29:37 +07:00
parent 7d5f061a1b
commit 6da48504fa
12 changed files with 461 additions and 12 deletions
+79 -1
View File
@@ -27,7 +27,7 @@ func (r *RBACRepository) DeletePermission(ctx context.Context, id uuid.UUID) err
}
func (r *RBACRepository) ListPermissions(ctx context.Context) ([]entities.Permission, error) {
var perms []entities.Permission
if err := r.db.WithContext(ctx).Order("code ASC").Find(&perms).Error; err != nil {
if err := r.db.WithContext(ctx).Preload("Module").Order("code ASC").Find(&perms).Error; err != nil {
return nil, err
}
return perms, nil
@@ -86,6 +86,7 @@ func (r *RBACRepository) SetRolePermissionsByCodes(ctx context.Context, roleID u
func (r *RBACRepository) GetPermissionsByRoleID(ctx context.Context, roleID uuid.UUID) ([]entities.Permission, error) {
var perms []entities.Permission
if err := r.db.WithContext(ctx).
Preload("Module").
Table("permissions p").
Select("p.*").
Joins("JOIN role_permissions rp ON rp.permission_id = p.id").
@@ -95,3 +96,80 @@ func (r *RBACRepository) GetPermissionsByRoleID(ctx context.Context, roleID uuid
}
return perms, nil
}
// Modules
func (r *RBACRepository) CreateModule(ctx context.Context, m *entities.Module) error {
return r.db.WithContext(ctx).Create(m).Error
}
func (r *RBACRepository) UpdateModule(ctx context.Context, m *entities.Module) error {
return r.db.WithContext(ctx).Model(&entities.Module{}).Where("id = ?", m.ID).Updates(m).Error
}
func (r *RBACRepository) DeleteModule(ctx context.Context, id uuid.UUID) error {
return r.db.WithContext(ctx).Delete(&entities.Module{}, "id = ?", id).Error
}
func (r *RBACRepository) ListModules(ctx context.Context) ([]entities.Module, error) {
var modules []entities.Module
if err := r.db.WithContext(ctx).Order("name ASC").Find(&modules).Error; err != nil {
return nil, err
}
return modules, nil
}
func (r *RBACRepository) GetModuleByCode(ctx context.Context, code string) (*entities.Module, error) {
var m entities.Module
if err := r.db.WithContext(ctx).First(&m, "code = ?", code).Error; err != nil {
return nil, err
}
return &m, nil
}
func (r *RBACRepository) GetModuleByID(ctx context.Context, id uuid.UUID) (*entities.Module, error) {
var m entities.Module
if err := r.db.WithContext(ctx).First(&m, "id = ?", id).Error; err != nil {
return nil, err
}
return &m, nil
}
func (r *RBACRepository) GetPermissionsGroupedByModule(ctx context.Context) ([]entities.Module, error) {
var modules []entities.Module
if err := r.db.WithContext(ctx).
Preload("Permissions", func(db *gorm.DB) *gorm.DB {
return db.Order("action ASC")
}).
Find(&modules).Error; err != nil {
return nil, err
}
return modules, nil
}
func (r *RBACRepository) GetRoleByID(ctx context.Context, id uuid.UUID) (*entities.Role, error) {
var role entities.Role
if err := r.db.WithContext(ctx).First(&role, "id = ?", id).Error; err != nil {
return nil, err
}
return &role, nil
}
func (r *RBACRepository) SetRolePermissionsByIDs(ctx context.Context, roleID uuid.UUID, permissionIDs []uuid.UUID) error {
return r.db.Transaction(func(tx *gorm.DB) error {
// Delete existing permissions
if err := tx.WithContext(ctx).Where("role_id = ?", roleID).Delete(&entities.RolePermission{}).Error; err != nil {
return err
}
// Add new permissions
if len(permissionIDs) == 0 {
return nil
}
pairs := make([]entities.RolePermission, 0, len(permissionIDs))
for _, permID := range permissionIDs {
pairs = append(pairs, entities.RolePermission{RoleID: roleID, PermissionID: permID})
}
return tx.WithContext(ctx).Create(&pairs).Error
})
}