150 lines
3.4 KiB
TypeScript
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;
|
|
},
|
|
};
|