import apiClient, { apiEndpoints } from './index.js' /** * 通用的获取所有分页数据的函数 * @param {Function} apiCall - API调用函数 * @param {Object} params - 查询参数 * @returns {Promise} 所有页面的数据数组 */ const fetchAllPages = async (apiCall, params = {}) => { let allData = [] let page = 1 let hasNext = true console.log('Starting to fetch all pages for API call...') while (hasNext) { try { const currentParams = { ...params, page, page_size: 100 } // 每页100条,减少请求次数 console.log(`Fetching page ${page} with params:`, currentParams) const response = await apiCall(currentParams) if (response && response.results) { // 分页格式响应 allData = [...allData, ...response.results] hasNext = !!response.next console.log(`Page ${page}: Got ${response.results.length} items, total so far: ${allData.length}, hasNext: ${hasNext}`) } else if (Array.isArray(response)) { // 非分页格式响应(向后兼容) allData = response hasNext = false console.log('Non-paginated response detected, got all data at once:', allData.length, 'items') } else { console.log('Unexpected response format, stopping pagination') hasNext = false } page++ // 安全检查:防止无限循环 if (page > 100) { console.warn('Reached maximum page limit (100), stopping pagination') break } } catch (error) { console.error(`Error fetching page ${page}:`, error) throw error } } console.log(`Finished fetching all pages. Total items: ${allData.length}`) return allData } /** * 单页API调用函数(内部使用) * @param {Object} params - 查询参数(包含分页参数) * @returns {Promise} API响应 */ const getStudentsPage = async (params = {}) => { const response = await apiClient.get(apiEndpoints.STUDENTS.LIST, { params }) return response.data } // Get student list export const getStudents = async () => { try { console.log('Fetching all students with pagination support...') // 使用通用分页函数获取所有数据 const allStudents = await fetchAllPages(getStudentsPage) console.log('Students API final result:', { totalCount: allStudents.length, sampleData: allStudents.slice(0, 3) // 显示前3条数据作为样例 }) return allStudents } catch (error) { console.error('Failed to fetch students:', error) throw new Error(error?.response?.data?.detail || error?.message || 'Failed to fetch students') } } // Update student information export const updateStudent = async (studentId, studentData) => { try { // Convert data format to match API requirements const apiData = { student_name: studentData.student_name || '', enabled: studentData.enabled ? 'Y' : 'N', grade: studentData.grade || '', age: parseInt(studentData.age) || 0, } // If avatar data is included, add avatar-related fields if (studentData.avatar && studentData.avatar_mime_type) { apiData.avatar_base64 = studentData.avatar apiData.avatar_mime_type = studentData.avatar_mime_type apiData.avatar_file_name = studentData.avatar_file_name || '' } console.log('Sending update request:', { studentId, url: apiEndpoints.STUDENTS.UPDATE(studentId), data: { ...apiData, avatar_base64: apiData.avatar_base64 ? '[base64 data]' : undefined } // Don't print full base64 }) const response = await apiClient.patch(apiEndpoints.STUDENTS.UPDATE(studentId), apiData) return response.data } catch (error) { console.error('API error details:', { status: error?.response?.status, statusText: error?.response?.statusText, data: error?.response?.data, headers: error?.response?.headers }) const errorMessage = error?.response?.data?.detail || error?.response?.data?.message || error?.response?.data?.error || `HTTP ${error?.response?.status}: ${error?.response?.statusText}` || error.message || 'Failed to update student' throw new Error(errorMessage) } } // Create student export const createStudent = async (studentData) => { try { // Convert data format to match API requirements const apiData = { student_name: studentData.student_name || '', enabled: studentData.enabled ? 'Y' : 'N', grade: studentData.grade || '', age: parseInt(studentData.age) || 0, } // If avatar data is included, add avatar-related fields if (studentData.avatar && studentData.avatar_mime_type) { apiData.avatar_base64 = studentData.avatar apiData.avatar_mime_type = studentData.avatar_mime_type apiData.avatar_file_name = studentData.avatar_file_name || '' } console.log('Sending create request:', { url: apiEndpoints.STUDENTS.CREATE, data: { ...apiData, avatar_base64: apiData.avatar_base64 ? '[base64 data]' : undefined } }) const response = await apiClient.post(apiEndpoints.STUDENTS.CREATE, apiData) return response.data } catch (error) { console.error('API error details:', { status: error?.response?.status, statusText: error?.response?.statusText, data: error?.response?.data, headers: error?.response?.headers }) const errorMessage = error?.response?.data?.detail || error?.response?.data?.message || error?.response?.data?.error || `HTTP ${error?.response?.status}: ${error?.response?.statusText}` || error.message || 'Failed to create student' throw new Error(errorMessage) } } // Delete student export const deleteStudent = async (studentId) => { try { console.log('Sending delete request:', { studentId, url: apiEndpoints.STUDENTS.DELETE(studentId) }) const response = await apiClient.delete(apiEndpoints.STUDENTS.DELETE(studentId)) return response.data } catch (error) { console.error('API error details:', { status: error?.response?.status, statusText: error?.response?.statusText, data: error?.response?.data, headers: error?.response?.headers }) const errorMessage = error?.response?.data?.detail || error?.response?.data?.message || error?.response?.data?.error || `HTTP ${error?.response?.status}: ${error?.response?.statusText}` || error.message || 'Failed to delete student' throw new Error(errorMessage) } }