213 lines
5.6 KiB
TypeScript
213 lines
5.6 KiB
TypeScript
const API_BASE_URL = process.env.REACT_APP_API_URL || 'http://localhost:5000/api';
|
|
|
|
export interface LoginRequest {
|
|
email: string;
|
|
password: string;
|
|
twoFactorCode?: string;
|
|
}
|
|
|
|
export interface RegisterRequest {
|
|
email: string;
|
|
password: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
phone?: string;
|
|
company?: string;
|
|
role?: 'channel_partner_admin' | 'channel_partner_manager' | 'channel_partner_sales' | 'channel_partner_support' | 'channel_partner_finance' | 'channel_partner_analyst' | 'reseller_admin' | 'reseller_manager' | 'reseller_sales' | 'reseller_support' | 'reseller_finance' | 'reseller_analyst' | 'system_admin' | 'system_support' | 'system_analyst' | 'read_only';
|
|
userType?: 'channel_partner' | 'reseller' | 'system';
|
|
}
|
|
|
|
export interface AuthResponse {
|
|
success: boolean;
|
|
message: string;
|
|
data?: {
|
|
user: {
|
|
id: number;
|
|
email: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
phone?: string;
|
|
company?: string;
|
|
role: string;
|
|
status: string;
|
|
emailVerified: boolean;
|
|
twoFactorEnabled: boolean;
|
|
lastLogin?: string;
|
|
roles: Array<{
|
|
id: number;
|
|
name: string;
|
|
description: string;
|
|
permissions: string[];
|
|
}>;
|
|
};
|
|
accessToken: string;
|
|
refreshToken: string;
|
|
sessionId: string;
|
|
};
|
|
}
|
|
|
|
export interface User {
|
|
id: number;
|
|
email: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
phone?: string;
|
|
company?: string;
|
|
role: string;
|
|
status: string;
|
|
emailVerified: boolean;
|
|
twoFactorEnabled: boolean;
|
|
lastLogin?: string;
|
|
roles: Array<{
|
|
id: number;
|
|
name: string;
|
|
description: string;
|
|
permissions: string[];
|
|
}>;
|
|
}
|
|
|
|
class ApiService {
|
|
private baseURL: string;
|
|
|
|
constructor() {
|
|
this.baseURL = API_BASE_URL;
|
|
}
|
|
|
|
private async request<T>(
|
|
endpoint: string,
|
|
options: RequestInit = {}
|
|
): Promise<T> {
|
|
const url = `${this.baseURL}${endpoint}`;
|
|
|
|
const config: RequestInit = {
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
...options.headers,
|
|
},
|
|
...options,
|
|
};
|
|
|
|
// Add auth token if available
|
|
const token = localStorage.getItem('accessToken');
|
|
if (token) {
|
|
config.headers = {
|
|
...config.headers,
|
|
Authorization: `Bearer ${token}`,
|
|
};
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(url, config);
|
|
const data = await response.json();
|
|
|
|
if (!response.ok) {
|
|
throw new Error(data.message || 'API request failed');
|
|
}
|
|
|
|
return data;
|
|
} catch (error) {
|
|
console.error('API request failed:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Authentication endpoints
|
|
async login(credentials: LoginRequest): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/login', {
|
|
method: 'POST',
|
|
body: JSON.stringify(credentials),
|
|
});
|
|
}
|
|
|
|
async register(userData: RegisterRequest): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify(userData),
|
|
});
|
|
}
|
|
|
|
async verifyEmail(email: string, otp: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/verify-email', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ email, otp }),
|
|
});
|
|
}
|
|
|
|
async resendVerificationEmail(email: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/resend-verification', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ email }),
|
|
});
|
|
}
|
|
|
|
async refreshToken(refreshToken: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/refresh-token', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ refreshToken }),
|
|
});
|
|
}
|
|
|
|
async getCurrentUser(): Promise<{ success: boolean; data: User }> {
|
|
return this.request<{ success: boolean; data: User }>('/auth/me');
|
|
}
|
|
|
|
async logout(sessionId: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/logout', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ sessionId }),
|
|
});
|
|
}
|
|
|
|
async forgotPassword(email: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/forgot-password', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ email }),
|
|
});
|
|
}
|
|
|
|
async resetPassword(token: string, password: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/reset-password', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ token, password }),
|
|
});
|
|
}
|
|
|
|
// Two-factor authentication
|
|
async setupTwoFactor(): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/setup-2fa', {
|
|
method: 'POST',
|
|
});
|
|
}
|
|
|
|
async enableTwoFactor(code: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/enable-2fa', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ code }),
|
|
});
|
|
}
|
|
|
|
async disableTwoFactor(code: string): Promise<AuthResponse> {
|
|
return this.request<AuthResponse>('/auth/disable-2fa', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ code }),
|
|
});
|
|
}
|
|
|
|
// Profile management
|
|
async updateProfile(profileData: Partial<User>): Promise<{ success: boolean; data: User }> {
|
|
return this.request<{ success: boolean; data: User }>('/auth/profile', {
|
|
method: 'PUT',
|
|
body: JSON.stringify(profileData),
|
|
});
|
|
}
|
|
|
|
async changePassword(currentPassword: string, newPassword: string): Promise<{ success: boolean; message: string }> {
|
|
return this.request<{ success: boolean; message: string }>('/auth/change-password', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ currentPassword, newPassword }),
|
|
});
|
|
}
|
|
}
|
|
|
|
export const apiService = new ApiService();
|
|
export default apiService;
|