/
ingvion
/
PlanerService
Обзор
Документация
Войти
/
ingvion
/
PlanerService
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Frontend/src/services/StudentService.js
109 строк
3 KB
lenadekart
Доработка roadmap
23 ноя 2025, 08:24
23 ноя 2025, 08:24
8359cca
Код
Авторство
О чём код?
class StudentService { constructor(baseUrl = '/api/v1') { this.baseUrl = baseUrl; this.token = localStorage.getItem('student_token'); } setToken(token) { this.token = token; localStorage.setItem('student_token', token); } getToken() { return this.token || localStorage.getItem('student_token'); } logout() { this.token = null; localStorage.removeItem('student_token'); } async request(endpoint, options = {}) { const url = `${this.baseUrl}${endpoint}`; const headers = { 'Content-Type': 'application/json', ...options.headers, }; if (this.token) { headers['Authorization'] = `Bearer ${this.token}`; } const response = await fetch(url, { ...options, headers }); if (!response.ok) { // Пытаемся получить детали ошибки из тела ответа let errorMessage = `HTTP error! status: ${response.status}`; try { const errorData = await response.json(); if (errorData.detail) { errorMessage = errorData.detail; } } catch (e) { // Если не удалось прочитать JSON, используем стандартное сообщение } const error = new Error(errorMessage); error.status = response.status; throw error; } const data = await response.json(); return data; } // Student routes async getProfile() { return this.request('/student/profile'); } async getSpecializations(studentId) { return this.request(`/students/${studentId}/specializations`); } async setSpecialization(studentId, specializationId) { return this.request(`/students/${studentId}/specialization`, { method: 'POST', body: JSON.stringify({ specialization_id: specializationId }) }); } async getRecommendations(studentId) { return this.request(`/students/${studentId}/recommendations`); } async getCourses(directionId) { return this.request(`/admin/directions/${directionId}/courses`); } async addCourseToPlan(courseId) { return this.request(`/student/courses/${courseId}/add`, { method: 'POST' }); } async getRoadmap(retries = 2, retryDelay = 3000) { try { return await this.request('/student/roadmap'); } catch (error) { // Если это rate limiting (429, 503) и остались попытки if ((error.status === 429 || error.status === 503) && retries > 0) { console.log(`Roadmap: Rate limit, retrying in ${retryDelay}ms... (${retries} retries left)`); await new Promise(resolve => setTimeout(resolve, retryDelay)); // Увеличиваем задержку для следующей попытки return this.getRoadmap(retries - 1, retryDelay + 2000); } throw error; } } async getAllDirections() { return this.request('/directions'); } async getAllCourses() { return this.request('/courses'); } } export default new StudentService();