diff --git a/backend-node/src/services/menuCopyService.ts b/backend-node/src/services/menuCopyService.ts index ac9768a1..075a8229 100644 --- a/backend-node/src/services/menuCopyService.ts +++ b/backend-node/src/services/menuCopyService.ts @@ -279,11 +279,90 @@ export class MenuCopyService { logger.debug(` ๐Ÿ“ ๋ถ„ํ•  ํŒจ๋„ ์šฐ์ธก ํ™”๋ฉด ์ฐธ์กฐ ๋ฐœ๊ฒฌ: ${numId}`); } } + + // 5) ๋ชจ๋‹ฌ ํ™”๋ฉด ID (addModalScreenId, editModalScreenId, modalScreenId) + if (props?.componentConfig?.addModalScreenId) { + const addModalScreenId = props.componentConfig.addModalScreenId; + const numId = + typeof addModalScreenId === "number" + ? addModalScreenId + : parseInt(addModalScreenId); + if (!isNaN(numId) && numId > 0) { + referenced.push(numId); + logger.debug(` ๐Ÿ“‹ ์ถ”๊ฐ€ ๋ชจ๋‹ฌ ํ™”๋ฉด ์ฐธ์กฐ ๋ฐœ๊ฒฌ: ${numId}`); + } + } + + if (props?.componentConfig?.editModalScreenId) { + const editModalScreenId = props.componentConfig.editModalScreenId; + const numId = + typeof editModalScreenId === "number" + ? editModalScreenId + : parseInt(editModalScreenId); + if (!isNaN(numId) && numId > 0) { + referenced.push(numId); + logger.debug(` ๐Ÿ“ ์ˆ˜์ • ๋ชจ๋‹ฌ ํ™”๋ฉด ์ฐธ์กฐ ๋ฐœ๊ฒฌ: ${numId}`); + } + } + + if (props?.componentConfig?.modalScreenId) { + const modalScreenId = props.componentConfig.modalScreenId; + const numId = + typeof modalScreenId === "number" + ? modalScreenId + : parseInt(modalScreenId); + if (!isNaN(numId) && numId > 0) { + referenced.push(numId); + logger.debug(` ๐Ÿ”ฒ ๋ชจ๋‹ฌ ํ™”๋ฉด ์ฐธ์กฐ ๋ฐœ๊ฒฌ: ${numId}`); + } + } + + // 6) ์žฌ๊ท€์ ์œผ๋กœ ๋ชจ๋“  properties์—์„œ ํ™”๋ฉด ID ์ถ”์ถœ (๊นŠ์€ ํƒ์ƒ‰) + this.extractScreenIdsFromObject(props, referenced); } return referenced; } + /** + * ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ํ™”๋ฉด ID๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ถ”์ถœ + */ + private extractScreenIdsFromObject(obj: any, referenced: number[]): void { + if (!obj || typeof obj !== "object") return; + + if (Array.isArray(obj)) { + for (const item of obj) { + this.extractScreenIdsFromObject(item, referenced); + } + return; + } + + for (const key of Object.keys(obj)) { + const value = obj[key]; + + // ํ™”๋ฉด ID ํ‚ค ํŒจํ„ด ํ™•์ธ + if ( + key === "screenId" || + key === "targetScreenId" || + key === "leftScreenId" || + key === "rightScreenId" || + key === "addModalScreenId" || + key === "editModalScreenId" || + key === "modalScreenId" + ) { + const numId = typeof value === "number" ? value : parseInt(value); + if (!isNaN(numId) && numId > 0 && !referenced.includes(numId)) { + referenced.push(numId); + } + } + + // ์žฌ๊ท€ ํƒ์ƒ‰ + if (typeof value === "object" && value !== null) { + this.extractScreenIdsFromObject(value, referenced); + } + } + } + /** * ํ™”๋ฉด ์ˆ˜์ง‘ (์ค‘๋ณต ์ œ๊ฑฐ, ์žฌ๊ท€์  ์ฐธ์กฐ ์ถ”์ ) */ @@ -483,7 +562,8 @@ export class MenuCopyService { properties: any, screenIdMap: Map, flowIdMap: Map, - numberingRuleIdMap?: Map + numberingRuleIdMap?: Map, + menuIdMap?: Map ): any { if (!properties) return properties; @@ -496,7 +576,8 @@ export class MenuCopyService { screenIdMap, flowIdMap, "", - numberingRuleIdMap + numberingRuleIdMap, + menuIdMap ); return updated; @@ -510,7 +591,8 @@ export class MenuCopyService { screenIdMap: Map, flowIdMap: Map, path: string = "", - numberingRuleIdMap?: Map + numberingRuleIdMap?: Map, + menuIdMap?: Map ): void { if (!obj || typeof obj !== "object") return; @@ -522,7 +604,8 @@ export class MenuCopyService { screenIdMap, flowIdMap, `${path}[${index}]`, - numberingRuleIdMap + numberingRuleIdMap, + menuIdMap ); }); return; @@ -533,13 +616,16 @@ export class MenuCopyService { const value = obj[key]; const currentPath = path ? `${path}.${key}` : key; - // screen_id, screenId, targetScreenId, leftScreenId, rightScreenId ๋งคํ•‘ (์ˆซ์ž ๋˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด) + // screen_id, screenId, targetScreenId, leftScreenId, rightScreenId, addModalScreenId, editModalScreenId, modalScreenId ๋งคํ•‘ (์ˆซ์ž ๋˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด) if ( key === "screen_id" || key === "screenId" || key === "targetScreenId" || key === "leftScreenId" || - key === "rightScreenId" + key === "rightScreenId" || + key === "addModalScreenId" || + key === "editModalScreenId" || + key === "modalScreenId" ) { const numValue = typeof value === "number" ? value : parseInt(value); if (!isNaN(numValue) && numValue > 0) { @@ -549,6 +635,11 @@ export class MenuCopyService { logger.info( ` ๐Ÿ”— ํ™”๋ฉด ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ (${currentPath}): ${value} โ†’ ${newId}` ); + } else { + // ๋งคํ•‘์ด ์—†์œผ๋ฉด ๊ฒฝ๊ณ  ๋กœ๊ทธ (๋ณต์‚ฌ๋˜์ง€ ์•Š์€ ํ™”๋ฉด ์ฐธ์กฐ) + logger.warn( + ` โš ๏ธ ํ™”๋ฉด ๋งคํ•‘ ์—†์Œ (${currentPath}): ${value} - ์›๋ณธ ํ™”๋ฉด์ด ๋ณต์‚ฌ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Œ` + ); } } } @@ -573,9 +664,9 @@ export class MenuCopyService { } } - // numberingRuleId ๋งคํ•‘ (๋ฌธ์ž์—ด) + // numberingRuleId, ruleId ๋งคํ•‘ (๋ฌธ์ž์—ด) - ์ฑ„๋ฒˆ๊ทœ์น™ ์ฐธ์กฐ if ( - key === "numberingRuleId" && + (key === "numberingRuleId" || key === "ruleId") && numberingRuleIdMap && typeof value === "string" && value @@ -595,6 +686,25 @@ export class MenuCopyService { } } + // selectedMenuObjid ๋งคํ•‘ (๋ฉ”๋‰ด objid ์ฐธ์กฐ) + if (key === "selectedMenuObjid" && menuIdMap) { + const numValue = typeof value === "number" ? value : parseInt(value); + if (!isNaN(numValue) && numValue > 0) { + const newId = menuIdMap.get(numValue); + if (newId) { + obj[key] = typeof value === "number" ? newId : String(newId); + logger.info( + ` ๐Ÿ”— ๋ฉ”๋‰ด ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ (${currentPath}): ${value} โ†’ ${newId}` + ); + } else { + // ๋งคํ•‘์ด ์—†์œผ๋ฉด ๊ฒฝ๊ณ  ๋กœ๊ทธ (๋ณต์‚ฌ๋˜์ง€ ์•Š์€ ๋ฉ”๋‰ด ์ฐธ์กฐ) + logger.warn( + ` โš ๏ธ ๋ฉ”๋‰ด ๋งคํ•‘ ์—†์Œ (${currentPath}): ${value} - ์›๋ณธ ๋ฉ”๋‰ด๊ฐ€ ๋ณต์‚ฌ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Œ` + ); + } + } + } + // ์žฌ๊ท€ ํ˜ธ์ถœ if (typeof value === "object" && value !== null) { this.recursiveUpdateReferences( @@ -602,7 +712,8 @@ export class MenuCopyService { screenIdMap, flowIdMap, currentPath, - numberingRuleIdMap + numberingRuleIdMap, + menuIdMap ); } } @@ -981,7 +1092,8 @@ export class MenuCopyService { userId, client, screenNameConfig, - numberingRuleIdMap + numberingRuleIdMap, + menuIdMap ); // === 6๋‹จ๊ณ„: ํ™”๋ฉด-๋ฉ”๋‰ด ํ• ๋‹น === @@ -1315,7 +1427,8 @@ export class MenuCopyService { removeText?: string; addPrefix?: string; }, - numberingRuleIdMap?: Map + numberingRuleIdMap?: Map, + menuIdMap?: Map ): Promise> { const screenIdMap = new Map(); @@ -1601,7 +1714,8 @@ export class MenuCopyService { layout.properties, screenIdMap, flowIdMap, - numberingRuleIdMap + numberingRuleIdMap, + menuIdMap ); layoutValues.push(