Skip to content

Commit 4159679

Browse files
feat: 프로젝트 서비스에 멤버추가 메서드 구현
- addMember 메서드는 프로젝트 링크를 받아 프로젝트에 회원을 추가한다. - isProjectMember는 회원이 프로젝트의 회원인지 확인한다. - getProjectByLinkId는 프로젝트 링크로 프로젝트를 찾는다. Co-Authored-By: Suhjeong Kim <[email protected]>
1 parent ef3a5c8 commit 4159679

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

backend/src/project/service/project.service.spec.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ProjectService } from './project.service';
33
import { ProjectRepository } from '../project.repository';
44
import { Member } from 'src/member/entity/member.entity';
55
import { Project } from '../entity/project.entity';
6+
import { ProjectToMember } from '../entity/project-member.entity';
67

78
describe('ProjectService', () => {
89
let projectService: ProjectService;
@@ -19,6 +20,8 @@ describe('ProjectService', () => {
1920
addProjectMember: jest.fn(),
2021
getProjectList: jest.fn(),
2122
getProject: jest.fn(),
23+
getProjectByLinkId: jest.fn(),
24+
getProjectToMember: jest.fn(),
2225
},
2326
},
2427
],
@@ -81,4 +84,50 @@ describe('ProjectService', () => {
8184
expect(result).toEqual(project);
8285
});
8386
});
87+
88+
describe('Add Member', () => {
89+
const projectLinkId = 'inviteUuid';
90+
const project = Project.of('title', 'subject');
91+
it('should return void when given member, title, subject', async () => {
92+
jest
93+
.spyOn(projectRepository, 'getProjectByLinkId')
94+
.mockResolvedValue(project);
95+
jest
96+
.spyOn(projectRepository, 'getProjectToMember')
97+
.mockResolvedValue(null);
98+
99+
await projectService.addMember(projectLinkId, member);
100+
101+
expect(projectRepository.getProjectByLinkId).toHaveBeenCalledWith(
102+
projectLinkId,
103+
);
104+
expect(projectRepository.addProjectMember).toHaveBeenCalledWith(
105+
project,
106+
member,
107+
);
108+
});
109+
110+
it('should throw when already joined member', async () => {
111+
jest
112+
.spyOn(projectRepository, 'getProjectByLinkId')
113+
.mockResolvedValue(project);
114+
jest
115+
.spyOn(projectRepository, 'getProjectToMember')
116+
.mockResolvedValue(ProjectToMember.of(project, member));
117+
118+
await expect(
119+
async () => await projectService.addMember(projectLinkId, member),
120+
).rejects.toThrow('already joined member');
121+
});
122+
123+
it('should throw when invalid project link id', async () => {
124+
jest
125+
.spyOn(projectRepository, 'getProjectByLinkId')
126+
.mockResolvedValue(null);
127+
128+
await expect(
129+
async () => await projectService.addMember(projectLinkId, member),
130+
).rejects.toThrow('project link id not found');
131+
});
132+
});
84133
});

backend/src/project/service/project.service.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
22
import { ProjectRepository } from '../project.repository';
33
import { Member } from 'src/member/entity/member.entity';
44
import { Project } from '../entity/project.entity';
5+
import { ProjectToMember } from '../entity/project-member.entity';
56

67
@Injectable()
78
export class ProjectService {
@@ -21,4 +22,29 @@ export class ProjectService {
2122
async getProject(projectId: number): Promise<Project> {
2223
return await this.projectRepository.getProject(projectId);
2324
}
25+
26+
async addMember(projectLinkId: string, member: Member): Promise<void> {
27+
const project =
28+
await this.projectRepository.getProjectByLinkId(projectLinkId);
29+
if (!project) throw new Error('project link id not found');
30+
31+
const isProjectMember = await this.isProjectMember(project, member);
32+
if (isProjectMember) throw new Error('already joined member');
33+
34+
await this.projectRepository.addProjectMember(project, member);
35+
}
36+
37+
async isProjectMember(
38+
project: Project,
39+
member: Member,
40+
): Promise<boolean> {
41+
const projectToMember: ProjectToMember | null =
42+
await this.projectRepository.getProjectToMember(project, member);
43+
if (!projectToMember) return false;
44+
return true;
45+
}
46+
47+
getProjectByLinkId(projectLinkId: string): Promise<Project | null> {
48+
return this.projectRepository.getProjectByLinkId(projectLinkId);
49+
}
2450
}

0 commit comments

Comments
 (0)