From 7b631ab858291336c62499475fee8b0052f254a6 Mon Sep 17 00:00:00 2001 From: Taehoon Date: Fri, 19 Jun 2026 18:03:58 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=9B=90=EA=B2=A9=EC=A0=91=EC=86=8D=20?= =?UTF-8?q?=EC=9E=90=EC=82=B0=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scratch/query_asset.cjs | 25 ++++++++++++++++++ scratch/query_asset.js | 25 ++++++++++++++++++ scratch/query_master.cjs | 17 ++++++++++++ src/core/state.ts | 57 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 scratch/query_asset.cjs create mode 100644 scratch/query_asset.js create mode 100644 scratch/query_master.cjs diff --git a/scratch/query_asset.cjs b/scratch/query_asset.cjs new file mode 100644 index 0000000..2a2df39 --- /dev/null +++ b/scratch/query_asset.cjs @@ -0,0 +1,25 @@ +const mysql = require('mysql2/promise'); +require('dotenv').config({ path: './.env' }); + +async function main() { + const connection = await mysql.createConnection({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME, + port: parseInt(process.env.DB_PORT || '3306') + }); + + try { + const [schema] = await connection.query(`SHOW CREATE TABLE asset_volume`); + console.log('Schema:', schema[0]['Create Table']); + const [rows] = await connection.query(`SELECT * FROM asset_volume LIMIT 20`); + console.log('Sample Data:', JSON.stringify(rows, null, 2)); + } catch (err) { + console.error(err); + } finally { + await connection.end(); + } +} + +main(); diff --git a/scratch/query_asset.js b/scratch/query_asset.js new file mode 100644 index 0000000..9a07511 --- /dev/null +++ b/scratch/query_asset.js @@ -0,0 +1,25 @@ +const mysql = require('mysql2/promise'); +require('dotenv').config({ path: './.env' }); + +async function main() { + const connection = await mysql.createConnection({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME, + port: parseInt(process.env.DB_PORT || '3306') + }); + + try { + const [rows] = await connection.query( + `SELECT * FROM asset_core WHERE asset_purpose LIKE '%바론%' OR asset_purpose LIKE '%SSO%'` + ); + console.log('Results:', JSON.stringify(rows, null, 2)); + } catch (err) { + console.error(err); + } finally { + await connection.end(); + } +} + +main(); diff --git a/scratch/query_master.cjs b/scratch/query_master.cjs new file mode 100644 index 0000000..b0fc692 --- /dev/null +++ b/scratch/query_master.cjs @@ -0,0 +1,17 @@ +require('dotenv').config({ path: './.env' }); + +async function main() { + const url = `http://${process.env.DB_HOST || 'localhost'}:3000/api/assets/master`; + try { + const res = await fetch(url); + const data = await res.json(); + // find asset with id "9pvkqyi" + const serverList = data.server || []; + const target = serverList.find(s => s.id === '9pvkqyi'); + console.log('Server list asset:', JSON.stringify(target, null, 2)); + } catch (err) { + console.error(err); + } +} + +main(); diff --git a/src/core/state.ts b/src/core/state.ts index 95df31e..c719106 100644 --- a/src/core/state.ts +++ b/src/core/state.ts @@ -45,6 +45,63 @@ export async function loadMasterDataFromDB() { const data = await response.json(); + // DB의 쪼개진 asset_remote 데이터로부터 가상 대표 속성(IP, MAC, 원격도구)을 주입해주는 전처리 함수 + const preprocessAssets = (assets: any[]) => { + if (!Array.isArray(assets)) return; + assets.forEach((asset: any) => { + let ip = ''; + let mac = ''; + let remoteTool = ''; + let remoteId = ''; + let remotePw = ''; + + let rems: any[] = []; + try { + rems = asset.remotes ? (typeof asset.remotes === 'string' ? JSON.parse(asset.remotes) : asset.remotes) : []; + } catch(e) {} + + if (Array.isArray(rems)) { + rems.forEach((r: any) => { + if (r.type === 'IP') { + if (!ip) ip = r.val1 || ''; + if (r.val2) { + if (String(r.val2).trim().startsWith('{')) { + try { + const parsed = JSON.parse(r.val2); + remoteTool = r.name || '원격접속'; + remoteId = parsed.id || ''; + remotePw = parsed.pw || ''; + } catch(e) {} + } else { + if (!mac) mac = r.val2 || ''; + } + } + } else if (r.type === 'MAC') { + if (!mac) mac = r.val1 || ''; + } else if (r.type === 'REMOTE') { + if (!remoteTool) remoteTool = r.name || ''; + if (!remoteId) remoteId = r.val1 || ''; + if (!remotePw) remotePw = r.val2 || ''; + } + }); + } + + // 최상위 가상 속성 바인딩 (목록 및 위치보기 뷰어 매핑용) + asset.ip_address = ip; + asset.mac_address = mac; + asset.remote_tool = remoteTool; + asset.remote_id = remoteId; + asset.remote_pw = remotePw; + }); + }; + + if (data) { + const keys = ['pc', 'server', 'storage', 'network', 'survey', 'equipment', 'officeSupplies']; + keys.forEach(k => { + if (data[k]) preprocessAssets(data[k]); + }); + } + // 전역 상태 업데이트 state.masterData = { ...state.masterData,