[FE/BE] 대시보드 폰트 하향, 가변 이슈 기준 세대 정량 비교 엔진 및 4번째 카드 단독화 구현, 사양부족/오버스펙 기존 배포버전 산정식 복원 및 누락 CPU 14종 부품마스터 DB 일괄 정제 적재

This commit is contained in:
이태훈
2026-06-30 20:27:05 +09:00
parent b5d18b6839
commit d8259bfa75
18 changed files with 2015 additions and 233 deletions

View File

@@ -62,6 +62,28 @@ const pool = mysql.createPool({
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
`);
console.log('✅ job_spec_standards table verification completed.');
await connection.query(`
CREATE TABLE IF NOT EXISTS asset_issues (
id INT PRIMARY KEY DEFAULT 1,
title VARCHAR(255) NOT NULL,
rules JSON NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
`);
console.log('✅ asset_issues table verification completed.');
const [issueCountRows] = await connection.query('SELECT COUNT(*) AS cnt FROM asset_issues');
if (issueCountRows[0] && issueCountRows[0].cnt === 0) {
const defaultRules = JSON.stringify([
{ category: 'CPU', modelName: 'Intel Core i5-8500', condition: '미달' }
]);
await connection.query(
'INSERT INTO asset_issues (id, title, rules) VALUES (1, ?, ?)',
['윈도우 11불가', defaultRules]
);
console.log('✅ Default custom issue seeded into asset_issues.');
}
} catch (err) {
console.error('❌ Failed to verify/create job_spec_standards table:', {
db: getDbConnectionSummary(),
@@ -1180,6 +1202,59 @@ app.post('/api/upload', (req, res) => {
}
});
// GET /api/custom-issue (커스텀 이슈 조회)
app.get('/api/custom-issue', async (req, res) => {
let connection;
try {
connection = await pool.getConnection();
const [rows] = await connection.query('SELECT * FROM asset_issues WHERE id = 1');
if (rows.length > 0) {
const row = rows[0];
const rules = typeof row.rules === 'string' ? JSON.parse(row.rules) : row.rules;
res.json({
id: row.id,
title: row.title,
rules: rules
});
} else {
res.json({
title: '윈도우 11불가',
rules: [
{ category: 'CPU', requiredTier: '중급', condition: '미달' }
]
});
}
} catch (err) {
console.error('❌ Failed to fetch custom issue:', err);
res.status(500).json({ error: 'Failed to fetch custom issue' });
} finally {
if (connection) connection.release();
}
});
// POST /api/custom-issue (커스텀 이슈 저장/업데이트)
app.post('/api/custom-issue', async (req, res) => {
const { title, rules } = req.body;
if (!title || !rules) {
return res.status(400).json({ error: 'Missing title or rules' });
}
let connection;
try {
connection = await pool.getConnection();
const rulesStr = JSON.stringify(rules);
await connection.query(
'INSERT INTO asset_issues (id, title, rules) VALUES (1, ?, ?) ON DUPLICATE KEY UPDATE title = VALUES(title), rules = VALUES(rules)',
[title, rulesStr]
);
res.json({ success: true, title, rules });
} catch (err) {
console.error('❌ Failed to save custom issue:', err);
res.status(500).json({ error: 'Failed to save custom issue' });
} finally {
if (connection) connection.release();
}
});
// Health check endpoint for container orchestration
app.get('/health', async (req, res) => {
try {