baveshraam's picture
FIX: SurrealDB 2.0 migration syntax and Frontend/CORS link
f871fed
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<SourceListResponse[]>('/sources', { params })
return response.data
},
get: async (id: string) => {
const response = await apiClient.get<SourceDetailResponse>(`/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<SourceResponse>('/sources', formData)
return response.data
},
update: async (id: string, data: UpdateSourceRequest) => {
const response = await apiClient.put<SourceListResponse>(`/sources/${id}`, data)
return response.data
},
delete: async (id: string) => {
await apiClient.delete(`/sources/${id}`)
},
status: async (id: string) => {
const response = await apiClient.get<SourceStatusResponse>(`/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<SourceResponse>('/sources', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
})
return response.data
},
retry: async (id: string) => {
const response = await apiClient.post<SourceResponse>(`/sources/${id}/retry`)
return response.data
},
downloadFile: async (id: string): Promise<AxiosResponse<Blob>> => {
return apiClient.get(`/sources/${id}/download`, {
responseType: 'blob',
})
},
}