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