import type { ApiResponse, VideoSourcesResponse, VideosRequest, VideosResponse, VideoResponse, ResetVideoResponse, ResetAllVideosResponse, ApiError } from './types'; // API 基础配置 const API_BASE_URL = '/api'; // HTTP 客户端类 class ApiClient { private baseURL: string; private defaultHeaders: Record; constructor(baseURL: string = API_BASE_URL) { this.baseURL = baseURL; this.defaultHeaders = { 'Content-Type': 'application/json' }; const token = localStorage.getItem('authToken'); if (token) { this.defaultHeaders['Authorization'] = token; } } // 设置认证 token setAuthToken(token?: string) { if (token) { this.defaultHeaders['Authorization'] = token; localStorage.setItem('authToken', token); } else { delete this.defaultHeaders['Authorization']; localStorage.removeItem('authToken'); } } // 通用请求方法 private async request(endpoint: string, options: RequestInit = {}): Promise> { const url = `${this.baseURL}${endpoint}`; const config: RequestInit = { headers: { ...this.defaultHeaders, ...options.headers }, ...options }; try { const response = await fetch(url, config); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data: ApiResponse = await response.json(); return data; } catch (error) { const apiError: ApiError = { message: error instanceof Error ? error.message : 'Unknown error occurred', status: error instanceof TypeError ? undefined : (error as { status?: number }).status }; throw apiError; } } // GET 请求 private async get( endpoint: string, params?: VideosRequest | Record ): Promise> { let queryString = ''; if (params) { const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== null) { searchParams.append(key, String(value)); } }); queryString = searchParams.toString(); } const finalEndpoint = queryString ? `${endpoint}?${queryString}` : endpoint; return this.request(finalEndpoint, { method: 'GET' }); } // POST 请求 private async post(endpoint: string, data?: unknown): Promise> { return this.request(endpoint, { method: 'POST', body: data ? JSON.stringify(data) : undefined }); } // PUT 请求 private async put(endpoint: string, data?: unknown): Promise> { return this.request(endpoint, { method: 'PUT', body: data ? JSON.stringify(data) : undefined }); } // DELETE 请求 private async delete(endpoint: string): Promise> { return this.request(endpoint, { method: 'DELETE' }); } // API 方法 /** * 获取所有视频来源 */ async getVideoSources(): Promise> { return this.get('/video-sources'); } /** * 获取视频列表 * @param params 查询参数 */ async getVideos(params?: VideosRequest): Promise> { return this.get('/videos', params); } /** * 获取单个视频详情 * @param id 视频 ID */ async getVideo(id: number): Promise> { return this.get(`/videos/${id}`); } /** * 重置视频下载状态 * @param id 视频 ID */ async resetVideo(id: number): Promise> { return this.post(`/videos/${id}/reset`); } /** * 重置所有视频下载状态 */ async resetAllVideos(): Promise> { return this.post('/videos/reset-all'); } } // 创建默认的 API 客户端实例 export const apiClient = new ApiClient(); // 导出 API 方法的便捷函数 export const api = { /** * 获取所有视频来源 */ getVideoSources: () => apiClient.getVideoSources(), /** * 获取视频列表 */ getVideos: (params?: VideosRequest) => apiClient.getVideos(params), /** * 获取单个视频详情 */ getVideo: (id: number) => apiClient.getVideo(id), /** * 重置视频下载状态 */ resetVideo: (id: number) => apiClient.resetVideo(id), /** * 重置所有视频下载状态 */ resetAllVideos: () => apiClient.resetAllVideos(), /** * 设置认证 token */ setAuthToken: (token: string) => apiClient.setAuthToken(token) }; // 默认导出 export default api;