mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: expose user permissions (#791)
This commit is contained in:
		
							parent
							
								
									b55c85783b
								
							
						
					
					
						commit
						332f1c4544
					
				| @ -1,37 +0,0 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| const Controller = require('../controller'); | ||||
| 
 | ||||
| class UserController extends Controller { | ||||
|     constructor(config) { | ||||
|         super(config); | ||||
|         this.logger = config.getLogger('admin-api/user.js'); | ||||
|         this.get('/', this.getUser); | ||||
|         this.get('/logout', this.logout); | ||||
|     } | ||||
| 
 | ||||
|     getUser(req, res) { | ||||
|         if (req.user) { | ||||
|             const user = { ...req.user }; | ||||
|             delete user.permissions; // TODO: remove
 | ||||
|             return res | ||||
|                 .status(200) | ||||
|                 .json(user) | ||||
|                 .end(); | ||||
|         } | ||||
|         return res.status(404).end(); | ||||
|     } | ||||
| 
 | ||||
|     // Deprecated, use "/logout" instead.  Will be removed in v4.
 | ||||
|     logout(req, res) { | ||||
|         if (req.session) { | ||||
|             req.session = null; | ||||
|         } | ||||
|         if (req.logout) { | ||||
|             req.logout(); | ||||
|         } | ||||
|         res.redirect(`${this.config.baseUriPath}/`); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module.exports = UserController; | ||||
| @ -12,21 +12,28 @@ const eventBus = new EventEmitter(); | ||||
| 
 | ||||
| const currentUser = new User({ email: 'test@mail.com' }); | ||||
| 
 | ||||
| const fakeAccessService = { | ||||
|     getPermissionsForUser: () => [], | ||||
| }; | ||||
| 
 | ||||
| function getSetup() { | ||||
|     const base = `/random${Math.round(Math.random() * 1000)}`; | ||||
|     const stores = store.createStores(); | ||||
|     const app = getApp({ | ||||
|         baseUriPath: base, | ||||
|         stores, | ||||
|         eventBus, | ||||
|         getLogger, | ||||
|         preHook: a => { | ||||
|             a.use((req, res, next) => { | ||||
|                 req.user = currentUser; | ||||
|                 next(); | ||||
|             }); | ||||
|     const app = getApp( | ||||
|         { | ||||
|             baseUriPath: base, | ||||
|             stores, | ||||
|             eventBus, | ||||
|             getLogger, | ||||
|             preHook: a => { | ||||
|                 a.use((req, res, next) => { | ||||
|                     req.user = currentUser; | ||||
|                     next(); | ||||
|                 }); | ||||
|             }, | ||||
|         }, | ||||
|     }); | ||||
|         { accessService: fakeAccessService }, | ||||
|     ); | ||||
| 
 | ||||
|     return { | ||||
|         base, | ||||
| @ -44,7 +51,7 @@ test('should return current user', t => { | ||||
|         .expect(200) | ||||
|         .expect('Content-Type', /json/) | ||||
|         .expect(res => { | ||||
|             t.true(res.body.email === currentUser.email); | ||||
|             t.true(res.body.user.email === currentUser.email); | ||||
|         }); | ||||
| }); | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										52
									
								
								src/lib/routes/admin-api/user.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/lib/routes/admin-api/user.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| import { Response } from 'express'; | ||||
| import { IUnleashConfig } from '../../types/core'; | ||||
| import { IAuthRequest } from '../unleash-types'; | ||||
| import Controller from '../controller'; | ||||
| import { AccessService } from '../../services/access-service'; | ||||
| 
 | ||||
| interface IService { | ||||
|     accessService: AccessService; | ||||
| } | ||||
| 
 | ||||
| class UserController extends Controller { | ||||
|     private accessService: AccessService; | ||||
| 
 | ||||
|     constructor(config: IUnleashConfig, { accessService }: IService) { | ||||
|         super(config); | ||||
|         this.accessService = accessService; | ||||
| 
 | ||||
|         this.get('/', this.getUser); | ||||
|         this.get('/logout', this.logout); | ||||
|     } | ||||
| 
 | ||||
|     async getUser(req: IAuthRequest, res: Response): Promise<void> { | ||||
|         const { user } = req; | ||||
|         if (user) { | ||||
|             const permissions = await this.accessService.getPermissionsForUser( | ||||
|                 user, | ||||
|             ); | ||||
|             delete user.permissions; // TODO: remove
 | ||||
|             return res | ||||
|                 .status(200) | ||||
|                 .json({ user, permissions }) | ||||
|                 .end(); | ||||
|         } | ||||
|         return res.status(404).end(); | ||||
|     } | ||||
| 
 | ||||
|     // Deprecated, use "/logout" instead.  Will be removed in v4.
 | ||||
|     logout(req: IAuthRequest, res: Response): void { | ||||
|         if (req.session) { | ||||
|             req.session = null; | ||||
|         } | ||||
|         if (req.logout) { | ||||
|             req.logout(); | ||||
|         } | ||||
|         res.redirect(`${this.config.baseUriPath}/`); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module.exports = UserController; | ||||
| export default UserController; | ||||
| @ -3,4 +3,6 @@ import User from '../user'; | ||||
| 
 | ||||
| export interface IAuthRequest extends Request { | ||||
|     user: User; | ||||
|     logout: () => void; | ||||
|     session: any; | ||||
| } | ||||
|  | ||||
							
								
								
									
										2
									
								
								src/test/fixtures/fake-access-store.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/test/fixtures/fake-access-store.ts
									
									
									
									
										vendored
									
									
								
							| @ -13,7 +13,7 @@ class AccessStoreMock extends AccessStore { | ||||
|     } | ||||
| 
 | ||||
|     getPermissionsForUser(userId: Number): Promise<IUserPermission[]> { | ||||
|         throw new Error('Method not implemented.'); | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     getPermissionsForRole(roleId: number): Promise<IUserPermission[]> { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user