refactor: cleanup temp files, centralize API URL, and dynamic routing

- 불필요한 마이그레이션 스크립트, JSON 덤프, 백업 폴더 일괄 삭제

- 프론트엔드 API_BASE_URL 상수 도입 및 하드코딩된 API 엔드포인트 통합

- 백엔드(server.js) GET/POST 라우팅 구조를 Map 기반 동적 라우팅으로 리팩토링

- 미사용 dummyDataGenerator 제거
This commit is contained in:
2026-05-26 19:37:34 +09:00
parent b2713a142d
commit 2c67037fc4
87 changed files with 20613 additions and 11693 deletions

View File

@@ -88,54 +88,30 @@ const saveAssetsBatch = async (tableName, items, res, context) => {
// --- Routes ---
// 0. User Management
app.get('/api/users', (req, res) => fetchAssets('system_users', res, 'USERS'));
app.post('/api/users/batch', (req, res) => saveAssetsBatch('system_users', req.body, res, 'USERS BATCH'));
const routeMap = {
'/api/users': { table: 'system_users', context: 'USERS' },
'/api/pc': { table: 'asset_pc', context: 'PC' },
'/api/server': { table: 'asset_server', context: 'SERVER' },
'/api/storage': { table: 'asset_storage', context: 'STORAGE' },
'/api/network': { table: 'asset_network', context: 'NETWORK' },
'/api/sw/internal': { table: 'asset_sw_internal', context: 'SW INTERNAL' },
'/api/sw/external': { table: 'asset_sw_external', context: 'SW EXTERNAL' },
'/api/survey': { table: 'asset_survey', context: 'SURVEY' },
'/api/pc-parts': { table: 'asset_pc_parts', context: 'PC PARTS' },
'/api/equipment': { table: 'asset_equipment', context: 'EQUIPMENT' },
'/api/office-supplies': { table: 'asset_office_supplies', context: 'OFFICE SUPPLIES' },
'/api/cloud': { table: 'asset_cloud', context: 'CLOUD' },
'/api/domain': { table: 'asset_domain', context: 'DOMAIN' },
'/api/cost': { table: 'asset_cost', context: 'COST' },
'/api/vip': { table: 'asset_vip', context: 'VIP' },
'/api/asset/software/assignment': { table: 'asset_software_assignment', context: 'SW ASSIGN' }
};
// 1. Hardware Assets
app.get('/api/pc', (req, res) => fetchAssets('asset_pc', res, 'PC'));
app.post('/api/pc/batch', (req, res) => saveAssetsBatch('asset_pc', req.body, res, 'PC BATCH'));
app.get('/api/server', (req, res) => fetchAssets('asset_server', res, 'SERVER'));
app.post('/api/server/batch', (req, res) => saveAssetsBatch('asset_server', req.body, res, 'SERVER BATCH'));
app.get('/api/storage', (req, res) => fetchAssets('asset_storage', res, 'STORAGE'));
app.post('/api/storage/batch', (req, res) => saveAssetsBatch('asset_storage', req.body, res, 'STORAGE BATCH'));
app.get('/api/network', (req, res) => fetchAssets('asset_network', res, 'NETWORK'));
app.post('/api/network/batch', (req, res) => saveAssetsBatch('asset_network', req.body, res, 'NETWORK BATCH'));
// 2. Software Assets
app.get('/api/sw/internal', (req, res) => fetchAssets('asset_sw_internal', res, 'SW INTERNAL'));
app.post('/api/sw/internal/batch', (req, res) => saveAssetsBatch('asset_sw_internal', req.body, res, 'SW INTERNAL BATCH'));
app.get('/api/sw/external', (req, res) => fetchAssets('asset_sw_external', res, 'SW EXTERNAL'));
app.post('/api/sw/external/batch', (req, res) => saveAssetsBatch('asset_sw_external', req.body, res, 'SW EXTERNAL BATCH'));
// 3. Other Assets
app.get('/api/survey', (req, res) => fetchAssets('asset_survey', res, 'SURVEY'));
app.post('/api/survey/batch', (req, res) => saveAssetsBatch('asset_survey', req.body, res, 'SURVEY BATCH'));
app.get('/api/pc-parts', (req, res) => fetchAssets('asset_pc_parts', res, 'PC PARTS'));
app.post('/api/pc-parts/batch', (req, res) => saveAssetsBatch('asset_pc_parts', req.body, res, 'PC PARTS BATCH'));
app.get('/api/equipment', (req, res) => fetchAssets('asset_equipment', res, 'EQUIPMENT'));
app.post('/api/equipment/batch', (req, res) => saveAssetsBatch('asset_equipment', req.body, res, 'EQUIPMENT BATCH'));
app.get('/api/office-supplies', (req, res) => fetchAssets('asset_office_supplies', res, 'OFFICE SUPPLIES'));
app.post('/api/office-supplies/batch', (req, res) => saveAssetsBatch('asset_office_supplies', req.body, res, 'OFFICE SUPPLIES BATCH'));
app.get('/api/cloud', (req, res) => fetchAssets('asset_cloud', res, 'CLOUD'));
app.post('/api/cloud/batch', (req, res) => saveAssetsBatch('asset_cloud', req.body, res, 'CLOUD BATCH'));
app.get('/api/domain', (req, res) => fetchAssets('asset_domain', res, 'DOMAIN'));
app.post('/api/domain/batch', (req, res) => saveAssetsBatch('asset_domain', req.body, res, 'DOMAIN BATCH'));
app.get('/api/cost', (req, res) => fetchAssets('asset_cost', res, 'COST'));
app.post('/api/cost/batch', (req, res) => saveAssetsBatch('asset_cost', req.body, res, 'COST BATCH'));
app.get('/api/vip', (req, res) => fetchAssets('asset_vip', res, 'VIP'));
app.post('/api/vip/batch', (req, res) => saveAssetsBatch('asset_vip', req.body, res, 'VIP BATCH'));
// 동적 라우팅 생성 (Dynamic Routing)
Object.entries(routeMap).forEach(([route, { table, context }]) => {
app.get(route, (req, res) => fetchAssets(table, res, context));
app.post(`${route}/batch`, (req, res) => saveAssetsBatch(table, req.body, res, `${context} BATCH`));
});
// 4. Legacy/Auxiliary (History & Assignment)
app.get('/api/asset/history', (req, res) => fetchAssets('asset_history', res, 'HISTORY'));
@@ -160,9 +136,6 @@ app.post('/api/asset/history/batch', async (req, res) => {
} catch (err) { await connection.rollback(); handleError(res, err, 'BATCH HISTORY'); } finally { connection.release(); }
});
app.get('/api/asset/software/assignment', (req, res) => fetchAssets('asset_software_assignment', res, 'SW ASSIGN'));
app.post('/api/asset/software/assignment/batch', (req, res) => saveAssetsBatch('asset_software_assignment', req.body, res, 'SW ASSIGN BATCH'));
// 5. Utility
app.get('/api/generate-asset-code', async (req, res) => {
try {