import api from './api'; import { User } from './users'; // Типы данных для аутентификации export interface LoginCredentials { username: string; password: string; } export interface TokenResponse { access_token: string; token_type: string; } export interface RegisterData { email: string; password: string; password_confirm: string; first_name?: string; last_name?: string; phone?: string; is_active?: boolean; is_admin?: boolean; } export interface PasswordReset { email: string; } export interface PasswordChange { current_password: string; new_password: string; } // Константа для ключа токена в localStorage const TOKEN_KEY = 'token'; // Сервис для аутентификации const authService = { // Вход в систему login: async (credentials: LoginCredentials): Promise => { // Создаем FormData для отправки данных в формате x-www-form-urlencoded const formData = new URLSearchParams(); formData.append('username', credentials.username); formData.append('password', credentials.password); const response = await api.post('/auth/login', formData.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); // Сохраняем токен в localStorage if (response.access_token) { try { localStorage.setItem(TOKEN_KEY, String(response.access_token)); console.log('Токен сохранен в localStorage (auth.ts):', String(response.access_token).substring(0, 20) + '...'); // Проверяем, что токен действительно сохранился const savedToken = localStorage.getItem(TOKEN_KEY); console.log('Проверка сохранения токена (auth.ts):', savedToken ? 'токен сохранен' : 'токен НЕ сохранен'); // Удаляем устаревший ключ auth_token, если он есть if (localStorage.getItem('auth_token')) { localStorage.removeItem('auth_token'); } } catch (storageError) { console.error('Ошибка при сохранении токена в localStorage (auth.ts):', storageError); } } return response; }, // Регистрация нового пользователя register: async (data: RegisterData): Promise => { const response = await api.post('/auth/register', data); return response; }, // Выход из системы logout: (): void => { try { localStorage.removeItem(TOKEN_KEY); // Удаляем устаревший ключ, если он есть if (localStorage.getItem('auth_token')) { localStorage.removeItem('auth_token'); } console.log('Токен удален из localStorage (auth.ts)'); } catch (error) { console.error('Ошибка при удалении токена (auth.ts):', error); } }, // Проверка, авторизован ли пользователь isAuthenticated: (): boolean => { try { const token = localStorage.getItem(TOKEN_KEY); return !!token; } catch (error) { console.error('Ошибка при проверке токена (auth.ts):', error); return false; } }, // Получить текущий токен getToken: (): string | null => { try { return localStorage.getItem(TOKEN_KEY); } catch (error) { console.error('Ошибка при получении токена (auth.ts):', error); return null; } }, // Запрос на сброс пароля resetPassword: async (email: string): Promise => { return await api.post('/auth/reset-password', { email }); }, // Установка нового пароля после сброса setNewPassword: async (token: string, password: string): Promise => { return await api.post('/auth/set-new-password', {}, { params: { token, password } }); }, // Изменение пароля авторизованным пользователем changePassword: async (currentPassword: string, newPassword: string): Promise => { return await api.post('/auth/change-password', { current_password: currentPassword, new_password: newPassword }); }, // Получение профиля текущего пользователя getProfile: async (): Promise => { try { const response = await api.get('/users/me'); return response; } catch (error) { console.error('Ошибка при получении профиля:', error); return null; } } }; export default authService;