uchill/front_material/api/students.ts

281 lines
8.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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<T> {
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<PaginatedResponse<Student>> {
const response = await apiClient.get<PaginatedResponse<Student>>('/manage/clients/', {
params,
});
return response.data;
}
/**
* Получить студента по ID
*/
export async function getStudentById(id: number): Promise<Student> {
const response = await apiClient.get<Student>(`/users/clients/${id}/`);
return response.data;
}
/**
* Создать студента
*/
export async function createStudent(data: {
email: string;
first_name?: string;
last_name?: string;
phone?: string;
}): Promise<Student> {
const response = await apiClient.post<Student>('/users/clients/', data);
return response.data;
}
/**
* Обновить студента
*/
export async function updateStudent(id: number, data: Partial<Student>): Promise<Student> {
const response = await apiClient.patch<Student>(`/users/clients/${id}/`, data);
return response.data;
}
/**
* Удалить студента
*/
export async function deleteStudent(id: number): Promise<void> {
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<MentorshipRequestItem[]> {
const response = await apiClient.get<MentorshipRequestItem[]>(
'/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<Array<{
id: number;
status: string;
created_at: string | null;
updated_at: string | null;
mentor: { id: number; email: string; first_name: string; last_name: string };
}>> {
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<MyMentor[]> {
const response = await apiClient.get<MyMentor[]>('/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<MentorInvitation[]> {
const response = await apiClient.get<MentorInvitation[]>('/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<any> {
const response = await apiClient.post('/invitation/register-by-link/', data);
return response.data;
}