feat: add admin visit request deletion
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user