mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: Return permissions on get role endpoint
This commit is contained in:
		
							parent
							
								
									8babe8cadf
								
							
						
					
					
						commit
						f8550790c5
					
				| @ -163,14 +163,27 @@ export class AccessStore implements IAccessStore { | ||||
|         return rows; | ||||
|     } | ||||
| 
 | ||||
|     async getPermissionsForRole(roleId: number): Promise<IUserPermission[]> { | ||||
|     async getPermissionsForRole(roleId: number): Promise<IPermission[]> { | ||||
|         const stopTimer = this.timer('getPermissionsForRole'); | ||||
|         const rows = await this.db | ||||
|             .select('project', 'permission', 'environment') | ||||
|             .from<IUserPermission>(`${T.ROLE_PERMISSION}`) | ||||
|             .where('role_id', '=', roleId); | ||||
|             .select('p.id', 'p.permission', 'p.environment', 'pt.display_name') | ||||
|             .from<IPermission>(`${T.ROLE_PERMISSION} as rp`) | ||||
|             .join(`${T.PERMISSIONS} as p`, 'p.id', 'rp.permission_id') | ||||
|             .join( | ||||
|                 `${T.PERMISSION_TYPES} as pt`, | ||||
|                 'pt.permission', | ||||
|                 'p.permission', | ||||
|             ) | ||||
|             .where('rp.role_id', '=', roleId); | ||||
|         stopTimer(); | ||||
|         return rows; | ||||
|         return rows.map((permission) => { | ||||
|             return { | ||||
|                 id: permission.id, | ||||
|                 name: permission.permission, | ||||
|                 environment: permission.environment, | ||||
|                 displayName: permission.display_name, | ||||
|             }; | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     async getRoles(): Promise<IRole[]> { | ||||
| @ -338,6 +351,13 @@ export class AccessStore implements IAccessStore { | ||||
|             `SELECT id FROM ${T.PERMISSIONS} where environment = ? and permission = ANY(?)`, | ||||
|             [environment, permissions], | ||||
|         ); | ||||
| 
 | ||||
|         console.log( | ||||
|             'Adding permissions to table', | ||||
|             role_id, | ||||
|             permissions, | ||||
|             environment, | ||||
|         ); | ||||
|         const ids = result.rows.map((x) => x.id); | ||||
| 
 | ||||
|         const rows = ids.map((permission_id) => ({ | ||||
| @ -345,19 +365,29 @@ export class AccessStore implements IAccessStore { | ||||
|             permission_id, | ||||
|         })); | ||||
| 
 | ||||
|         console.log('Final inssert', rows); | ||||
|         return this.db.batchInsert(T.ROLE_PERMISSION, rows); | ||||
|     } | ||||
| 
 | ||||
|     async removePermissionFromRole( | ||||
|         roleId: number, | ||||
|         role_id: number, | ||||
|         permission: string, | ||||
|         projectId?: string, | ||||
|         environment?: string, | ||||
|     ): Promise<void> { | ||||
|         const result = await this.db.raw( | ||||
|             `SELECT id FROM ${T.PERMISSIONS} where environment = ? and permission = ?`, | ||||
|             [environment, permission], | ||||
|         ); | ||||
| 
 | ||||
|         console.log('Gett results for ', environment, permission); | ||||
|         console.log('My result is', result); | ||||
| 
 | ||||
|         const permissionId = result.first(); | ||||
| 
 | ||||
|         return this.db(T.ROLE_PERMISSION) | ||||
|             .where({ | ||||
|                 role_id: roleId, | ||||
|                 permission, | ||||
|                 project: projectId, | ||||
|                 role_id, | ||||
|                 permissionId, | ||||
|             }) | ||||
|             .delete(); | ||||
|     } | ||||
|  | ||||
| @ -6,13 +6,13 @@ import { ICustomRole } from 'lib/types/model'; | ||||
| import { ICustomRoleInsert } from 'lib/types/stores/role-store'; | ||||
| 
 | ||||
| const TABLE = 'roles'; | ||||
| const COLUMNS = ['id', 'name', 'description', 'created_at']; | ||||
| const COLUMNS = ['id', 'name', 'description', 'type']; | ||||
| 
 | ||||
| interface IRoleRow { | ||||
|     id: number; | ||||
|     name: string; | ||||
|     description: string; | ||||
|     created_at: Date; | ||||
|     type: string; | ||||
| } | ||||
| 
 | ||||
| export default class RoleStore { | ||||
| @ -79,7 +79,7 @@ export default class RoleStore { | ||||
|             id: row.id, | ||||
|             name: row.name, | ||||
|             description: row.description, | ||||
|             createdAt: row.created_at, | ||||
|             type: row.type, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -198,14 +198,18 @@ export class AccessService { | ||||
|     async addPermissionToRole( | ||||
|         roleId: number, | ||||
|         permission: string, | ||||
|         projectId?: string, | ||||
|         environment?: string, | ||||
|     ): Promise<void> { | ||||
|         if (isProjectPermission(permission) && !projectId) { | ||||
|         if (isProjectPermission(permission) && !environment) { | ||||
|             throw new Error( | ||||
|                 `ProjectId cannot be empty for permission=${permission}`, | ||||
|             ); | ||||
|         } | ||||
|         return this.store.addPermissionsToRole(roleId, [permission], projectId); | ||||
|         return this.store.addPermissionsToRole( | ||||
|             roleId, | ||||
|             [permission], | ||||
|             environment, | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     async removePermissionFromRole( | ||||
|  | ||||
| @ -1,7 +1,10 @@ | ||||
| import { IUnleashConfig } from 'lib/server-impl'; | ||||
| import { IUnleashStores } from 'lib/types'; | ||||
| import { ICustomRole, IPermission } from 'lib/types/model'; | ||||
| import { IAccessStore } from 'lib/types/stores/access-store'; | ||||
| import { | ||||
|     IAccessStore, | ||||
|     IRoleWithPermissions, | ||||
| } from 'lib/types/stores/access-store'; | ||||
| import { IRoleStore } from 'lib/types/stores/role-store'; | ||||
| import { Logger } from '../logger'; | ||||
| 
 | ||||
| @ -34,8 +37,15 @@ export default class RoleService { | ||||
|         return this.store.getAll(); | ||||
|     } | ||||
| 
 | ||||
|     async get(id: number): Promise<ICustomRole> { | ||||
|         return this.store.get(id); | ||||
|     async get(id: number): Promise<IRoleWithPermissions> { | ||||
|         const role = await this.store.get(id); | ||||
|         const permissions = await this.accessStore.getPermissionsForRole( | ||||
|             role.id, | ||||
|         ); | ||||
|         return { | ||||
|             ...role, | ||||
|             permissions, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     async create(role: IRoleCreation): Promise<ICustomRole> { | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import { ITagType } from './stores/tag-type-store'; | ||||
| import { LogProvider } from '../logger'; | ||||
| import { IRole, IUserPermission } from './stores/access-store'; | ||||
| import { IRole } from './stores/access-store'; | ||||
| import { IUser } from './user'; | ||||
| 
 | ||||
| export interface IConstraint { | ||||
| @ -212,7 +212,7 @@ export interface IUserWithRole { | ||||
| export interface IRoleData { | ||||
|     role: IRole; | ||||
|     users: IUser[]; | ||||
|     permissions: IUserPermission[]; | ||||
|     permissions: IPermission[]; | ||||
| } | ||||
| 
 | ||||
| export interface IAvailablePermissions { | ||||
| @ -224,6 +224,7 @@ export interface IPermission { | ||||
|     id: number; | ||||
|     name: string; | ||||
|     displayName: string; | ||||
|     environment?: string; | ||||
| } | ||||
| 
 | ||||
| export interface IEnvironmentPermission { | ||||
| @ -328,7 +329,7 @@ export interface ICustomRole { | ||||
|     id: number; | ||||
|     name: string; | ||||
|     description: string; | ||||
|     createdAt: Date; | ||||
|     type: string; | ||||
| } | ||||
| 
 | ||||
| export interface IProjectWithCount extends IProject { | ||||
|  | ||||
| @ -14,6 +14,10 @@ export interface IRole { | ||||
|     type: string; | ||||
| } | ||||
| 
 | ||||
| export interface IRoleWithPermissions extends IRole { | ||||
|     permissions: IPermission[]; | ||||
| } | ||||
| 
 | ||||
| export interface IRoleDescriptor { | ||||
|     name: string; | ||||
|     description?: string; | ||||
| @ -28,7 +32,7 @@ export interface IAccessStore extends Store<IRole, number> { | ||||
|     getRoleByName(name: string): Promise<IRole>; | ||||
|     getAvailablePermissions(): Promise<IAvailablePermissions>; | ||||
|     getPermissionsForUser(userId: number): Promise<IUserPermission[]>; | ||||
|     getPermissionsForRole(roleId: number): Promise<IUserPermission[]>; | ||||
|     getPermissionsForRole(roleId: number): Promise<IPermission[]>; | ||||
|     getRoles(): Promise<IRole[]>; | ||||
|     getRolesForProject(projectId: string): Promise<IRole[]>; | ||||
|     unlinkUserRoles(userId: number): Promise<void>; | ||||
|  | ||||
| @ -4,6 +4,7 @@ import getLogger from '../../fixtures/no-logger'; | ||||
| // eslint-disable-next-line import/no-unresolved
 | ||||
| import { | ||||
|     AccessService, | ||||
|     ALL_ENVS, | ||||
|     ALL_PROJECTS, | ||||
| } from '../../../lib/services/access-service'; | ||||
| 
 | ||||
| @ -177,13 +178,13 @@ test('should remove CREATE_FEATURE on all projects', async () => { | ||||
|     await accessService.addPermissionToRole( | ||||
|         editorRole.id, | ||||
|         permissions.CREATE_FEATURE, | ||||
|         ALL_PROJECTS, | ||||
|         ALL_ENVS, | ||||
|     ); | ||||
| 
 | ||||
|     await accessService.removePermissionFromRole( | ||||
|         editorRole.id, | ||||
|         permissions.CREATE_FEATURE, | ||||
|         ALL_PROJECTS, | ||||
|         ALL_ENVS, | ||||
|     ); | ||||
| 
 | ||||
|     expect( | ||||
|  | ||||
							
								
								
									
										2
									
								
								src/test/fixtures/fake-access-store.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/test/fixtures/fake-access-store.ts
									
									
									
									
										vendored
									
									
								
							| @ -54,7 +54,7 @@ class AccessStoreMock implements IAccessStore { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     getPermissionsForRole(roleId: number): Promise<IUserPermission[]> { | ||||
|     getPermissionsForRole(roleId: number): Promise<IPermission[]> { | ||||
|         throw new Error('Method not implemented.'); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										6
									
								
								src/test/fixtures/fake-role-store.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								src/test/fixtures/fake-role-store.ts
									
									
									
									
										vendored
									
									
								
							| @ -12,7 +12,7 @@ export default class FakeRoleStore implements IRoleStore { | ||||
|             id: 1, | ||||
|             name: 'Role', | ||||
|             description: 'Hello', | ||||
|             createdAt: new Date(), | ||||
|             type: 'custom', | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| @ -22,7 +22,7 @@ export default class FakeRoleStore implements IRoleStore { | ||||
|                 id: 1, | ||||
|                 name: 'Role', | ||||
|                 description: 'Hello', | ||||
|                 createdAt: new Date(), | ||||
|                 type: 'custom', | ||||
|             }, | ||||
|         ]); | ||||
|     } | ||||
| @ -36,7 +36,7 @@ export default class FakeRoleStore implements IRoleStore { | ||||
|             id: 1, | ||||
|             name: 'Role', | ||||
|             description: 'Hello', | ||||
|             createdAt: new Date(), | ||||
|             type: 'custom', | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user