feat: add Node ACS admin workflows

This commit is contained in:
unknown
2026-07-16 11:00:09 +09:00
parent a25872394a
commit c6f342a861
24 changed files with 3442 additions and 266 deletions

View File

@@ -1,6 +1,7 @@
import {
AccessAction,
AccessRecord,
AdminExcelImportResult,
ApiResponse,
AuditLog,
BlacklistCreate,
@@ -12,10 +13,15 @@ import {
InsideVisitor,
LoginRequest,
PassDelivery,
PurposeCode,
Role,
StatsSummary,
PublicPass,
Team,
VisitRequestCreate,
VisitRequestView,
AdminUser,
Watcher1Settings,
Zone,
} from './types';
@@ -85,6 +91,7 @@ export const changePassword = (req: ChangePasswordRequest) =>
// ===== Zones =====
export const listZones = () => request<Zone[]>('/zones');
export const listPurposeCodes = () => request<PurposeCode[]>('/purpose-codes');
// ===== Visit requests =====
export const listVisitRequests = () =>
@@ -154,6 +161,9 @@ export const deleteBlacklist = (id: number) =>
request<string>(`/blacklist/${id}`, { method: 'DELETE' });
// ===== Reports =====
export const listReportVisits = (from: string, to: string) =>
request<VisitRequestView[]>(`/reports/visits?from=${from}&to=${to}`);
export const reportDownloadUrl = (from: string, to: string) =>
`/api/reports/visits.xlsx?from=${from}&to=${to}`;
@@ -165,3 +175,45 @@ export const listDeliveries = (status?: DeliveryStatus) =>
request<PassDelivery[]>(`/admin/deliveries${status ? `?status=${status}` : ''}`);
export const retryDelivery = (id: number) =>
request<PassDelivery>(`/admin/deliveries/${id}/retry`, { method: 'POST' });
// ===== Admin management =====
export const listAdminPurposeCodes = () => request<PurposeCode[]>('/admin/purpose-codes');
export const createAdminPurposeCode = (payload: Omit<PurposeCode, 'id'>) =>
request<PurposeCode>('/admin/purpose-codes', jsonInit('POST', payload));
export const updateAdminPurposeCode = (id: number, payload: Omit<PurposeCode, 'id'>) =>
request<PurposeCode>(`/admin/purpose-codes/${id}`, jsonInit('PUT', payload));
export const getWatcher1Settings = () => request<Watcher1Settings>('/settings/watcher1');
export const updateWatcher1Settings = (payload: Watcher1Settings) =>
request<Watcher1Settings>('/admin/settings/watcher1', jsonInit('PUT', payload));
export const listAdminUsers = () => request<AdminUser[]>('/admin/users');
export const updateAdminUserRoles = (id: number, roles: Role[]) =>
request<AdminUser>(`/admin/users/${id}/roles`, jsonInit('PUT', { roles }));
export const listAdminTeams = () => request<Team[]>('/admin/teams');
export const createAdminTeam = (payload: Omit<Team, 'id'>) =>
request<Team>('/admin/teams', jsonInit('POST', payload));
export const updateAdminTeam = (id: number, payload: Omit<Team, 'id'>) =>
request<Team>(`/admin/teams/${id}`, jsonInit('PUT', payload));
export const updateAdminUserTeam = (id: number, teamId: number, applyDefaultRoles: boolean) =>
request<AdminUser>(`/admin/users/${id}/team`, jsonInit('PUT', { teamId, applyDefaultRoles }));
export const applyTeamDefaultRolesToUser = (id: number) =>
request<AdminUser>(`/admin/users/${id}/apply-team-default-roles`, { method: 'POST' });
export const applyTeamDefaultRolesToMembers = (teamId: number) =>
request<string>(`/admin/teams/${teamId}/apply-default-roles`, { method: 'POST' });
export const uploadAdminTeams = (file: File, dryRun: boolean) => {
const form = new FormData();
form.append('file', file);
return request<AdminExcelImportResult>(`/admin/teams/upload?dryRun=${dryRun}`, {
method: 'POST',
body: form,
});
};
export const uploadAdminUserRoles = (file: File, dryRun: boolean) => {
const form = new FormData();
form.append('file', file);
return request<AdminExcelImportResult>(`/admin/users/roles/upload?dryRun=${dryRun}`, {
method: 'POST',
body: form,
});
};
export const adminTeamTemplateUrl = () => '/api/admin/teams/template';
export const adminUserRolesTemplateUrl = () => '/api/admin/users/roles/template';