feat(admin): 完善后台角色管理与权限同步,新增当前管理员信息接口
This commit is contained in:
@@ -25,23 +25,7 @@ function makeAdminWithPermissions(string $username, array $permissionSlugs): str
|
||||
'name' => 'Role '.$username,
|
||||
]);
|
||||
|
||||
$codes = [];
|
||||
foreach ($permissionSlugs as $slug) {
|
||||
$codes = array_merge($codes, AdminPermissionBridge::menuActionCodesForLegacy($slug));
|
||||
}
|
||||
$codes = array_values(array_unique($codes));
|
||||
$ids = DB::table('admin_menu_actions')
|
||||
->whereIn('permission_code', $codes)
|
||||
->where('status', 1)
|
||||
->pluck('id')
|
||||
->all();
|
||||
|
||||
foreach ($ids as $mid) {
|
||||
DB::table('admin_role_menu_actions')->insert([
|
||||
'role_id' => $role->id,
|
||||
'menu_action_id' => (int) $mid,
|
||||
]);
|
||||
}
|
||||
$role->syncLegacyPermissionSlugs($permissionSlugs);
|
||||
|
||||
$siteId = AdminUser::defaultAdminSiteId();
|
||||
$admin->roles()->sync([
|
||||
@@ -129,7 +113,7 @@ test('admin can list users and sync direct permissions', function (): void {
|
||||
});
|
||||
|
||||
test('admin can sync user roles for default site', function (): void {
|
||||
$token = makeAdminWithPermissions('rbac_role_editor', ['prd.admin_user.manage']);
|
||||
$token = makeAdminWithPermissions('rbac_role_editor', ['prd.admin_user.manage', 'prd.admin_role.manage']);
|
||||
|
||||
$r1 = AdminRole::query()->create(['slug' => 'role_sync_a', 'name' => 'Role A']);
|
||||
$r2 = AdminRole::query()->create(['slug' => 'role_sync_b', 'name' => 'Role B']);
|
||||
@@ -154,6 +138,104 @@ test('admin can sync user roles for default site', function (): void {
|
||||
expect($slugs)->toBe(['role_sync_a', 'role_sync_b']);
|
||||
});
|
||||
|
||||
test('permission catalog groups permissions by admin navigation order', function (): void {
|
||||
$token = makeAdminWithPermissions('nav_group_catalog', ['prd.admin_user.manage', 'prd.admin_role.manage']);
|
||||
|
||||
$groups = $this->withHeader('Authorization', 'Bearer '.$token)
|
||||
->getJson('/api/v1/admin/admin-user-permission-catalog')
|
||||
->assertOk()
|
||||
->json('data.permission_menu_groups');
|
||||
|
||||
expect(array_column($groups, 'key'))->toBe([
|
||||
'admin_users',
|
||||
'admin_roles',
|
||||
'players',
|
||||
'wallet',
|
||||
'draws',
|
||||
'config',
|
||||
'risk',
|
||||
'settlement',
|
||||
'reconcile',
|
||||
'tickets',
|
||||
'reports',
|
||||
'audit',
|
||||
]);
|
||||
expect($groups[0]['label'])->toBe('管理列表');
|
||||
expect(array_column($groups[0]['permissions'], 'slug'))->toBe(['prd.admin_user.manage']);
|
||||
expect($groups[1]['label'])->toBe('角色管理');
|
||||
expect(array_column($groups[1]['permissions'], 'slug'))->toBe(['prd.admin_role.manage']);
|
||||
|
||||
$groupsByKey = collect($groups)->keyBy('key');
|
||||
expect(array_column($groupsByKey['tickets']['permissions'], 'slug'))->toBe([
|
||||
'prd.users.view_cs',
|
||||
'prd.users.manage',
|
||||
'prd.report.player',
|
||||
]);
|
||||
expect(array_column($groupsByKey['config']['permissions'], 'slug'))->toContain(
|
||||
'prd.jackpot.manage',
|
||||
'prd.jackpot.view',
|
||||
);
|
||||
expect(array_column($groupsByKey['reconcile']['permissions'], 'slug'))->toBe([
|
||||
'prd.wallet_reconcile.manage',
|
||||
'prd.wallet_reconcile.view',
|
||||
'prd.wallet_reconcile.view_cs',
|
||||
]);
|
||||
});
|
||||
|
||||
test('admin can repair role permissions from the full catalog after role creation', function (): void {
|
||||
$token = makeAdminWithPermissions('role_permission_repairer', ['prd.admin_user.manage', 'prd.admin_role.manage']);
|
||||
|
||||
$catalog = $this->withHeader('Authorization', 'Bearer '.$token)
|
||||
->getJson('/api/v1/admin/admin-user-permission-catalog')
|
||||
->assertOk()
|
||||
->json('data');
|
||||
|
||||
$catalogSlugs = collect($catalog['permission_menu_groups'])
|
||||
->flatMap(static fn (array $group): array => array_column($group['permissions'], 'slug'))
|
||||
->unique()
|
||||
->values()
|
||||
->all();
|
||||
|
||||
expect($catalogSlugs)
|
||||
->toContain('prd.admin_user.manage')
|
||||
->toContain('prd.admin_role.manage')
|
||||
->toContain('prd.report.player')
|
||||
->toContain('prd.wallet_reconcile.manage');
|
||||
|
||||
$role = $this->withHeader('Authorization', 'Bearer '.$token)
|
||||
->postJson('/api/v1/admin/admin-roles', [
|
||||
'slug' => 'repairable_role',
|
||||
'name' => 'Repairable Role',
|
||||
'permission_slugs' => [],
|
||||
])
|
||||
->assertOk()
|
||||
->assertJsonPath('data.permission_slugs', [])
|
||||
->json('data');
|
||||
|
||||
$this->withHeader('Authorization', 'Bearer '.$token)
|
||||
->putJson('/api/v1/admin/admin-roles/'.$role['id'].'/permissions', [
|
||||
'permission_slugs' => ['prd.report.player', 'prd.wallet_reconcile.manage'],
|
||||
])
|
||||
->assertOk()
|
||||
->assertJsonPath('data.slug', 'repairable_role')
|
||||
->assertJsonPath('data.permission_slugs', ['prd.report.player', 'prd.wallet_reconcile.manage']);
|
||||
|
||||
$this->withHeader('Authorization', 'Bearer '.$token)
|
||||
->putJson('/api/v1/admin/admin-roles/'.$role['id'].'/permissions', [
|
||||
'permission_slugs' => ['prd.admin_role.manage'],
|
||||
])
|
||||
->assertOk()
|
||||
->assertJsonPath('data.permission_slugs', ['prd.admin_role.manage']);
|
||||
|
||||
$persistedPermissions = $this->withHeader('Authorization', 'Bearer '.$token)
|
||||
->getJson('/api/v1/admin/admin-roles')
|
||||
->assertOk()
|
||||
->json('data.items');
|
||||
|
||||
$persistedRole = collect($persistedPermissions)->firstWhere('slug', 'repairable_role');
|
||||
expect($persistedRole['permission_slugs'])->toBe(['prd.admin_role.manage']);
|
||||
});
|
||||
|
||||
test('admin can create update and delete users with crud rules', function (): void {
|
||||
$token = makeAdminWithPermissions('crud_actor', ['prd.admin_user.manage']);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user