1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-05-03 01:18:43 +02:00

feat: include favorite projects in personal dashboard (#8309)

This commit is contained in:
Mateusz Kwasniewski 2024-09-30 16:48:58 +02:00 committed by GitHub
parent 6d16fc60ce
commit b037bfb71c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 58 additions and 4 deletions

View File

@ -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,
},

View File

@ -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,
});

View File

@ -17,4 +17,7 @@ export class FakeProjectReadModel implements IProjectReadModel {
getProjectsByUser(): Promise<string[]> {
return Promise.resolve([]);
}
getProjectsFavoritedByUser(): Promise<string[]> {
return Promise.resolve([]);
}
}

View File

@ -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[]>;
}

View File

@ -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;
}
}