Skip to content

Commit 25c0a71

Browse files
committed
feat: 노드 하나 정보 가져오기, 모든 노드 가져오기 api 구현
1 parent 5e16ded commit 25c0a71

File tree

5 files changed

+96
-2
lines changed

5 files changed

+96
-2
lines changed

backend/db_name

-36 KB
Binary file not shown.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IsString, IsObject } from 'class-validator';
2+
import { Node } from '../node.entity';
3+
4+
export class FindNodeResponseDto {
5+
@IsString()
6+
message: string;
7+
8+
@IsObject()
9+
node: Node;
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IsString, IsArray } from 'class-validator';
2+
import { Node } from '../node.entity';
3+
4+
export class FindNodesResponseDto {
5+
@IsString()
6+
message: string;
7+
8+
@IsArray()
9+
nodes: Node[];
10+
}

backend/src/node/node.controller.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@ import { UpdateNodeDto } from './dtos/updateNode.dto';
1616
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
1717
import { MessageResponseDto } from './dtos/messageResponse.dto';
1818
import { CoordinateResponseDto } from './dtos/coordinateResponse.dto';
19+
import { FindNodeResponseDto } from './dtos/findNodeResponse.dto';
20+
import { FindNodesResponseDto } from './dtos/findNodesResponse.dto.';
1921

2022
export enum NodeResponseMessage {
23+
NODE_RETURNED = '노드와 페이지를 가져왔습니다.',
24+
NODE_ALL_RETURNED = '모든 노드를 가져왔습니다.',
2125
NODE_CREATED = '노드와 페이지를 생성했습니다.',
2226
NODE_UPDATED = '노드와 페이지를 갱신했습니다.',
2327
NODE_DELETED = '노드와 페이지를 삭제했습니다.',
@@ -27,6 +31,38 @@ export enum NodeResponseMessage {
2731
@Controller('node')
2832
export class NodeController {
2933
constructor(private readonly nodeService: NodeService) {}
34+
@ApiResponse({
35+
type: FindNodesResponseDto,
36+
})
37+
@ApiOperation({
38+
summary:
39+
'모든 노드 정보를 가져옵니다. (페이지 정보 중 id와 title만 가져옵니다.)',
40+
})
41+
@Get('/')
42+
@HttpCode(HttpStatus.OK)
43+
async getNodes() {
44+
const nodes = await this.nodeService.findNodes();
45+
return {
46+
message: NodeResponseMessage.NODE_ALL_RETURNED,
47+
nodes: nodes,
48+
};
49+
}
50+
@ApiResponse({
51+
type: FindNodeResponseDto,
52+
})
53+
@ApiOperation({
54+
summary:
55+
'노드와 페이지 정보를 가져옵니다. (페이지 정보 중 id와 title만 가져옵니다.)',
56+
})
57+
@Get('/:id')
58+
@HttpCode(HttpStatus.OK)
59+
async getNodeById(@Param('id', ParseIntPipe) id: number) {
60+
const node = await this.nodeService.findNodeById(id);
61+
return {
62+
message: NodeResponseMessage.NODE_RETURNED,
63+
node: node,
64+
};
65+
}
3066

3167
@ApiResponse({
3268
type: MessageResponseDto,

backend/src/node/node.service.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,53 @@ export class NodeService {
6666

6767
async findNodeById(id: number): Promise<Node> {
6868
// 노드를 조회한다.
69-
const node = await this.nodeRepository.findOneBy({ id });
70-
69+
const node = await this.nodeRepository
70+
.createQueryBuilder('node')
71+
.leftJoinAndSelect('node.page', 'page')
72+
.leftJoinAndSelect('node.outgoingEdges', 'outgoingEdges')
73+
.leftJoinAndSelect('node.incomingEdges', 'incomingEdges')
74+
.select([
75+
'node.id',
76+
'node.x',
77+
'node.y',
78+
'outgoingEdges.id',
79+
'incomingEdges.id',
80+
'page.id',
81+
'page.title',
82+
])
83+
.where('node.id = :id', { id })
84+
.getOne();
7185
// 노드가 없으면 NotFound 에러
7286
if (!node) {
7387
throw new NodeNotFoundException();
7488
}
7589
return node;
7690
}
7791

92+
async findNodes(): Promise<Node[]> {
93+
// 노드를 조회한다.
94+
const nodes = await this.nodeRepository
95+
.createQueryBuilder('node')
96+
.leftJoinAndSelect('node.page', 'page')
97+
.leftJoinAndSelect('node.outgoingEdges', 'outgoingEdges')
98+
.leftJoinAndSelect('node.incomingEdges', 'incomingEdges')
99+
.select([
100+
'node.id',
101+
'node.x',
102+
'node.y',
103+
'outgoingEdges.id',
104+
'incomingEdges.id',
105+
'page.id',
106+
'page.title',
107+
])
108+
.getMany();
109+
// 노드가 없으면 NotFound 에러
110+
if (!nodes) {
111+
throw new NodeNotFoundException();
112+
}
113+
return nodes;
114+
}
115+
78116
async getCoordinates(id: number): Promise<{ x: number; y: number }> {
79117
// 노드를 조회한다.
80118
const node = await this.findNodeById(id);

0 commit comments

Comments
 (0)