import type { AxiosResponse } from 'axios' import apiClient from './client' import { SourceListResponse, SourceDetailResponse, SourceResponse, SourceStatusResponse, CreateSourceRequest, UpdateSourceRequest } from '@/lib/types/api' export const sourcesApi = { list: async (params?: { notebook_id?: string limit?: number offset?: number sort_by?: 'created' | 'updated' sort_order?: 'asc' | 'desc' }) => { const response = await apiClient.get('/sources', { params }) return response.data }, get: async (id: string) => { const response = await apiClient.get(`/sources/${id}`) return response.data }, create: async (data: CreateSourceRequest & { file?: File }) => { // Always use FormData to match backend expectations const formData = new FormData() // Add basic fields formData.append('type', data.type) if (data.notebooks !== undefined) { formData.append('notebooks', JSON.stringify(data.notebooks)) } if (data.notebook_id) { formData.append('notebook_id', data.notebook_id) } if (data.title) { formData.append('title', data.title) } if (data.url) { formData.append('url', data.url) } if (data.content) { formData.append('content', data.content) } if (data.transformations !== undefined) { formData.append('transformations', JSON.stringify(data.transformations)) } const dataWithFile = data as CreateSourceRequest & { file?: File } if (dataWithFile.file instanceof File) { formData.append('file', dataWithFile.file) } formData.append('embed', String(data.embed ?? false)) formData.append('delete_source', String(data.delete_source ?? false)) formData.append('async_processing', String(data.async_processing ?? false)) const response = await apiClient.post('/sources', formData) return response.data }, update: async (id: string, data: UpdateSourceRequest) => { const response = await apiClient.put(`/sources/${id}`, data) return response.data }, delete: async (id: string) => { await apiClient.delete(`/sources/${id}`) }, status: async (id: string) => { const response = await apiClient.get(`/sources/${id}/status`) return response.data }, upload: async (file: File, notebook_id: string) => { const formData = new FormData() formData.append('file', file) formData.append('notebook_id', notebook_id) formData.append('type', 'upload') formData.append('async_processing', 'true') const response = await apiClient.post('/sources', formData, { headers: { 'Content-Type': 'multipart/form-data', }, }) return response.data }, retry: async (id: string) => { const response = await apiClient.post(`/sources/${id}/retry`) return response.data }, downloadFile: async (id: string): Promise> => { return apiClient.get(`/sources/${id}/download`, { responseType: 'blob', }) }, }