/** * @ai-summary API client functions for admin feature * @ai-context Communicates with backend admin endpoints */ import { apiClient } from '../../../core/api/client'; import { AdminAccessResponse, AdminUser, CreateAdminRequest, AdminAuditLog, CatalogMake, CatalogModel, CatalogYear, CatalogTrim, CatalogEngine, CreateCatalogMakeRequest, UpdateCatalogMakeRequest, CreateCatalogModelRequest, UpdateCatalogModelRequest, CreateCatalogYearRequest, UpdateCatalogYearRequest, CreateCatalogTrimRequest, UpdateCatalogTrimRequest, CreateCatalogEngineRequest, UpdateCatalogEngineRequest, CatalogSearchResponse, ImportPreviewResult, ImportApplyResult, CascadeDeleteResult, EmailTemplate, UpdateEmailTemplateRequest, PreviewTemplateResponse, // User management types ManagedUser, ListUsersResponse, ListUsersParams, UpdateUserTierRequest, DeactivateUserRequest, UpdateUserProfileRequest, PromoteToAdminRequest, // Backup types BackupHistory, BackupSchedule, BackupSettings, ListBackupsResponse, CreateBackupRequest, CreateScheduleRequest, UpdateScheduleRequest, RestorePreviewResponse, } from '../types/admin.types'; export interface AuditLogsResponse { logs: AdminAuditLog[]; total: number; } // Admin access verification export const adminApi = { // Verify admin access verifyAccess: async (): Promise => { const response = await apiClient.get('/admin/verify'); return response.data; }, // Admin management listAdmins: async (): Promise => { const response = await apiClient.get('/admin/admins'); return response.data; }, createAdmin: async (data: CreateAdminRequest): Promise => { const response = await apiClient.post('/admin/admins', data); return response.data; }, revokeAdmin: async (auth0Sub: string): Promise => { await apiClient.patch(`/admin/admins/${auth0Sub}/revoke`); }, reinstateAdmin: async (auth0Sub: string): Promise => { await apiClient.patch(`/admin/admins/${auth0Sub}/reinstate`); }, // Audit logs listAuditLogs: async (): Promise => { const response = await apiClient.get('/admin/audit-logs'); return response.data; }, // Catalog - Makes listMakes: async (): Promise => { const response = await apiClient.get<{ makes: CatalogMake[] }>('/admin/catalog/makes'); return response.data.makes; }, createMake: async (data: CreateCatalogMakeRequest): Promise => { const response = await apiClient.post('/admin/catalog/makes', data); return response.data; }, updateMake: async (id: string, data: UpdateCatalogMakeRequest): Promise => { const response = await apiClient.put(`/admin/catalog/makes/${id}`, data); return response.data; }, deleteMake: async (id: string): Promise => { await apiClient.delete(`/admin/catalog/makes/${id}`); }, // Catalog - Models listModels: async (makeId: string): Promise => { const response = await apiClient.get<{ models: CatalogModel[] }>( `/admin/catalog/makes/${makeId}/models` ); return response.data.models; }, createModel: async (data: CreateCatalogModelRequest): Promise => { const response = await apiClient.post('/admin/catalog/models', data); return response.data; }, updateModel: async (id: string, data: UpdateCatalogModelRequest): Promise => { const response = await apiClient.put(`/admin/catalog/models/${id}`, data); return response.data; }, deleteModel: async (id: string): Promise => { await apiClient.delete(`/admin/catalog/models/${id}`); }, // Catalog - Years listYears: async (modelId: string): Promise => { const response = await apiClient.get<{ years: CatalogYear[] }>( `/admin/catalog/models/${modelId}/years` ); return response.data.years; }, createYear: async (data: CreateCatalogYearRequest): Promise => { const response = await apiClient.post('/admin/catalog/years', data); return response.data; }, updateYear: async (id: string, data: UpdateCatalogYearRequest): Promise => { const response = await apiClient.put(`/admin/catalog/years/${id}`, data); return response.data; }, deleteYear: async (id: string): Promise => { await apiClient.delete(`/admin/catalog/years/${id}`); }, // Catalog - Trims listTrims: async (yearId: string): Promise => { const response = await apiClient.get<{ trims: CatalogTrim[] }>( `/admin/catalog/years/${yearId}/trims` ); return response.data.trims; }, createTrim: async (data: CreateCatalogTrimRequest): Promise => { const response = await apiClient.post('/admin/catalog/trims', data); return response.data; }, updateTrim: async (id: string, data: UpdateCatalogTrimRequest): Promise => { const response = await apiClient.put(`/admin/catalog/trims/${id}`, data); return response.data; }, deleteTrim: async (id: string): Promise => { await apiClient.delete(`/admin/catalog/trims/${id}`); }, // Catalog - Engines listEngines: async (trimId: string): Promise => { const response = await apiClient.get<{ engines: CatalogEngine[] }>( `/admin/catalog/trims/${trimId}/engines` ); return response.data.engines; }, createEngine: async (data: CreateCatalogEngineRequest): Promise => { const response = await apiClient.post('/admin/catalog/engines', data); return response.data; }, updateEngine: async (id: string, data: UpdateCatalogEngineRequest): Promise => { const response = await apiClient.put(`/admin/catalog/engines/${id}`, data); return response.data; }, deleteEngine: async (id: string): Promise => { await apiClient.delete(`/admin/catalog/engines/${id}`); }, // Catalog Search searchCatalog: async ( query: string, page: number = 1, pageSize: number = 50 ): Promise => { const response = await apiClient.get('/admin/catalog/search', { params: { q: query, page, pageSize }, }); return response.data; }, // Catalog Import/Export importPreview: async (file: File): Promise => { const formData = new FormData(); formData.append('file', file); const response = await apiClient.post( '/admin/catalog/import/preview', formData, { headers: { 'Content-Type': 'multipart/form-data' }, } ); return response.data; }, importApply: async (previewId: string): Promise => { const response = await apiClient.post('/admin/catalog/import/apply', { previewId, }); return response.data; }, exportCatalog: async (): Promise => { const response = await apiClient.get('/admin/catalog/export', { responseType: 'blob', }); return response.data; }, // Cascade Delete deleteMakeCascade: async (id: string): Promise => { const response = await apiClient.delete( `/admin/catalog/makes/${id}/cascade` ); return response.data; }, deleteModelCascade: async (id: string): Promise => { const response = await apiClient.delete( `/admin/catalog/models/${id}/cascade` ); return response.data; }, deleteYearCascade: async (id: string): Promise => { const response = await apiClient.delete( `/admin/catalog/years/${id}/cascade` ); return response.data; }, deleteTrimCascade: async (id: string): Promise => { const response = await apiClient.delete( `/admin/catalog/trims/${id}/cascade` ); return response.data; }, // Email Templates emailTemplates: { list: async (): Promise => { const response = await apiClient.get('/admin/email-templates'); return response.data; }, get: async (key: string): Promise => { const response = await apiClient.get(`/admin/email-templates/${key}`); return response.data; }, update: async (key: string, data: UpdateEmailTemplateRequest): Promise => { const response = await apiClient.put(`/admin/email-templates/${key}`, data); return response.data; }, preview: async (key: string, variables: Record): Promise => { const response = await apiClient.post( `/admin/email-templates/${key}/preview`, { variables } ); return response.data; }, sendTest: async (key: string): Promise<{ message?: string; error?: string }> => { const response = await apiClient.post<{ message?: string; error?: string }>( `/admin/email-templates/${key}/test` ); return response.data; }, }, // User Management users: { list: async (params: ListUsersParams = {}): Promise => { const response = await apiClient.get('/admin/users', { params }); return response.data; }, get: async (auth0Sub: string): Promise => { const response = await apiClient.get( `/admin/users/${encodeURIComponent(auth0Sub)}` ); return response.data; }, updateTier: async (auth0Sub: string, data: UpdateUserTierRequest): Promise => { const response = await apiClient.patch( `/admin/users/${encodeURIComponent(auth0Sub)}/tier`, data ); return response.data; }, deactivate: async (auth0Sub: string, data?: DeactivateUserRequest): Promise => { const response = await apiClient.patch( `/admin/users/${encodeURIComponent(auth0Sub)}/deactivate`, data || {} ); return response.data; }, reactivate: async (auth0Sub: string): Promise => { const response = await apiClient.patch( `/admin/users/${encodeURIComponent(auth0Sub)}/reactivate` ); return response.data; }, updateProfile: async (auth0Sub: string, data: UpdateUserProfileRequest): Promise => { const response = await apiClient.patch( `/admin/users/${encodeURIComponent(auth0Sub)}/profile`, data ); return response.data; }, promoteToAdmin: async (auth0Sub: string, data?: PromoteToAdminRequest): Promise => { const response = await apiClient.patch( `/admin/users/${encodeURIComponent(auth0Sub)}/promote`, data || {} ); return response.data; }, hardDelete: async (auth0Sub: string, reason?: string): Promise<{ message: string }> => { const response = await apiClient.delete<{ message: string }>( `/admin/users/${encodeURIComponent(auth0Sub)}`, { params: reason ? { reason } : undefined } ); return response.data; }, }, // Backup & Restore backups: { // List backups with pagination list: async (params: { page?: number; pageSize?: number } = {}): Promise => { const response = await apiClient.get('/admin/backups', { params }); return response.data; }, // Get backup details get: async (id: string): Promise => { const response = await apiClient.get(`/admin/backups/${id}`); return response.data; }, // Create manual backup create: async (data: CreateBackupRequest = {}): Promise => { const response = await apiClient.post('/admin/backups', data); return response.data; }, // Download backup file download: async (id: string): Promise => { const response = await apiClient.get(`/admin/backups/${id}/download`, { responseType: 'blob', }); return response.data; }, // Delete backup delete: async (id: string): Promise => { await apiClient.delete(`/admin/backups/${id}`); }, // Upload backup file upload: async (file: File): Promise => { const formData = new FormData(); formData.append('file', file); const response = await apiClient.post('/admin/backups/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }); return response.data; }, // Preview restore previewRestore: async (id: string): Promise => { const response = await apiClient.post( `/admin/backups/${id}/restore/preview` ); return response.data; }, // Execute restore restore: async (id: string): Promise<{ message: string }> => { const response = await apiClient.post<{ message: string }>( `/admin/backups/${id}/restore` ); return response.data; }, // Schedules schedules: { list: async (): Promise => { const response = await apiClient.get('/admin/backups/schedules'); return response.data; }, get: async (id: string): Promise => { const response = await apiClient.get(`/admin/backups/schedules/${id}`); return response.data; }, create: async (data: CreateScheduleRequest): Promise => { const response = await apiClient.post('/admin/backups/schedules', data); return response.data; }, update: async (id: string, data: UpdateScheduleRequest): Promise => { const response = await apiClient.put( `/admin/backups/schedules/${id}`, data ); return response.data; }, delete: async (id: string): Promise => { await apiClient.delete(`/admin/backups/schedules/${id}`); }, toggle: async (id: string): Promise => { const response = await apiClient.patch( `/admin/backups/schedules/${id}/toggle` ); return response.data; }, }, // Settings settings: { get: async (): Promise => { const response = await apiClient.get('/admin/backups/settings'); return response.data; }, update: async (data: Partial): Promise => { const response = await apiClient.put('/admin/backups/settings', data); return response.data; }, }, }, };