Skip to content

Commit 0f9bbef

Browse files
Tolerblancsummersummerwhyezcolin2
committed
feat: 크론잡 엣지 추가제거 구현
Co-authored-by: Summer Min <[email protected]> Co-authored-by: ez <[email protected]>
1 parent 668107a commit 0f9bbef

File tree

2 files changed

+44
-74
lines changed

2 files changed

+44
-74
lines changed

apps/backend/src/tasks/tasks.service.ts

Lines changed: 38 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -12,46 +12,6 @@ import { Page } from '../page/page.entity';
1212
import { Node } from '../node/node.entity';
1313
import { Edge } from '../edge/edge.entity';
1414

15-
/**
16-
TODO Coordinate
17-
this.redisService.setField(`node:${findPage.node.id}`, 'x', x);
18-
this.redisService.setField(`node:${findPage.node.id}`, 'y', y);
19-
20-
TODO AddEdge
21-
this.redisService.setField(
22-
`edge:${edge.source}-${edge.target}`,
23-
'fromNode',
24-
edge.source,
25-
);
26-
this.redisService.setField(
27-
`edge:${edge.source}-${edge.target}`,
28-
'toNode',
29-
edge.target,
30-
);
31-
this.redisService.setField(
32-
`edge:${edge.source}-${edge.target}`,
33-
'type',
34-
'add',
35-
);
36-
37-
TODO DeleteEdge
38-
this.redisService.setField(
39-
`edge:${edge.source}-${edge.target}`,
40-
'fromNode',
41-
edge.source,
42-
);
43-
this.redisService.setField(
44-
`edge:${edge.source}-${edge.target}`,
45-
'toNode',
46-
edge.target,
47-
);
48-
this.redisService.setField(
49-
`edge:${edge.source}-${edge.target}`,
50-
'type',
51-
'delete',
52-
);
53-
*/
54-
5515
@Injectable()
5616
export class TasksService {
5717
private readonly logger = new Logger(TasksService.name);
@@ -67,12 +27,12 @@ export class TasksService {
6727
const startTime = performance.now();
6828
const pageKeys = await this.redisService.getAllKeys('page:*');
6929
const nodeKeys = await this.redisService.getAllKeys('node:*');
70-
// const edgeKeys = await this.redisService.getAllKeys('edge:*');
30+
const edgeKeys = await this.redisService.getAllKeys('edge:*');
7131

7232
Promise.allSettled([
7333
...pageKeys.map(this.migratePage.bind(this)),
7434
...nodeKeys.map(this.migrateNode.bind(this)),
75-
// ...edgeKeys.map(this.migrateEdge.bind(this)),
35+
...edgeKeys.map(this.migrateEdge.bind(this)),
7636
])
7737
.then((results) => {
7838
const endTime = performance.now();
@@ -158,7 +118,7 @@ export class TasksService {
158118
y: Number(redisData.y),
159119
};
160120

161-
// 업데이트 대상이 없다면 리턴
121+
// 쿼리 대상이 없다면 리턴
162122
if (Object.keys(updateData).length === 0) return;
163123
const nodeId = parseInt(key.split(':')[1]);
164124

@@ -194,38 +154,42 @@ export class TasksService {
194154
}
195155

196156
async migrateEdge(key: string) {
197-
const redisData = await this.redisService.get(key);
157+
const redisData = (await this.redisService.get(
158+
key,
159+
)) as unknown as RedisEdge;
198160
// 데이터 없으면 오류
199161
if (!redisData) {
200162
throw new Error(`redis에 ${key}에 해당하는 데이터가 없습니다.`);
201163
}
202164

203-
const { title, content, emoji } = redisData;
204-
205-
const updateData: Partial<{
206-
title: string;
207-
content: any;
208-
emoji: string;
209-
}> = {};
210-
211-
if (title) updateData.title = title;
212-
if (content) updateData.content = JSON.parse(content);
213-
if (emoji) updateData.emoji = emoji;
214-
215-
// 업데이트 대상이 없다면 리턴
216-
if (Object.keys(updateData).length === 0) return;
217-
const pageId = parseInt(key.split(':')[1]);
218-
219165
// 트랜잭션 시작
220166
const queryRunner = this.dataSource.createQueryRunner();
221167
try {
222168
await queryRunner.startTransaction();
223169

224170
// 갱신 시작
225-
const pageRepository = queryRunner.manager.getRepository(Page);
171+
const edgeRepository = queryRunner.manager.getRepository(Edge);
172+
const nodeRepository = queryRunner.manager.getRepository(Node);
226173

227-
// TODO : 페이지가 없으면 affect : 0을 반환하는데 이 부분 처리도 하는 게 좋을 듯...?
228-
await pageRepository.update(pageId, updateData);
174+
const fromNode = await nodeRepository.findOne({
175+
where: { id: redisData.fromNode },
176+
});
177+
178+
const toNode = await nodeRepository.findOne({
179+
where: { id: redisData.toNode },
180+
});
181+
182+
if (redisData.type === 'add') {
183+
await edgeRepository.save({ fromNode, toNode });
184+
}
185+
186+
if (redisData.type === 'delete') {
187+
const edge = await edgeRepository.findOne({
188+
where: { fromNode, toNode },
189+
});
190+
191+
await edgeRepository.delete({ id: edge.id });
192+
}
229193

230194
// redis에서 데이터 삭제
231195
await this.redisService.delete(key);
@@ -236,12 +200,17 @@ export class TasksService {
236200
// 실패하면 postgres는 roll back하고 redis의 값을 살린다.
237201
this.logger.error(err.stack);
238202
await queryRunner.rollbackTransaction();
239-
updateData.title &&
240-
(await this.redisService.setField(key, 'title', updateData.title));
241-
updateData.content &&
242-
(await this.redisService.setField(key, 'content', updateData.content));
243-
updateData.emoji &&
244-
(await this.redisService.setField(key, 'emoji', updateData.emoji));
203+
await this.redisService.setField(
204+
key,
205+
'fromNode',
206+
redisData.fromNode.toString(),
207+
);
208+
await this.redisService.setField(
209+
key,
210+
'toNode',
211+
redisData.toNode.toString(),
212+
);
213+
await this.redisService.setField(key, 'type', redisData.type);
245214

246215
// Promise.all에서 실패를 인식하기 위해 에러를 던진다.
247216
throw err;

apps/websocket/src/yjs/yjs.service.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ export class YjsService
292292
edgesMap: Y.Map<unknown>,
293293
) {
294294
for (const [key, change] of event.changes.keys) {
295+
const [fromNode, toNode] = key.slice(1).split('-');
295296
const edge = edgesMap.get(key) as YMapEdge;
296297

297298
if (change.action === 'add') {
@@ -315,17 +316,17 @@ export class YjsService
315316
if (change.action === 'delete') {
316317
// 엣지가 존재하면 삭제
317318
this.redisService.setField(
318-
`edge:${edge.source}-${edge.target}`,
319+
`edge:${fromNode}-${toNode}`,
319320
'fromNode',
320-
edge.source,
321+
fromNode,
321322
);
322323
this.redisService.setField(
323-
`edge:${edge.source}-${edge.target}`,
324+
`edge:${fromNode}-${toNode}`,
324325
'toNode',
325-
edge.target,
326+
toNode,
326327
);
327328
this.redisService.setField(
328-
`edge:${edge.source}-${edge.target}`,
329+
`edge:${fromNode}-${toNode}`,
329330
'type',
330331
'delete',
331332
);

0 commit comments

Comments
 (0)