feat(tkuser): Sprint 001 Section A — 연차/휴가 백엔드 전환 (DB + API)

workers/vacation_balance_details → sso_users/sp_vacation_balances 기반 전환.
부서장 설정, 승인권한 CRUD, vacation_settings 테이블, 장기근속 자동부여,
startup migration 추가.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-23 08:13:03 +09:00
parent b44ae36329
commit c158da7832
11 changed files with 501 additions and 70 deletions

View File

@@ -17,6 +17,7 @@ const workplaceRoutes = require('./routes/workplaceRoutes');
const equipmentRoutes = require('./routes/equipmentRoutes');
const taskRoutes = require('./routes/taskRoutes');
const vacationRoutes = require('./routes/vacationRoutes');
const vacationSettingsRoutes = require('./routes/vacationSettingsRoutes');
const partnerRoutes = require('./routes/partnerRoutes');
const vendorRoutes = require('./routes/vendorRoutes');
const consumableItemRoutes = require('./routes/consumableItemRoutes');
@@ -64,6 +65,7 @@ app.use('/api/workplaces', workplaceRoutes);
app.use('/api/equipments', equipmentRoutes);
app.use('/api/tasks', taskRoutes);
app.use('/api/vacations', vacationRoutes);
app.use('/api/vacation-settings', vacationSettingsRoutes);
app.use('/api/partners', partnerRoutes);
app.use('/api/vendors', vendorRoutes);
app.use('/api/consumable-items', consumableItemRoutes);
@@ -85,9 +87,23 @@ app.use((err, req, res, next) => {
});
});
app.listen(PORT, () => {
console.log(`tkuser-api running on port ${PORT}`);
});
// Startup: 마이그레이션 완료 후 서버 시작
async function start() {
try {
const { runMigration } = require('./models/vacationSettingsModel');
await runMigration();
} catch (err) {
if (!['ER_DUP_FIELDNAME', 'ER_TABLE_EXISTS_ERROR', 'ER_DUP_KEYNAME'].includes(err.code)) {
console.error('Fatal migration error:', err.message);
process.exit(1);
}
console.error('Migration warning (ignored):', err.message);
}
app.listen(PORT, () => {
console.log(`tkuser-api running on port ${PORT}`);
});
}
start();
// 오래된 알림 정리 cron (매일 03:00 KST)
(function scheduleNotificationCleanup() {