import { apiClient } from '../client' export interface ExtractionInfo { id: number url: string status: 'pending' | 'processing' | 'completed' | 'failed' title?: string service?: string service_id?: string sound_id?: number user_id: number user_name?: string error?: string created_at: string updated_at: string } export interface CreateExtractionResponse { message: string extraction: ExtractionInfo } export interface GetExtractionsResponse { extractions: ExtractionInfo[] total: number page: number limit: number total_pages: number } export type ExtractionSortField = 'title' | 'status' | 'service' | 'created_at' | 'updated_at' export type ExtractionSortOrder = 'asc' | 'desc' export type ExtractionStatus = 'pending' | 'processing' | 'completed' | 'failed' export interface GetExtractionsParams { search?: string sort_by?: ExtractionSortField sort_order?: ExtractionSortOrder status_filter?: ExtractionStatus page?: number limit?: number } export interface DeleteExtractionResponse { message: string } export class ExtractionsService { /** * Create a new extraction job */ async createExtraction(url: string): Promise { const response = await apiClient.post( `/api/v1/extractions/?url=${encodeURIComponent(url)}`, ) return response } /** * Get extraction by ID */ async getExtraction(extractionId: number): Promise { const response = await apiClient.get( `/api/v1/extractions/${extractionId}`, ) return response } /** * Get all extractions */ async getAllExtractions(params?: GetExtractionsParams): Promise { const searchParams = new URLSearchParams() if (params?.search) { searchParams.append('search', params.search) } if (params?.sort_by) { searchParams.append('sort_by', params.sort_by) } if (params?.sort_order) { searchParams.append('sort_order', params.sort_order) } if (params?.status_filter) { searchParams.append('status_filter', params.status_filter) } if (params?.page) { searchParams.append('page', params.page.toString()) } if (params?.limit) { searchParams.append('limit', params.limit.toString()) } const queryString = searchParams.toString() const url = queryString ? `/api/v1/extractions/?${queryString}` : '/api/v1/extractions/' const response = await apiClient.get(url) return response } /** * Get user's extractions */ async getUserExtractions(params?: GetExtractionsParams): Promise { const searchParams = new URLSearchParams() if (params?.search) { searchParams.append('search', params.search) } if (params?.sort_by) { searchParams.append('sort_by', params.sort_by) } if (params?.sort_order) { searchParams.append('sort_order', params.sort_order) } if (params?.status_filter) { searchParams.append('status_filter', params.status_filter) } if (params?.page) { searchParams.append('page', params.page.toString()) } if (params?.limit) { searchParams.append('limit', params.limit.toString()) } const queryString = searchParams.toString() const url = queryString ? `/api/v1/extractions/user?${queryString}` : '/api/v1/extractions/user' const response = await apiClient.get(url) return response } /** * Get currently processing extractions */ async getProcessingExtractions(): Promise { const response = await apiClient.get( '/api/v1/extractions/processing/current' ) return response } /** * Delete an extraction */ async deleteExtraction(extractionId: number): Promise { const response = await apiClient.delete( `/api/v1/extractions/${extractionId}` ) return response } } export const extractionsService = new ExtractionsService()