| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import axios from 'axios'; |
| import AsyncStorage from '@react-native-async-storage/async-storage'; |
| import { NEW_AUTH_BASE_URL } from './config'; |
|
|
| |
| const authAPI = axios.create({ |
| baseURL: NEW_AUTH_BASE_URL, |
| withCredentials: true, |
| headers: { |
| 'Content-Type': 'application/json', |
| }, |
| }); |
|
|
| |
| authAPI.interceptors.request.use( |
| async (config) => { |
| const token = await AsyncStorage.getItem('authToken'); |
| if (token) { |
| config.headers.Authorization = `Bearer ${token}`; |
| } |
| return config; |
| }, |
| (error) => Promise.reject(error) |
| ); |
|
|
| class NewAuthService { |
| |
| async signupTrainee(username, email, password, traineeCategory = 'other') { |
| try { |
| const response = await authAPI.post('/users/signup/trainee', { |
| username, |
| email, |
| password, |
| traineeCategory, |
| }); |
| return { success: true, data: response.data }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Trainee signup failed', |
| }; |
| } |
| } |
|
|
| |
| async signupTrainer(username, email, password, organizationId, workDesignation, govtIdCard = null) { |
| try { |
| const response = await authAPI.post('/users/signup/trainer', { |
| username, |
| email, |
| password, |
| organization: organizationId, |
| workDesignation, |
| govtIdCard, |
| }); |
| return { success: true, data: response.data }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Trainer signup failed', |
| }; |
| } |
| } |
|
|
| |
| async signupOrganization(username, email, password, organizationType) { |
| try { |
| const response = await authAPI.post('/users/signup/organization', { |
| username, |
| email, |
| password, |
| organizationType, |
| }); |
| return { success: true, data: response.data }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Organization signup failed', |
| }; |
| } |
| } |
|
|
| |
| async login(email, password, otp = null) { |
| try { |
| const payload = { email, password }; |
| if (otp) { |
| payload.otp = otp; |
| } |
|
|
| const response = await authAPI.post('/users/login', payload); |
|
|
| |
| const { token, user, requires2FASetup, requiresDocumentUpload } = response.data; |
|
|
| |
| await AsyncStorage.removeItem('accessToken'); |
|
|
| await AsyncStorage.setItem('authToken', token); |
| await AsyncStorage.setItem('user', JSON.stringify(user)); |
|
|
| return { |
| success: true, |
| token, |
| user, |
| requires2FASetup, |
| requiresDocumentUpload, |
| }; |
| } catch (error) { |
| |
| if (error.response && error.response.status === 403 && error.response.data.code === '2fa_required') { |
| return { |
| success: true, |
| requires2FA: true, |
| message: error.response.data.message |
| }; |
| } |
|
|
| return { |
| success: false, |
| message: error.response?.data?.message || 'Login failed', |
| }; |
| } |
| } |
|
|
| |
| async loginWithGoogle(code, role = 'trainee') { |
| try { |
| const response = await authAPI.get(`/users/auth/google?code=${code}&state=${role}`); |
|
|
| const { token, user, requires2FASetup, requiresDocumentUpload } = response.data; |
|
|
| |
| await AsyncStorage.removeItem('accessToken'); |
|
|
| await AsyncStorage.setItem('authToken', token); |
| await AsyncStorage.setItem('user', JSON.stringify(user)); |
|
|
| return { |
| success: true, |
| token, |
| user, |
| requires2FASetup, |
| requiresDocumentUpload, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Google OAuth failed', |
| }; |
| } |
| } |
|
|
| |
| async setup2FA() { |
| try { |
| const response = await authAPI.post('/users/auth/2fa/setup'); |
| return { |
| success: true, |
| secret: response.data.secret, |
| qrCode: response.data.qrCode || response.data.qr, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || '2FA setup failed', |
| }; |
| } |
| } |
|
|
| |
| async verify2FA(token) { |
| try { |
| const response = await authAPI.post('/users/auth/2fa/verify', { token }); |
| return { |
| success: true, |
| message: response.data.message, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Invalid OTP', |
| }; |
| } |
| } |
|
|
| |
| async getCurrentUser() { |
| try { |
| const response = await authAPI.get('/users/me'); |
| await AsyncStorage.setItem('user', JSON.stringify(response.data)); |
| return { |
| success: true, |
| user: response.data, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Failed to fetch user', |
| }; |
| } |
| } |
|
|
| |
| async getAllOrganizations() { |
| try { |
| const response = await authAPI.get('/users/organizations'); |
| return { |
| success: true, |
| organizations: response.data.organizations, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Failed to fetch organizations', |
| }; |
| } |
| } |
|
|
| |
| async uploadOrganizationDocuments(formData) { |
| try { |
| const response = await authAPI.post('/users/upload-documents', formData, { |
| headers: { |
| 'Content-Type': 'multipart/form-data', |
| }, |
| }); |
| return { |
| success: true, |
| data: response.data, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Document upload failed', |
| }; |
| } |
| } |
|
|
| |
| async getPendingTrainers() { |
| try { |
| const response = await authAPI.get('/users/pending-trainers'); |
| return { |
| success: true, |
| trainers: response.data.trainers, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Failed to fetch pending trainers', |
| }; |
| } |
| } |
|
|
| |
| async verifyTrainer(trainerId, status, rejectionReason = null) { |
| try { |
| const response = await authAPI.put('/users/verify-trainer', { |
| trainerId, |
| status, |
| rejectionReason, |
| }); |
| return { |
| success: true, |
| data: response.data, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Trainer verification failed', |
| }; |
| } |
| } |
|
|
| |
| async requestPasswordReset(email) { |
| try { |
| const response = await authAPI.post('/users/request-password-reset', { email }); |
| return { |
| success: true, |
| message: response.data.message, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Password reset request failed', |
| }; |
| } |
| } |
|
|
| async resetPassword(token, password) { |
| try { |
| const response = await authAPI.post(`/users/reset-password/${token}`, { password }); |
| return { |
| success: true, |
| message: response.data.message, |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: error.response?.data?.message || 'Password reset failed', |
| }; |
| } |
| } |
|
|
| |
| async logout() { |
| try { |
| await AsyncStorage.removeItem('authToken'); |
| await AsyncStorage.removeItem('user'); |
| return { success: true }; |
| } catch (error) { |
| return { success: false, message: 'Logout failed' }; |
| } |
| } |
|
|
| |
| async getVerificationStatus() { |
| try { |
| const user = await this.getCurrentUser(); |
| if (!user.success) return { verified: false }; |
|
|
| const userData = user.user; |
|
|
| |
| if (userData.role === 'trainee') { |
| return { |
| verified: true, |
| needs2FA: !userData.isTwoFactorEnabled |
| }; |
| } |
|
|
| |
| if (userData.role === 'trainer') { |
| return { |
| verified: userData.organizationVerificationStatus === 'verified', |
| status: userData.organizationVerificationStatus, |
| needs2FA: !userData.isTwoFactorEnabled, |
| needsDocuments: !userData.documentsUploaded, |
| }; |
| } |
|
|
| |
| if (userData.role === 'organization') { |
| return { |
| verified: userData.verificationStatus === 'approved', |
| status: userData.verificationStatus, |
| needs2FA: !userData.isTwoFactorEnabled, |
| needsDocuments: !userData.documentsUploaded, |
| }; |
| } |
|
|
| return { verified: false }; |
| } catch (error) { |
| return { verified: false, error: error.message }; |
| } |
| } |
| } |
|
|
| export default new NewAuthService(); |
|
|