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:
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