refactor(api): Remove '/api' prefix from frontend API calls and config
- Removed '/api/' prefix from endpoint paths in auth.ts, notifications.ts, oauth.ts, and platform.ts to align with the backend URL reconfiguration. - Updated 'API_BASE_URL' in config.ts to remove the '/api' suffix, ensuring that API requests are correctly routed to the root of the 'api' subdomain (e.g., http://api.lvh.me:8000/). - Included improvements to login redirect logic in client.ts.
This commit is contained in:
@@ -64,7 +64,7 @@ export interface User {
|
|||||||
* Login user
|
* Login user
|
||||||
*/
|
*/
|
||||||
export const login = async (credentials: LoginCredentials): Promise<LoginResponse> => {
|
export const login = async (credentials: LoginCredentials): Promise<LoginResponse> => {
|
||||||
const response = await apiClient.post<LoginResponse>('/api/auth/login/', credentials);
|
const response = await apiClient.post<LoginResponse>('/auth/login/', credentials);
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -72,14 +72,14 @@ export const login = async (credentials: LoginCredentials): Promise<LoginRespons
|
|||||||
* Logout user
|
* Logout user
|
||||||
*/
|
*/
|
||||||
export const logout = async (): Promise<void> => {
|
export const logout = async (): Promise<void> => {
|
||||||
await apiClient.post('/api/auth/logout/');
|
await apiClient.post('/auth/logout/');
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current user
|
* Get current user
|
||||||
*/
|
*/
|
||||||
export const getCurrentUser = async (): Promise<User> => {
|
export const getCurrentUser = async (): Promise<User> => {
|
||||||
const response = await apiClient.get<User>('/api/auth/me/');
|
const response = await apiClient.get<User>('/auth/me/');
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ export const getCurrentUser = async (): Promise<User> => {
|
|||||||
* Refresh access token
|
* Refresh access token
|
||||||
*/
|
*/
|
||||||
export const refreshToken = async (refresh: string): Promise<{ access: string }> => {
|
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;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ export const masquerade = async (
|
|||||||
hijack_history?: MasqueradeStackEntry[]
|
hijack_history?: MasqueradeStackEntry[]
|
||||||
): Promise<LoginResponse> => {
|
): Promise<LoginResponse> => {
|
||||||
const response = await apiClient.post<LoginResponse>(
|
const response = await apiClient.post<LoginResponse>(
|
||||||
'/api/auth/hijack/acquire/',
|
'/auth/hijack/acquire/',
|
||||||
{ user_pk, hijack_history }
|
{ user_pk, hijack_history }
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
@@ -112,7 +112,7 @@ export const stopMasquerade = async (
|
|||||||
masquerade_stack: MasqueradeStackEntry[]
|
masquerade_stack: MasqueradeStackEntry[]
|
||||||
): Promise<LoginResponse> => {
|
): Promise<LoginResponse> => {
|
||||||
const response = await apiClient.post<LoginResponse>(
|
const response = await apiClient.post<LoginResponse>(
|
||||||
'/api/auth/hijack/release/',
|
'/auth/hijack/release/',
|
||||||
{ masquerade_stack }
|
{ masquerade_stack }
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
|
|||||||
@@ -88,11 +88,15 @@ apiClient.interceptors.response.use(
|
|||||||
return apiClient(originalRequest);
|
return apiClient(originalRequest);
|
||||||
}
|
}
|
||||||
} catch (refreshError) {
|
} 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 { deleteCookie } = await import('../utils/cookies');
|
||||||
|
const { getBaseDomain } = await import('../utils/domain');
|
||||||
deleteCookie('access_token');
|
deleteCookie('access_token');
|
||||||
deleteCookie('refresh_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);
|
return Promise.reject(refreshError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export const getNotifications = async (params?: { read?: boolean; limit?: number
|
|||||||
queryParams.append('limit', String(params.limit));
|
queryParams.append('limit', String(params.limit));
|
||||||
}
|
}
|
||||||
const query = queryParams.toString();
|
const query = queryParams.toString();
|
||||||
const url = query ? `/api/notifications/?${query}` : '/api/notifications/';
|
const url = query ? `/notifications/?${query}` : '/notifications/';
|
||||||
const response = await apiClient.get(url);
|
const response = await apiClient.get(url);
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
@@ -38,7 +38,7 @@ export const getNotifications = async (params?: { read?: boolean; limit?: number
|
|||||||
* Get count of unread notifications
|
* Get count of unread notifications
|
||||||
*/
|
*/
|
||||||
export const getUnreadCount = async (): Promise<number> => {
|
export const getUnreadCount = async (): Promise<number> => {
|
||||||
const response = await apiClient.get<UnreadCountResponse>('/api/notifications/unread_count/');
|
const response = await apiClient.get<UnreadCountResponse>('/notifications/unread_count/');
|
||||||
return response.data.count;
|
return response.data.count;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -46,19 +46,19 @@ export const getUnreadCount = async (): Promise<number> => {
|
|||||||
* Mark a single notification as read
|
* Mark a single notification as read
|
||||||
*/
|
*/
|
||||||
export const markNotificationRead = async (id: number): Promise<void> => {
|
export const markNotificationRead = async (id: number): Promise<void> => {
|
||||||
await apiClient.post(`/api/notifications/${id}/mark_read/`);
|
await apiClient.post(`/notifications/${id}/mark_read/`);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark all notifications as read
|
* Mark all notifications as read
|
||||||
*/
|
*/
|
||||||
export const markAllNotificationsRead = async (): Promise<void> => {
|
export const markAllNotificationsRead = async (): Promise<void> => {
|
||||||
await apiClient.post('/api/notifications/mark_all_read/');
|
await apiClient.post('/notifications/mark_all_read/');
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete all read notifications
|
* Delete all read notifications
|
||||||
*/
|
*/
|
||||||
export const clearAllNotifications = async (): Promise<void> => {
|
export const clearAllNotifications = async (): Promise<void> => {
|
||||||
await apiClient.delete('/api/notifications/clear_all/');
|
await apiClient.delete('/notifications/clear_all/');
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export interface OAuthConnection {
|
|||||||
* Get list of enabled OAuth providers
|
* Get list of enabled OAuth providers
|
||||||
*/
|
*/
|
||||||
export const getOAuthProviders = async (): Promise<OAuthProvider[]> => {
|
export const getOAuthProviders = async (): Promise<OAuthProvider[]> => {
|
||||||
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;
|
return response.data.providers;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ export const getOAuthProviders = async (): Promise<OAuthProvider[]> => {
|
|||||||
*/
|
*/
|
||||||
export const initiateOAuth = async (provider: string): Promise<OAuthAuthorizationResponse> => {
|
export const initiateOAuth = async (provider: string): Promise<OAuthAuthorizationResponse> => {
|
||||||
const response = await apiClient.get<OAuthAuthorizationResponse>(
|
const response = await apiClient.get<OAuthAuthorizationResponse>(
|
||||||
`/api/auth/oauth/${provider}/authorize/`
|
`/auth/oauth/${provider}/authorize/`
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
@@ -68,7 +68,7 @@ export const handleOAuthCallback = async (
|
|||||||
state: string
|
state: string
|
||||||
): Promise<OAuthTokenResponse> => {
|
): Promise<OAuthTokenResponse> => {
|
||||||
const response = await apiClient.post<OAuthTokenResponse>(
|
const response = await apiClient.post<OAuthTokenResponse>(
|
||||||
`/api/auth/oauth/${provider}/callback/`,
|
`/auth/oauth/${provider}/callback/`,
|
||||||
{
|
{
|
||||||
code,
|
code,
|
||||||
state,
|
state,
|
||||||
@@ -81,7 +81,7 @@ export const handleOAuthCallback = async (
|
|||||||
* Get user's connected OAuth accounts
|
* Get user's connected OAuth accounts
|
||||||
*/
|
*/
|
||||||
export const getOAuthConnections = async (): Promise<OAuthConnection[]> => {
|
export const getOAuthConnections = async (): Promise<OAuthConnection[]> => {
|
||||||
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;
|
return response.data.connections;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -89,5 +89,5 @@ export const getOAuthConnections = async (): Promise<OAuthConnection[]> => {
|
|||||||
* Disconnect an OAuth account
|
* Disconnect an OAuth account
|
||||||
*/
|
*/
|
||||||
export const disconnectOAuth = async (provider: string): Promise<void> => {
|
export const disconnectOAuth = async (provider: string): Promise<void> => {
|
||||||
await apiClient.delete(`/api/auth/oauth/connections/${provider}/`);
|
await apiClient.delete(`/auth/oauth/connections/${provider}/`);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ export interface PlatformUser {
|
|||||||
* Get all businesses (platform admin only)
|
* Get all businesses (platform admin only)
|
||||||
*/
|
*/
|
||||||
export const getBusinesses = async (): Promise<PlatformBusiness[]> => {
|
export const getBusinesses = async (): Promise<PlatformBusiness[]> => {
|
||||||
const response = await apiClient.get<PlatformBusiness[]>('/api/platform/businesses/');
|
const response = await apiClient.get<PlatformBusiness[]>('/platform/businesses/');
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ export const updateBusiness = async (
|
|||||||
data: PlatformBusinessUpdate
|
data: PlatformBusinessUpdate
|
||||||
): Promise<PlatformBusiness> => {
|
): Promise<PlatformBusiness> => {
|
||||||
const response = await apiClient.patch<PlatformBusiness>(
|
const response = await apiClient.patch<PlatformBusiness>(
|
||||||
`/api/platform/businesses/${businessId}/`,
|
`/platform/businesses/${businessId}/`,
|
||||||
data
|
data
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
@@ -110,7 +110,7 @@ export const createBusiness = async (
|
|||||||
data: PlatformBusinessCreate
|
data: PlatformBusinessCreate
|
||||||
): Promise<PlatformBusiness> => {
|
): Promise<PlatformBusiness> => {
|
||||||
const response = await apiClient.post<PlatformBusiness>(
|
const response = await apiClient.post<PlatformBusiness>(
|
||||||
'/api/platform/businesses/',
|
'/platform/businesses/',
|
||||||
data
|
data
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
@@ -120,7 +120,7 @@ export const createBusiness = async (
|
|||||||
* Get all users (platform admin only)
|
* Get all users (platform admin only)
|
||||||
*/
|
*/
|
||||||
export const getUsers = async (): Promise<PlatformUser[]> => {
|
export const getUsers = async (): Promise<PlatformUser[]> => {
|
||||||
const response = await apiClient.get<PlatformUser[]>('/api/platform/users/');
|
const response = await apiClient.get<PlatformUser[]>('/platform/users/');
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ export const getUsers = async (): Promise<PlatformUser[]> => {
|
|||||||
* Get users for a specific business
|
* Get users for a specific business
|
||||||
*/
|
*/
|
||||||
export const getBusinessUsers = async (businessId: number): Promise<PlatformUser[]> => {
|
export const getBusinessUsers = async (businessId: number): Promise<PlatformUser[]> => {
|
||||||
const response = await apiClient.get<PlatformUser[]>(`/api/platform/users/?business=${businessId}`);
|
const response = await apiClient.get<PlatformUser[]>(`/platform/users/?business=${businessId}`);
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ export const getBusinessUsers = async (businessId: number): Promise<PlatformUser
|
|||||||
* Verify a user's email (platform admin only)
|
* Verify a user's email (platform admin only)
|
||||||
*/
|
*/
|
||||||
export const verifyUserEmail = async (userId: number): Promise<void> => {
|
export const verifyUserEmail = async (userId: number): Promise<void> => {
|
||||||
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)
|
* Get all tenant invitations (platform admin only)
|
||||||
*/
|
*/
|
||||||
export const getTenantInvitations = async (): Promise<TenantInvitation[]> => {
|
export const getTenantInvitations = async (): Promise<TenantInvitation[]> => {
|
||||||
const response = await apiClient.get<TenantInvitation[]>('/api/platform/tenant-invitations/');
|
const response = await apiClient.get<TenantInvitation[]>('/platform/tenant-invitations/');
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -229,7 +229,7 @@ export const createTenantInvitation = async (
|
|||||||
data: TenantInvitationCreate
|
data: TenantInvitationCreate
|
||||||
): Promise<TenantInvitation> => {
|
): Promise<TenantInvitation> => {
|
||||||
const response = await apiClient.post<TenantInvitation>(
|
const response = await apiClient.post<TenantInvitation>(
|
||||||
'/api/platform/tenant-invitations/',
|
'/platform/tenant-invitations/',
|
||||||
data
|
data
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
@@ -239,14 +239,14 @@ export const createTenantInvitation = async (
|
|||||||
* Resend a tenant invitation (platform admin only)
|
* Resend a tenant invitation (platform admin only)
|
||||||
*/
|
*/
|
||||||
export const resendTenantInvitation = async (invitationId: number): Promise<void> => {
|
export const resendTenantInvitation = async (invitationId: number): Promise<void> => {
|
||||||
await apiClient.post(`/api/platform/tenant-invitations/${invitationId}/resend/`);
|
await apiClient.post(`/platform/tenant-invitations/${invitationId}/resend/`);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancel a tenant invitation (platform admin only)
|
* Cancel a tenant invitation (platform admin only)
|
||||||
*/
|
*/
|
||||||
export const cancelTenantInvitation = async (invitationId: number): Promise<void> => {
|
export const cancelTenantInvitation = async (invitationId: number): Promise<void> => {
|
||||||
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<void
|
|||||||
*/
|
*/
|
||||||
export const getInvitationByToken = async (token: string): Promise<TenantInvitationDetail> => {
|
export const getInvitationByToken = async (token: string): Promise<TenantInvitationDetail> => {
|
||||||
const response = await apiClient.get<TenantInvitationDetail>(
|
const response = await apiClient.get<TenantInvitationDetail>(
|
||||||
`/api/platform/tenant-invitations/token/${token}/`
|
`/platform/tenant-invitations/token/${token}/`
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
@@ -267,7 +267,7 @@ export const acceptInvitation = async (
|
|||||||
data: TenantInvitationAccept
|
data: TenantInvitationAccept
|
||||||
): Promise<{ detail: string }> => {
|
): Promise<{ detail: string }> => {
|
||||||
const response = await apiClient.post<{ detail: string }>(
|
const response = await apiClient.post<{ detail: string }>(
|
||||||
`/api/platform/tenant-invitations/token/${token}/accept/`,
|
`/platform/tenant-invitations/token/${token}/accept/`,
|
||||||
data
|
data
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
|
|||||||
Reference in New Issue
Block a user