Skip to content

Commit 8e44a0c

Browse files
feat: 엣지 서비스 구현
1 parent 2d8387b commit 8e44a0c

File tree

3 files changed

+95
-19
lines changed

3 files changed

+95
-19
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,37 @@
11
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsString, IsNumber, IsIn } from 'class-validator';
3+
// import { Direction } from '../edge.entity';
4+
5+
const Direction = ['N', 'S', 'E', 'W'];
26

37
export class CreateEdgeDto {
8+
@IsNumber()
9+
@ApiProperty({
10+
example: 1,
11+
description: '출발 노드의 ID',
12+
})
413
fromNode: number;
14+
15+
@IsString()
16+
@IsIn(Direction)
17+
@ApiProperty({
18+
example: 'N',
19+
description: '출발 노드 지점 방향 (N, S, E, W 중 하나)',
20+
})
521
fromPoint: string;
22+
23+
@IsNumber()
24+
@ApiProperty({
25+
example: 1,
26+
description: '도착 노드의 ID',
27+
})
628
toNode: number;
29+
30+
@IsString()
31+
@IsIn(Direction)
32+
@ApiProperty({
33+
example: 'N',
34+
description: '도착 노드 지점 방향 (N, S, E, W 중 하나)',
35+
})
736
toPoint: string;
837
}

backend/src/edge/edge.entity.ts

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ import {
88
} from 'typeorm';
99
import { Node } from '../node/node.entity';
1010

11-
export enum Direction {
12-
NORTH = 'N',
13-
WEST = 'W',
14-
SOUTH = 'S',
15-
EAST = 'E',
16-
}
11+
// TODO: frontend, backend가 공유하는 shared에 direction.enum.ts로 분리
12+
// export enum Direction {
13+
// NORTH = 'N',
14+
// SOUTH = 'S',
15+
// EAST = 'E',
16+
// WEST = 'W',
17+
// }
1718

1819
@Entity()
1920
export class Edge {
@@ -28,17 +29,11 @@ export class Edge {
2829
@JoinColumn({ name: 'to_node_id' })
2930
toNode: Node;
3031

31-
@Column({
32-
type: 'enum',
33-
enum: Direction,
34-
})
35-
fromPoint: Direction;
36-
37-
@Column({
38-
type: 'enum',
39-
enum: Direction,
40-
})
41-
toPoint: Direction;
32+
@Column()
33+
fromPoint: string;
34+
35+
@Column()
36+
toPoint: string;
4237

4338
@Column({ nullable: true })
4439
type: string;

backend/src/edge/edge.service.ts

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,66 @@
11
import { Injectable } from '@nestjs/common';
22
import { EdgeRepository } from './edge.repository';
3+
import { NodeRepository } from 'src/node/node.repository';
34
import { Edge } from './edge.entity';
5+
import { CreateEdgeDto } from './dtos/createEdge.dto';
6+
import { EdgeNotFoundException } from 'src/exception/edge.exception';
47

58
@Injectable()
69
export class EdgeService {
7-
constructor(private edgeRepository: EdgeRepository) {}
10+
constructor(
11+
private readonly edgeRepository: EdgeRepository,
12+
private readonly nodeRepository: NodeRepository,
13+
) {}
814

915
async createEdge(dto: CreateEdgeDto): Promise<Edge> {
16+
const { fromNode, fromPoint, toNode, toPoint } = dto;
1017

11-
const edge = await this.edgeRepository.save {}
18+
// 출발 노드를 조회한다.
19+
const existingFromNode = await this.nodeRepository.findOneBy({
20+
id: fromNode,
21+
});
22+
// 도착 노드를 조회한다.
23+
const existingToNode = await this.nodeRepository.findOneBy({ id: toNode });
1224

25+
// 엣지를 생성한다.
26+
return await this.edgeRepository.save({
27+
fromNode: existingFromNode,
28+
fromPoint,
29+
toNode: existingToNode,
30+
toPoint,
31+
});
32+
}
33+
34+
async deleteEdge(id: number): Promise<void> {
35+
// 엣지를 삭제한다
36+
const deleteResult = await this.edgeRepository.delete(id);
37+
38+
// 삭제된 엣지가 없으면 노드를 찾지 못한 것
39+
if (!deleteResult.affected) {
40+
throw new EdgeNotFoundException();
41+
}
42+
}
43+
44+
async findEdges(): Promise<Edge[]> {
45+
// 모든 엣지들을 조회한다.
46+
const edges = await this.edgeRepository.find({
47+
relations: ['fromNode', 'toNode'],
48+
select: {
49+
id: true,
50+
fromNode: {
51+
id: true,
52+
},
53+
fromPoint: true,
54+
toNode: {
55+
id: true,
56+
},
57+
toPoint: true,
58+
},
59+
});
60+
// 엣지가 없으면 NotFound 에러
61+
if (!edges) {
62+
throw new EdgeNotFoundException();
63+
}
64+
return edges;
1365
}
1466
}

0 commit comments

Comments
 (0)