xpeditis2.0/apps/frontend/lib/api/auth.ts
David-Henri ARNAUD b31d325646 feature phase 2
2025-10-10 15:07:05 +02:00

150 lines
3.4 KiB
TypeScript

/**
* Auth API
*
* Authentication-related API calls
*/
import { apiClient } from './client';
export interface LoginRequest {
email: string;
password: string;
}
export interface RegisterRequest {
email: string;
password: string;
firstName: string;
lastName: string;
organizationId: string;
}
export interface AuthResponse {
accessToken: string;
refreshToken: string;
user: {
id: string;
email: string;
firstName: string;
lastName: string;
role: string;
organizationId: string;
};
}
export interface User {
id: string;
email: string;
firstName: string;
lastName: string;
role: string;
organizationId: string;
isEmailVerified: boolean;
isActive: boolean;
}
export const authApi = {
/**
* Login with email and password
*/
async login(data: LoginRequest): Promise<AuthResponse> {
const response = await apiClient.post<AuthResponse>('/api/v1/auth/login', data);
// Store tokens in localStorage
if (typeof window !== 'undefined') {
localStorage.setItem('accessToken', response.accessToken);
localStorage.setItem('refreshToken', response.refreshToken);
localStorage.setItem('user', JSON.stringify(response.user));
}
return response;
},
/**
* Register new user
*/
async register(data: RegisterRequest): Promise<AuthResponse> {
const response = await apiClient.post<AuthResponse>('/api/v1/auth/register', data);
// Store tokens in localStorage
if (typeof window !== 'undefined') {
localStorage.setItem('accessToken', response.accessToken);
localStorage.setItem('refreshToken', response.refreshToken);
localStorage.setItem('user', JSON.stringify(response.user));
}
return response;
},
/**
* Logout
*/
async logout(): Promise<void> {
try {
await apiClient.post('/api/v1/auth/logout');
} finally {
// Clear tokens from localStorage
if (typeof window !== 'undefined') {
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
localStorage.removeItem('user');
}
}
},
/**
* Get current user
*/
async me(): Promise<User> {
return apiClient.get<User>('/api/v1/auth/me');
},
/**
* Refresh access token
*/
async refresh(refreshToken: string): Promise<{ accessToken: string }> {
return apiClient.post<{ accessToken: string }>('/api/v1/auth/refresh', {
refreshToken,
});
},
/**
* Request password reset
*/
async forgotPassword(email: string): Promise<void> {
return apiClient.post('/api/v1/auth/forgot-password', { email });
},
/**
* Reset password with token
*/
async resetPassword(token: string, password: string): Promise<void> {
return apiClient.post('/api/v1/auth/reset-password', { token, password });
},
/**
* Verify email with token
*/
async verifyEmail(token: string): Promise<void> {
return apiClient.get(`/api/v1/auth/verify-email?token=${token}`);
},
/**
* Check if user is authenticated
*/
isAuthenticated(): boolean {
if (typeof window === 'undefined') return false;
const token = localStorage.getItem('accessToken');
return !!token;
},
/**
* Get stored user from localStorage
*/
getStoredUser(): User | null {
if (typeof window === 'undefined') return null;
const userStr = localStorage.getItem('user');
return userStr ? JSON.parse(userStr) : null;
},
};