Skip to content
This repository was archived by the owner on Dec 30, 2024. It is now read-only.

Commit 25e6801

Browse files
fix/project factory class
1 parent 6709716 commit 25e6801

File tree

4 files changed

+105
-50
lines changed

4 files changed

+105
-50
lines changed

lib/src/api/dashboard/dashboard.service.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ export class DashboardService {
3939
project: Project,
4040
manager: EntityManager = this.entityManager
4141
) {
42+
const unix = dateUtils.toUnix();
4243
return await manager.getRepository(Dashboard).save({
4344
project,
4445
isEditable: true,
45-
createdAt: dateUtils.toUnix(),
46-
updatedAt: dateUtils.toUnix(),
46+
createdAt: unix,
47+
updatedAt: unix,
4748
...dto
4849
});
4950
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import { Injectable } from "@nestjs/common";
2+
import dateUtils from "../../common/helpers/dateUtils";
3+
import { gravatar } from "../../common/helpers/gravatar";
4+
import { uuidService } from "../../common/helpers/uuid";
5+
import { CreateProjectDto } from "../../common/types/dto/project.dto";
6+
import { Project } from "../../db/entities/project.entity";
7+
import { User } from "../../db/entities/user.entity";
8+
import { EntityManager } from "typeorm";
9+
import { MemberService } from "../member/member.service";
10+
import { UserQueryService } from "../user/user-query/user-query.service";
11+
import { ADMIN_EMAIL, ADMIN_NAME } from "../../common/helpers/constants";
12+
import { MemberRole } from "@traceo/types";
13+
import { RequestContext } from "../../common/middlewares/request-context/request-context.model";
14+
import { DashboardService } from "../dashboard/dashboard.service";
15+
16+
@Injectable()
17+
export class ProjectFactory {
18+
19+
constructor(
20+
private readonly manager: EntityManager,
21+
private readonly memberService: MemberService,
22+
private readonly userQueryService: UserQueryService,
23+
private readonly dashboardService: DashboardService
24+
) { }
25+
26+
public async create(user: User, dto: CreateProjectDto, manager = this.manager) {
27+
const { username } = RequestContext.user
28+
const unix = dateUtils.toUnix();
29+
30+
const payload: Partial<Project> = {
31+
...dto,
32+
id: this.uuid,
33+
createdAt: unix,
34+
updatedAt: unix,
35+
owner: user,
36+
gravatar: this.gravatar(dto.name)
37+
};
38+
39+
const project = await this.manager.getRepository(Project).save(payload);
40+
if (!project) {
41+
return null;
42+
}
43+
44+
if (username !== ADMIN_NAME) {
45+
const admin = await this.userQueryService.getDtoBy({ email: ADMIN_EMAIL });
46+
await this.createMember(admin, project, manager);
47+
}
48+
49+
await this.createMember(user, project, manager);
50+
51+
const dashboard = await this.createDashboard(project, manager);
52+
if (!dashboard) {
53+
return null;
54+
}
55+
56+
project.mainDashboardId = dashboard.id;
57+
58+
await manager.getRepository(Project).update({ id: project.id }, {
59+
updatedAt: dateUtils.toUnix(),
60+
mainDashboardId: dashboard.id
61+
});
62+
63+
return project;
64+
}
65+
66+
private async createDashboard(project: Project, manager = this.manager) {
67+
return await this.dashboardService.create({
68+
name: "Base Dashboard",
69+
description: undefined,
70+
isEditable: false,
71+
isTimePicker: false,
72+
isBase: true
73+
},
74+
project,
75+
manager
76+
);
77+
}
78+
79+
private async createMember(user: User, project: Project, manager = this.manager) {
80+
await this.memberService.createMember(user, project, MemberRole.ADMINISTRATOR, manager);
81+
}
82+
83+
private get uuid() {
84+
return uuidService.generate();
85+
}
86+
87+
private gravatar(name: string) {
88+
return gravatar.url(name, "identicon");
89+
}
90+
}

lib/src/api/project/project.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { UserQueryService } from "../user/user-query/user-query.service";
99
import { ProjectsController } from "./projects.controller";
1010
import { DashboardService } from "../dashboard/dashboard.service";
1111
import { DashboardQueryService } from "../dashboard/dashboard-query/dashboard-query.service";
12+
import { ProjectFactory } from "./project.factory";
1213

1314
@Module({
1415
imports: [PassportModule.register({ defaultStrategy: "jwt" })],
@@ -19,7 +20,8 @@ import { DashboardQueryService } from "../dashboard/dashboard-query/dashboard-qu
1920
MemberQueryService,
2021
UserQueryService,
2122
DashboardService,
22-
DashboardQueryService
23+
DashboardQueryService,
24+
ProjectFactory
2325
],
2426
controllers: [ProjectsController, ProjectController],
2527
exports: [ProjectService, ProjectQueryService]

lib/src/api/project/project.service.ts

Lines changed: 9 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,32 @@
11
import { Injectable, Logger } from "@nestjs/common";
2-
import { MemberService } from "../member/member.service";
32
import { EntityManager } from "typeorm";
43
import * as crypto from "crypto";
54
import { ProjectQueryService } from "./project-query/project-query.service";
65
import { UserQueryService } from "../user/user-query/user-query.service";
7-
import { ADMIN_NAME, ADMIN_EMAIL, INTERNAL_SERVER_ERROR } from "../../common/helpers/constants";
6+
import { INTERNAL_SERVER_ERROR } from "../../common/helpers/constants";
87
import dateUtils from "../../common/helpers/dateUtils";
9-
import { gravatar } from "../../common/helpers/gravatar";
10-
import { uuidService } from "../../common/helpers/uuid";
118
import { CreateProjectDto, ProjectDto } from "../../common/types/dto/project.dto";
129
import { Project } from "../../db/entities/project.entity";
1310
import { ApiResponse } from "../../common/types/dto/response.dto";
14-
import { MemberRole, UserStatus } from "@traceo/types";
11+
import { UserStatus } from "@traceo/types";
1512
import { RequestContext } from "../../common/middlewares/request-context/request-context.model";
16-
import { DashboardService } from "../dashboard/dashboard.service";
17-
import { initialDashboardPanels } from "../dashboard/base.dashboards";
13+
import { ProjectFactory } from "./project.factory";
1814

1915
@Injectable()
2016
export class ProjectService {
2117
private readonly logger: Logger;
2218

2319
constructor(
2420
private readonly entityManager: EntityManager,
25-
private readonly memberService: MemberService,
2621
private readonly projectQueryService: ProjectQueryService,
2722
private readonly userQueryService: UserQueryService,
28-
private readonly dashboardService: DashboardService
23+
private readonly projectFactory: ProjectFactory
2924
) {
3025
this.logger = new Logger(ProjectService.name);
3126
}
3227

3328
public async create(dto: CreateProjectDto): Promise<ApiResponse<Project>> {
34-
const { id, username } = RequestContext.user;
29+
const { id } = RequestContext.user;
3530

3631
return this.entityManager
3732
.transaction(async (manager) => {
@@ -47,46 +42,13 @@ export class ProjectService {
4742
throw new Error(INTERNAL_SERVER_ERROR);
4843
}
4944

50-
const url = gravatar.url(dto.name, "identicon");
51-
const payload: Partial<Project> = {
52-
...dto,
53-
id: uuidService.generate(),
54-
createdAt: dateUtils.toUnix(),
55-
updatedAt: dateUtils.toUnix(),
56-
owner: user,
57-
gravatar: url
58-
};
59-
60-
const project = await manager.getRepository(Project).save(payload);
61-
if (username !== ADMIN_NAME) {
62-
const admin = await this.userQueryService.getDtoBy({ email: ADMIN_EMAIL });
63-
await this.memberService.createMember(
64-
admin,
65-
project,
66-
MemberRole.ADMINISTRATOR,
67-
manager
68-
);
45+
const project = await this.projectFactory.create(user, dto, manager);
46+
if (!project) {
47+
return new ApiResponse("error", "Error while creating the project. Please try again later.", undefined);
6948
}
7049

71-
await this.memberService.createMember(user, project, MemberRole.ADMINISTRATOR, manager);
72-
73-
// Create basic dashboard
74-
const dashboard = await this.dashboardService.create(
75-
{
76-
name: "Base Dashboard",
77-
description: undefined,
78-
isEditable: false,
79-
isTimePicker: false,
80-
isBase: true
81-
},
82-
project,
83-
manager
84-
);
85-
86-
await this.update(project.id, { mainDashboardId: dashboard.id }, manager);
87-
8850
return new ApiResponse("success", "Project successfully created", {
89-
redirectUrl: `/project/${project.id}/dashboard/${dashboard.id}`,
51+
redirectUrl: `/project/${project.id}/dashboard/${project.mainDashboardId}`,
9052
id: project.id
9153
});
9254
})

0 commit comments

Comments
 (0)