mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: include favorite projects in personal dashboard (#8309)
This commit is contained in:
		
							parent
							
								
									6d16fc60ce
								
							
						
					
					
						commit
						b037bfb71c
					
				| @ -81,6 +81,13 @@ const createProject = async (name: string, user: IUser) => { | ||||
|     return project; | ||||
| }; | ||||
| 
 | ||||
| const favoriteProject = async (projectName = 'default') => { | ||||
|     await app.request | ||||
|         .post(`/api/admin/projects/${projectName}/favorites`) | ||||
|         .set('Content-Type', 'application/json') | ||||
|         .expect(200); | ||||
| }; | ||||
| 
 | ||||
| test('should return personal dashboard with membered projects', async () => { | ||||
|     const { body: user1 } = await loginUser('user1@test.com'); | ||||
|     const projectA = await createProject('Project A', user1); | ||||
| @ -118,6 +125,36 @@ test('should return personal dashboard with membered projects', async () => { | ||||
|             { | ||||
|                 name: projectC.name, | ||||
|                 id: projectC.id, | ||||
|                 health: 100, | ||||
|                 memberCount: 1, | ||||
|                 featureCount: 0, | ||||
|             }, | ||||
|         ], | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| test('should return personal dashboard with user favorited projects', async () => { | ||||
|     const { body: user1 } = await loginUser('user1@test.com'); | ||||
|     const projectA = await createProject('Project A', user1); | ||||
| 
 | ||||
|     await loginUser('user2@test.com'); | ||||
|     await favoriteProject(projectA.id); | ||||
| 
 | ||||
|     const { body } = await app.request.get(`/api/admin/personal-dashboard`); | ||||
| 
 | ||||
|     expect(body).toMatchObject({ | ||||
|         projects: [ | ||||
|             { | ||||
|                 name: 'Default', | ||||
|                 id: 'default', | ||||
|                 health: 100, | ||||
|                 memberCount: 0, | ||||
|                 featureCount: 0, | ||||
|             }, | ||||
|             { | ||||
|                 name: projectA.name, | ||||
|                 id: projectA.id, | ||||
|                 health: 100, | ||||
|                 memberCount: 1, | ||||
|                 featureCount: 0, | ||||
|             }, | ||||
|  | ||||
| @ -71,12 +71,13 @@ export class PersonalDashboardService { | ||||
|     } | ||||
| 
 | ||||
|     async getPersonalProjects(userId: number): Promise<PersonalProject[]> { | ||||
|         // TODO: add favorite projects in addition to membership projects
 | ||||
|         const userProjectIds = | ||||
|             await this.projectReadModel.getProjectsByUser(userId); | ||||
|         const [userProjectIds, userFavoritedProjectIds] = await Promise.all([ | ||||
|             this.projectReadModel.getProjectsByUser(userId), | ||||
|             this.projectReadModel.getProjectsFavoritedByUser(userId), | ||||
|         ]); | ||||
| 
 | ||||
|         const projects = await this.projectReadModel.getProjectsForAdminUi({ | ||||
|             ids: userProjectIds, | ||||
|             ids: [...new Set([...userProjectIds, ...userFavoritedProjectIds])], | ||||
|             archived: false, | ||||
|         }); | ||||
| 
 | ||||
|  | ||||
| @ -17,4 +17,7 @@ export class FakeProjectReadModel implements IProjectReadModel { | ||||
|     getProjectsByUser(): Promise<string[]> { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
|     getProjectsFavoritedByUser(): Promise<string[]> { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -38,4 +38,5 @@ export interface IProjectReadModel { | ||||
|         featureName: string, | ||||
|     ): Promise<{ project: string; createdAt: Date } | null>; | ||||
|     getProjectsByUser(userId: number): Promise<string[]>; | ||||
|     getProjectsFavoritedByUser(userId: number): Promise<string[]>; | ||||
| } | ||||
|  | ||||
| @ -284,4 +284,16 @@ export class ProjectReadModel implements IProjectReadModel { | ||||
|             .pluck('project'); | ||||
|         return projects; | ||||
|     } | ||||
| 
 | ||||
|     async getProjectsFavoritedByUser(userId: number): Promise<string[]> { | ||||
|         const favoritedProjects = await this.db | ||||
|             .select('favorite_projects.project') | ||||
|             .from('favorite_projects') | ||||
|             .leftJoin('projects', 'favorite_projects.project', 'projects.id') | ||||
|             .where('favorite_projects.user_id', userId) | ||||
|             .andWhere('projects.archived_at', null) | ||||
|             .pluck('project'); | ||||
| 
 | ||||
|         return favoritedProjects; | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user