export type AdminRole = { id: string name: string description?: string | null tenant_id: number | null } export type AdminTenant = { id: number name: string short: string user_count: number locked?: string | null } export type AdminUserProfile = { id: string user_id: string | null tenant_id: number full_name: string | null first_name: string last_name: string email?: string | null active: boolean } export type AdminUser = { id: string email: string display_name: string multiTenant: boolean must_change_password: boolean is_admin: boolean profile_defaults: { first_name: string last_name: string } tenant_ids: number[] role_assignments: { tenant_id: number; role_id: string }[] profile_assignments?: { tenant_id: number; profile_id?: string | null }[] profiles: AdminUserProfile[] } export type AdminOverview = { users: AdminUser[] tenants: AdminTenant[] roles: AdminRole[] unassignedProfiles: AdminUserProfile[] } export type TenantImportResult = { success: boolean tenantId: number tables: { table: string; rows: number }[] files: { restored: number; skipped: number } } export type SystemStatus = { checkedAt: string backend: { status: string uptimeSeconds: number nodeVersion: string environment: string } server: { status: string nodeExporterUrl: string error?: string | null hostname?: string | null kernel?: string | null cpuCount?: number | null uptimeSeconds?: number | null load: { one?: number | null; five?: number | null; fifteen?: number | null } memory: { totalBytes?: number | null; availableBytes?: number | null; usedBytes?: number | null; usedPercent?: number | null } disk: { rootTotalBytes?: number | null; rootAvailableBytes?: number | null; rootUsedBytes?: number | null; rootUsedPercent?: number | null } } services: Record } export type InstanceAgent = { id: string createdAt: string updatedAt: string name: string description?: string | null tokenPrefix: string active: boolean capabilities: Record scannerNames: string[] printerNames: string[] preferredScannerName?: string | null scanDefaults: { format?: string resolution?: number mode?: string source?: string | null [key: string]: any } lastSeenAt?: string | null lastDebugInfo?: Record | null } export type CreateInstanceAgentResult = { agent: InstanceAgent token: string } export const useAdmin = () => { const { $api } = useNuxtApp() const getOverview = async (): Promise => { const response = await $api("/api/admin/overview") as any return { users: response?.users || [], tenants: response?.tenants || [], roles: response?.roles || [], unassignedProfiles: response?.unassignedProfiles || [], } } const createUser = async (body: Record) => { return await $api("/api/admin/users", { method: "POST", body, }) } const createUserForProfile = async (profileId: string, body: Record) => { return await $api(`/api/admin/profiles/${profileId}/create-user`, { method: "POST", body, }) } const updateUser = async (id: string, body: Record) => { return await $api(`/api/admin/users/${id}`, { method: "PUT", body, }) } const updateUserAccess = async (id: string, body: Record) => { return await $api(`/api/admin/users/${id}/access`, { method: "PUT", body, }) } const createTenant = async (body: Record) => { return await $api("/api/admin/tenants", { method: "POST", body, }) } const invitePortalUser = async (customerId: number) => { return await $api(`/api/admin/customers/${customerId}/invite-portal-user`, { method: "POST", }) } const updateTenant = async (id: number, body: Record) => { return await $api(`/api/admin/tenants/${id}`, { method: "PUT", body, }) } const exportTenant = async (id: number): Promise => { return await $api(`/api/admin/tenants/${id}/export`, { responseType: "blob", }) } const importTenant = async (body: Record): Promise => { return await $api("/api/admin/tenant-imports", { method: "POST", body, }) } const getSystemStatus = async (): Promise => { return await $api("/api/admin/system-status") } const getInstanceAgents = async (): Promise<{ agents: InstanceAgent[] }> => { const response = await $api("/api/instance-agents") as any return { agents: response?.agents || [] } } const createInstanceAgent = async (body: Record): Promise => { return await $api("/api/instance-agents", { method: "POST", body, }) } const updateInstanceAgent = async (id: string, body: Record): Promise<{ agent: InstanceAgent }> => { return await $api(`/api/instance-agents/${id}`, { method: "PATCH", body, }) } return { getOverview, getSystemStatus, getInstanceAgents, createInstanceAgent, updateInstanceAgent, createUser, createUserForProfile, updateUser, updateUserAccess, createTenant, invitePortalUser, updateTenant, exportTenant, importTenant, } }