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;
 | 
					    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 () => {
 | 
					test('should return personal dashboard with membered projects', async () => {
 | 
				
			||||||
    const { body: user1 } = await loginUser('user1@test.com');
 | 
					    const { body: user1 } = await loginUser('user1@test.com');
 | 
				
			||||||
    const projectA = await createProject('Project A', user1);
 | 
					    const projectA = await createProject('Project A', user1);
 | 
				
			||||||
@ -118,6 +125,36 @@ test('should return personal dashboard with membered projects', async () => {
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                name: projectC.name,
 | 
					                name: projectC.name,
 | 
				
			||||||
                id: projectC.id,
 | 
					                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,
 | 
					                memberCount: 1,
 | 
				
			||||||
                featureCount: 0,
 | 
					                featureCount: 0,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
				
			|||||||
@ -71,12 +71,13 @@ export class PersonalDashboardService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async getPersonalProjects(userId: number): Promise<PersonalProject[]> {
 | 
					    async getPersonalProjects(userId: number): Promise<PersonalProject[]> {
 | 
				
			||||||
        // TODO: add favorite projects in addition to membership projects
 | 
					        const [userProjectIds, userFavoritedProjectIds] = await Promise.all([
 | 
				
			||||||
        const userProjectIds =
 | 
					            this.projectReadModel.getProjectsByUser(userId),
 | 
				
			||||||
            await this.projectReadModel.getProjectsByUser(userId);
 | 
					            this.projectReadModel.getProjectsFavoritedByUser(userId),
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const projects = await this.projectReadModel.getProjectsForAdminUi({
 | 
					        const projects = await this.projectReadModel.getProjectsForAdminUi({
 | 
				
			||||||
            ids: userProjectIds,
 | 
					            ids: [...new Set([...userProjectIds, ...userFavoritedProjectIds])],
 | 
				
			||||||
            archived: false,
 | 
					            archived: false,
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,4 +17,7 @@ export class FakeProjectReadModel implements IProjectReadModel {
 | 
				
			|||||||
    getProjectsByUser(): Promise<string[]> {
 | 
					    getProjectsByUser(): Promise<string[]> {
 | 
				
			||||||
        return Promise.resolve([]);
 | 
					        return Promise.resolve([]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    getProjectsFavoritedByUser(): Promise<string[]> {
 | 
				
			||||||
 | 
					        return Promise.resolve([]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -38,4 +38,5 @@ export interface IProjectReadModel {
 | 
				
			|||||||
        featureName: string,
 | 
					        featureName: string,
 | 
				
			||||||
    ): Promise<{ project: string; createdAt: Date } | null>;
 | 
					    ): Promise<{ project: string; createdAt: Date } | null>;
 | 
				
			||||||
    getProjectsByUser(userId: number): Promise<string[]>;
 | 
					    getProjectsByUser(userId: number): Promise<string[]>;
 | 
				
			||||||
 | 
					    getProjectsFavoritedByUser(userId: number): Promise<string[]>;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -284,4 +284,16 @@ export class ProjectReadModel implements IProjectReadModel {
 | 
				
			|||||||
            .pluck('project');
 | 
					            .pluck('project');
 | 
				
			||||||
        return projects;
 | 
					        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