/** * API модуль для студентов */ import apiClient from '@/lib/api-client'; export interface Student { id: string | number; user: { id: string; email: string; first_name: string; last_name: string; avatar?: string; avatar_url?: string | null; }; grade?: string; school?: string; learning_goals?: string; total_lessons?: number; completed_lessons?: number; scheduled_lessons?: number; enrollment_date?: string; } export interface PaginatedResponse { count: number; next: string | null; previous: string | null; results: T[]; } /** * Получить список студентов (клиентов) * Использует эндпоинт для менторов: /api/manage/clients/ */ export async function getStudents(params?: { page?: number; page_size?: number; search?: string; }): Promise> { const response = await apiClient.get>('/manage/clients/', { params, }); return response.data; } /** * Получить студента по ID */ export async function getStudentById(id: number): Promise { const response = await apiClient.get(`/users/clients/${id}/`); return response.data; } /** * Создать студента */ export async function createStudent(data: { email: string; first_name?: string; last_name?: string; phone?: string; }): Promise { const response = await apiClient.post('/users/clients/', data); return response.data; } /** * Обновить студента */ export async function updateStudent(id: number, data: Partial): Promise { const response = await apiClient.patch(`/users/clients/${id}/`, data); return response.data; } /** * Удалить студента */ export async function deleteStudent(id: number): Promise { await apiClient.delete(`/users/clients/${id}/`); } /** * Проверить пользователя по email (для ментора): зарегистрирован ли, является ли клиентом. */ export async function checkUserByEmail(email: string): Promise<{ exists: boolean; is_client: boolean }> { const response = await apiClient.get<{ exists: boolean; is_client: boolean }>( '/manage/clients/check-user/', { params: { email: email.trim().toLowerCase() } } ); return response.data; } /** * Отправить приглашение студенту (по email или 8-символьному коду). */ export async function addStudentInvitation(payload: { email?: string; universal_code?: string; }): Promise<{ status: string; message: string; invitation_id?: number }> { const response = await apiClient.post<{ status: string; message: string; invitation_id?: number }>( '/manage/clients/add_client/', payload ); return response.data; } /** Запрос на менторство (студент → ментор) / связь ментор—студент */ export interface MentorshipRequestItem { id: number; status: 'pending_mentor' | 'pending_student' | 'pending_parent' | 'accepted' | 'rejected' | 'pending'; created_at: string | null; student: { id: number | null; user_id: number; email: string; first_name: string; last_name: string; avatar?: string | null; }; } /** * Получить ожидающие запросы на менторство (для ментора). */ export async function getMentorshipRequestsPending(): Promise { const response = await apiClient.get( '/mentorship-requests/pending/' ); return response.data; } /** * Принять запрос на менторство. */ export async function acceptMentorshipRequest(id: number): Promise<{ status: string; message: string }> { const response = await apiClient.post<{ status: string; message: string }>( `/mentorship-requests/${id}/accept/` ); return response.data; } /** * Отклонить запрос на менторство. */ export async function rejectMentorshipRequest(id: number): Promise<{ status: string; message: string }> { const response = await apiClient.post<{ status: string; message: string }>( `/mentorship-requests/${id}/reject/` ); return response.data; } /** * Отправить запрос на менторство (студент → ментор по коду). */ export async function sendMentorshipRequest(mentorCode: string): Promise<{ id: number; status: string; mentor: { id: number; first_name: string; last_name: string; email: string }; message: string; }> { const response = await apiClient.post( '/mentorship-requests/send/', { mentor_code: mentorCode.trim().toUpperCase() } ); return response.data; } /** * Получить список своих отправленных запросов (для студента). */ export async function getMyMentorshipRequests(): Promise> { const response = await apiClient.get('/mentorship-requests/my-requests/'); return response.data; } /** Ментор из client.mentors (подключённый) */ export interface MyMentor { id: number; email: string; first_name: string; last_name: string; avatar_url?: string | null; } /** * Получить список подключённых менторов студента (включая из приглашений). */ export async function getMyMentors(): Promise { const response = await apiClient.get('/mentorship-requests/my-mentors/'); return response.data; } /** Входящее приглашение от ментора (MentorClientInvitation) */ export interface MentorInvitation { id: number; mentor: { id: number; email: string; first_name: string; last_name: string }; student: { id: number; email: string } | null; status: string; created_at: string | null; student_confirmed_at: string | null; } /** * Получить входящие приглашения от менторов (для студента). */ export async function getMyInvitations(): Promise { const response = await apiClient.get('/invitation/my-invitations/'); return response.data; } /** * Подтвердить приглашение от ментора (студент принимает). */ export async function confirmInvitationAsStudent(invitationId: number): Promise<{ status: string; requires_parent?: boolean }> { const response = await apiClient.post<{ status: string; requires_parent?: boolean }>( '/invitation/confirm-as-student/', { invitation_id: invitationId } ); return response.data; } /** * Отклонить приглашение от ментора (студент отклоняет). */ export async function rejectInvitationAsStudent(invitationId: number): Promise<{ status: string }> { const response = await apiClient.post<{ status: string }>( '/invitation/reject-as-student/', { invitation_id: invitationId } ); return response.data; } /** * Сгенерировать или обновить ссылку-приглашение */ export async function generateInvitationLink(): Promise<{ invitation_link_token: string; invitation_link: string; }> { const response = await apiClient.post<{ invitation_link_token: string; invitation_link: string; }>('/manage/clients/generate-invitation-link/'); return response.data; } /** * Получить информацию о менторе по токену */ export async function getMentorInfoByToken(token: string): Promise<{ mentor_name: string; mentor_id: string; avatar_url: string | null; }> { const response = await apiClient.get(`/invitation/info-by-token/?token=${token}`); return response.data; } /** * Регистрация по ссылке */ export async function registerByLink(data: { token: string; first_name: string; last_name: string; email?: string; timezone?: string; city?: string; }): Promise { const response = await apiClient.post('/invitation/register-by-link/', data); return response.data; }