feat: add admin visit request deletion

This commit is contained in:
unknown
2026-07-20 18:55:28 +09:00
parent 85f94ba4f2
commit e4caed8773
6 changed files with 77 additions and 7 deletions

View File

@@ -18,6 +18,7 @@ interface BusinessRouterDeps {
interface VisitRow {
id: string;
visitor_id: string;
visitor_name: string;
company: string | null;
contact: string | null;
@@ -582,6 +583,33 @@ export function createBusinessRouter(deps: BusinessRouterDeps = { query }): Rout
ok(res, toVisit((await visitById(dbQuery, Number(req.params.id)))!));
}));
router.delete('/visit-requests/:id', asyncRoute(async (req, res) => {
const actor = await requireAdmin(dbQuery, req);
const id = Number(req.params.id);
const visit = await visitById(dbQuery, id);
if (!visit) throw new ApiError(404, '방문 신청을 찾을 수 없습니다.');
const events = await dbQuery<{ count: string }>(
'SELECT count(*) AS count FROM access_events WHERE visit_request_id = $1',
[id],
);
if (Number(events.rows[0]?.count ?? 0) > 0) {
throw new ApiError(400, '실제 입/퇴장 기록이 있는 신청은 삭제할 수 없습니다.');
}
await dbQuery('DELETE FROM pass_deliveries WHERE visit_request_id = $1', [id]);
await dbQuery('DELETE FROM approvals WHERE visit_request_id = $1', [id]);
await dbQuery('DELETE FROM visit_requests WHERE id = $1', [id]);
await dbQuery(
`DELETE FROM visitors v
WHERE v.id = $1
AND NOT EXISTS (SELECT 1 FROM visit_requests vr WHERE vr.visitor_id = v.id)`,
[Number(visit.visitor_id)],
);
await audit(dbQuery, actor, 'DELETE', 'VISIT_REQUEST', id, `신청 삭제: ${visit.visitor_name} / ${visit.zone_name ?? '-'}`);
ok(res, { deleted: true });
}));
router.post('/visit-requests/upload', upload.single('file'), asyncRoute(async (req, res) => {
const actor = await requireCurrentUser(dbQuery, req);
ok(res, await importVisitWorkbook(dbQuery, actor, req.file));