diff --git a/frontend/src/api/auth.ts b/frontend/src/api/auth.ts index 05fdb07..0aeda74 100644 --- a/frontend/src/api/auth.ts +++ b/frontend/src/api/auth.ts @@ -64,7 +64,7 @@ export interface User { * Login user */ export const login = async (credentials: LoginCredentials): Promise => { - const response = await apiClient.post('/api/auth/login/', credentials); + const response = await apiClient.post('/auth/login/', credentials); return response.data; }; @@ -72,14 +72,14 @@ export const login = async (credentials: LoginCredentials): Promise => { - await apiClient.post('/api/auth/logout/'); + await apiClient.post('/auth/logout/'); }; /** * Get current user */ export const getCurrentUser = async (): Promise => { - const response = await apiClient.get('/api/auth/me/'); + const response = await apiClient.get('/auth/me/'); return response.data; }; @@ -87,7 +87,7 @@ export const getCurrentUser = async (): Promise => { * Refresh access token */ export const refreshToken = async (refresh: string): Promise<{ access: string }> => { - const response = await apiClient.post('/api/auth/refresh/', { refresh }); + const response = await apiClient.post('/auth/refresh/', { refresh }); return response.data; }; @@ -99,7 +99,7 @@ export const masquerade = async ( hijack_history?: MasqueradeStackEntry[] ): Promise => { const response = await apiClient.post( - '/api/auth/hijack/acquire/', + '/auth/hijack/acquire/', { user_pk, hijack_history } ); return response.data; @@ -112,7 +112,7 @@ export const stopMasquerade = async ( masquerade_stack: MasqueradeStackEntry[] ): Promise => { const response = await apiClient.post( - '/api/auth/hijack/release/', + '/auth/hijack/release/', { masquerade_stack } ); return response.data; diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index dc44613..cdac322 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -88,11 +88,15 @@ apiClient.interceptors.response.use( return apiClient(originalRequest); } } catch (refreshError) { - // Refresh failed - clear tokens and redirect to login + // Refresh failed - clear tokens and redirect to login on root domain const { deleteCookie } = await import('../utils/cookies'); + const { getBaseDomain } = await import('../utils/domain'); deleteCookie('access_token'); deleteCookie('refresh_token'); - window.location.href = '/login'; + const protocol = window.location.protocol; + const baseDomain = getBaseDomain(); + const port = window.location.port ? `:${window.location.port}` : ''; + window.location.href = `${protocol}//${baseDomain}${port}/login`; return Promise.reject(refreshError); } } diff --git a/frontend/src/api/notifications.ts b/frontend/src/api/notifications.ts index ad7c7db..a0f066f 100644 --- a/frontend/src/api/notifications.ts +++ b/frontend/src/api/notifications.ts @@ -29,7 +29,7 @@ export const getNotifications = async (params?: { read?: boolean; limit?: number queryParams.append('limit', String(params.limit)); } const query = queryParams.toString(); - const url = query ? `/api/notifications/?${query}` : '/api/notifications/'; + const url = query ? `/notifications/?${query}` : '/notifications/'; const response = await apiClient.get(url); return response.data; }; @@ -38,7 +38,7 @@ export const getNotifications = async (params?: { read?: boolean; limit?: number * Get count of unread notifications */ export const getUnreadCount = async (): Promise => { - const response = await apiClient.get('/api/notifications/unread_count/'); + const response = await apiClient.get('/notifications/unread_count/'); return response.data.count; }; @@ -46,19 +46,19 @@ export const getUnreadCount = async (): Promise => { * Mark a single notification as read */ export const markNotificationRead = async (id: number): Promise => { - await apiClient.post(`/api/notifications/${id}/mark_read/`); + await apiClient.post(`/notifications/${id}/mark_read/`); }; /** * Mark all notifications as read */ export const markAllNotificationsRead = async (): Promise => { - await apiClient.post('/api/notifications/mark_all_read/'); + await apiClient.post('/notifications/mark_all_read/'); }; /** * Delete all read notifications */ export const clearAllNotifications = async (): Promise => { - await apiClient.delete('/api/notifications/clear_all/'); + await apiClient.delete('/notifications/clear_all/'); }; diff --git a/frontend/src/api/oauth.ts b/frontend/src/api/oauth.ts index 6d48bfc..8d67543 100644 --- a/frontend/src/api/oauth.ts +++ b/frontend/src/api/oauth.ts @@ -45,7 +45,7 @@ export interface OAuthConnection { * Get list of enabled OAuth providers */ export const getOAuthProviders = async (): Promise => { - const response = await apiClient.get<{ providers: OAuthProvider[] }>('/api/auth/oauth/providers/'); + const response = await apiClient.get<{ providers: OAuthProvider[] }>('/auth/oauth/providers/'); return response.data.providers; }; @@ -54,7 +54,7 @@ export const getOAuthProviders = async (): Promise => { */ export const initiateOAuth = async (provider: string): Promise => { const response = await apiClient.get( - `/api/auth/oauth/${provider}/authorize/` + `/auth/oauth/${provider}/authorize/` ); return response.data; }; @@ -68,7 +68,7 @@ export const handleOAuthCallback = async ( state: string ): Promise => { const response = await apiClient.post( - `/api/auth/oauth/${provider}/callback/`, + `/auth/oauth/${provider}/callback/`, { code, state, @@ -81,7 +81,7 @@ export const handleOAuthCallback = async ( * Get user's connected OAuth accounts */ export const getOAuthConnections = async (): Promise => { - const response = await apiClient.get<{ connections: OAuthConnection[] }>('/api/auth/oauth/connections/'); + const response = await apiClient.get<{ connections: OAuthConnection[] }>('/auth/oauth/connections/'); return response.data.connections; }; @@ -89,5 +89,5 @@ export const getOAuthConnections = async (): Promise => { * Disconnect an OAuth account */ export const disconnectOAuth = async (provider: string): Promise => { - await apiClient.delete(`/api/auth/oauth/connections/${provider}/`); + await apiClient.delete(`/auth/oauth/connections/${provider}/`); }; diff --git a/frontend/src/api/platform.ts b/frontend/src/api/platform.ts index b30d3b5..0ffba27 100644 --- a/frontend/src/api/platform.ts +++ b/frontend/src/api/platform.ts @@ -85,7 +85,7 @@ export interface PlatformUser { * Get all businesses (platform admin only) */ export const getBusinesses = async (): Promise => { - const response = await apiClient.get('/api/platform/businesses/'); + const response = await apiClient.get('/platform/businesses/'); return response.data; }; @@ -97,7 +97,7 @@ export const updateBusiness = async ( data: PlatformBusinessUpdate ): Promise => { const response = await apiClient.patch( - `/api/platform/businesses/${businessId}/`, + `/platform/businesses/${businessId}/`, data ); return response.data; @@ -110,7 +110,7 @@ export const createBusiness = async ( data: PlatformBusinessCreate ): Promise => { const response = await apiClient.post( - '/api/platform/businesses/', + '/platform/businesses/', data ); return response.data; @@ -120,7 +120,7 @@ export const createBusiness = async ( * Get all users (platform admin only) */ export const getUsers = async (): Promise => { - const response = await apiClient.get('/api/platform/users/'); + const response = await apiClient.get('/platform/users/'); return response.data; }; @@ -128,7 +128,7 @@ export const getUsers = async (): Promise => { * Get users for a specific business */ export const getBusinessUsers = async (businessId: number): Promise => { - const response = await apiClient.get(`/api/platform/users/?business=${businessId}`); + const response = await apiClient.get(`/platform/users/?business=${businessId}`); return response.data; }; @@ -136,7 +136,7 @@ export const getBusinessUsers = async (businessId: number): Promise => { - await apiClient.post(`/api/platform/users/${userId}/verify_email/`); + await apiClient.post(`/platform/users/${userId}/verify_email/`); }; // ============================================================================ @@ -218,7 +218,7 @@ export interface TenantInvitationAccept { * Get all tenant invitations (platform admin only) */ export const getTenantInvitations = async (): Promise => { - const response = await apiClient.get('/api/platform/tenant-invitations/'); + const response = await apiClient.get('/platform/tenant-invitations/'); return response.data; }; @@ -229,7 +229,7 @@ export const createTenantInvitation = async ( data: TenantInvitationCreate ): Promise => { const response = await apiClient.post( - '/api/platform/tenant-invitations/', + '/platform/tenant-invitations/', data ); return response.data; @@ -239,14 +239,14 @@ export const createTenantInvitation = async ( * Resend a tenant invitation (platform admin only) */ export const resendTenantInvitation = async (invitationId: number): Promise => { - await apiClient.post(`/api/platform/tenant-invitations/${invitationId}/resend/`); + await apiClient.post(`/platform/tenant-invitations/${invitationId}/resend/`); }; /** * Cancel a tenant invitation (platform admin only) */ export const cancelTenantInvitation = async (invitationId: number): Promise => { - await apiClient.post(`/api/platform/tenant-invitations/${invitationId}/cancel/`); + await apiClient.post(`/platform/tenant-invitations/${invitationId}/cancel/`); }; /** @@ -254,7 +254,7 @@ export const cancelTenantInvitation = async (invitationId: number): Promise => { const response = await apiClient.get( - `/api/platform/tenant-invitations/token/${token}/` + `/platform/tenant-invitations/token/${token}/` ); return response.data; }; @@ -267,7 +267,7 @@ export const acceptInvitation = async ( data: TenantInvitationAccept ): Promise<{ detail: string }> => { const response = await apiClient.post<{ detail: string }>( - `/api/platform/tenant-invitations/token/${token}/accept/`, + `/platform/tenant-invitations/token/${token}/accept/`, data ); return response.data;