Skip to content

Commit 9f7bbb3

Browse files
committed
feat: rest adapter 추가
- fix: persistRouter가 실제 동작(network 추가)를 하도록 수정 - feat: express /network [post] 라우터 추가
1 parent 5936499 commit 9f7bbb3

File tree

4 files changed

+64
-45
lines changed

4 files changed

+64
-45
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { RouterNetworkUseCase } from 'src/application/usecase/router-network.usecase';
2+
import { Router } from 'src/domain/entity/router';
3+
import { RouterNetworkAdapter } from 'src/framework/adapter/input/router-network.adapter';
4+
import { WebApp } from 'src/web-app.factory';
5+
6+
export class RouterNetworkRestAdapter extends RouterNetworkAdapter {
7+
constructor(protected readonly _routerNetworkUsecase: RouterNetworkUseCase) {
8+
super();
9+
}
10+
11+
public async processRequest(requestParams: WebApp): Promise<Router> {
12+
const app = requestParams;
13+
14+
app.applyRouter('POST', '/network', async (req, res) => {
15+
try {
16+
this._router = await this._addNetworkToRouter(req.body);
17+
res.send(this._router.toString());
18+
} catch (e) {
19+
res.status(400).json(e.message);
20+
}
21+
});
22+
23+
return this._router;
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { IPData, Prisma, ProtocolData, RouterTypeData, SwitchTypeData } from '@prisma/client';
1+
import { Prisma, ProtocolData } from '@prisma/client';
22
import { Router } from 'src/domain/entity/router';
33
import { Switch } from 'src/domain/entity/switch';
44
import { IP } from 'src/domain/vo/ip';
@@ -23,30 +23,24 @@ export class RouterPrismaMapper {
2323
return new Router(routerType, routerId, networkSwitch);
2424
}
2525

26-
public static toPrisma(router: Router): Prisma.RouterDataCreateInput {
27-
const routerDataType = RouterTypeData[RouterType[router.type]];
26+
public static toPrisma(router: Router): Prisma.NetworkDataCreateArgs {
2827
const routerDataId = router.routerId.toString();
29-
const switchDataId = router.networkSwitch.id;
30-
const switchTypeData = SwitchTypeData[SwitchType[router.networkSwitch.type]];
31-
const ipData: IPData = {
32-
address: router.networkSwitch.address.address,
33-
protocol: ProtocolData[Protocol[router.networkSwitch.address.protocol]],
34-
};
3528

36-
const networkDataList = this._getNetworksFromDomain(router.networkSwitch.getNetworks());
29+
const networks = router.networkSwitch.getNetworks().at(-1);
3730

3831
return {
39-
id: routerDataId,
40-
type: routerDataType,
41-
networkSwitch: {
42-
create: {
43-
id: switchDataId.toString(),
44-
type: switchTypeData,
45-
ip: {
46-
create: ipData,
32+
data: {
33+
switch: {
34+
connect: {
35+
routerId: routerDataId,
4736
},
48-
networks: {
49-
create: networkDataList,
37+
},
38+
cidr: networks.cidr,
39+
name: networks.name,
40+
ip: {
41+
create: {
42+
address: networks.address.address,
43+
protocol: ProtocolData[Protocol[networks.address.protocol]],
5044
},
5145
},
5246
},
@@ -56,17 +50,4 @@ export class RouterPrismaMapper {
5650
private static _getNetworksFromData(networkData: NetworkDataType[]): Network[] {
5751
return networkData.map(({ ip: { address }, name, cidr }) => new Network(IP.fromAddress(address), name, cidr));
5852
}
59-
60-
private static _getNetworksFromDomain(networks: Network[]): Prisma.NetworkDataCreateWithoutSwitchInput[] {
61-
return networks.map<Prisma.NetworkDataCreateWithoutSwitchInput>(({ cidr, address: { address, protocol }, name }) => ({
62-
cidr,
63-
name,
64-
ip: {
65-
create: {
66-
address,
67-
protocol: ProtocolData[Protocol[protocol]],
68-
},
69-
},
70-
}));
71-
}
7253
}

example04/src/framework/adapter/output/prisma/router-network.prisma.adapter.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,18 @@ class RouterNetworkPrismaAdapter implements RouterNetworkOutputPort {
2626
},
2727
},
2828
});
29+
2930
return RouterPrismaMapper.toDomain(routerData);
3031
}
3132

33+
/**
34+
* 원본 도서 예제의 java는 Router data 전체를 persist 를 사용하는데
35+
* 실제로 의도한 동작은 input adapter로 부터 전달 받은 network 데이터만 해당 router에 추가하는 동작
36+
*/
3237
async persistRouter(router: Router): Promise<boolean> {
33-
const routerData = RouterPrismaMapper.toPrisma(router);
34-
await this._prisma.routerData.create({
35-
data: routerData,
36-
});
38+
const networkData = RouterPrismaMapper.toPrisma(router);
39+
40+
await this._prisma.networkData.create(networkData);
3741

3842
return true;
3943
}

example04/src/web-app.factory.ts

+17-8
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,32 @@
1-
import express from 'express';
1+
import bodyParser from 'body-parser';
2+
import express, { Handler, Router } from 'express';
23

3-
class WebApp {
4+
export class WebApp {
45
private _app: express.Application;
56

6-
constructor(private readonly _port: number) {
7+
constructor(private readonly _port = 3000) {
78
this._app = express();
9+
this._init();
810
}
911

1012
public start(): void {
1113
this._app.listen(this._port, () => {
1214
console.log(`Service listening on ${this._port}`);
1315
});
1416
}
15-
}
1617

17-
export class WebAppFactory {
18-
static create(port = 3000): WebApp {
19-
const app = new WebApp(port);
18+
public applyRouter(method: 'GET' | 'POST', url: string, handler: Handler): void {
19+
switch (method) {
20+
case 'GET':
21+
this._app.get(url, handler);
22+
return;
23+
case 'POST':
24+
this._app.post(url, handler);
25+
return;
26+
}
27+
}
2028

21-
return app;
29+
private _init(): void {
30+
this._app.use(bodyParser.json());
2231
}
2332
}

0 commit comments

Comments
 (0)