@@ -12,46 +12,6 @@ import { Page } from '../page/page.entity';
1212import { Node } from '../node/node.entity' ;
1313import { 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 ( )
5616export 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 ;
0 commit comments