Álvaro Valenzuela Valdes
feat: Live Compra Ágil web scraper integration for real-time discovery
7259e84 | import type { AnalysisHistoryItem, AnalysisResult, CompanyProfile, Tender } from "./types"; | |
| const API_BASE = process.env.NEXT_PUBLIC_API_BASE ?? ""; | |
| const jsonHeaders = { | |
| "Content-Type": "application/json", | |
| }; | |
| export async function healthCheck() { | |
| const res = await fetch(`${API_BASE}/api/health`); | |
| if (!res.ok) { | |
| throw new Error("Health check failed"); | |
| } | |
| return res.json(); | |
| } | |
| export async function fetchDbStatus() { | |
| const res = await fetch(`${API_BASE}/api/health/db-status`); | |
| if (!res.ok) return null; | |
| return res.json(); | |
| } | |
| export async function searchTenders(params: { | |
| keyword?: string; | |
| buyer?: string; | |
| provider_code?: string; | |
| date?: string; | |
| skip?: number; | |
| limit?: number; | |
| }): Promise<Tender[]> { | |
| const query = new URLSearchParams(); | |
| if (params.keyword) query.append("keyword", params.keyword); | |
| if (params.buyer) query.append("buyer", params.buyer); | |
| if (params.provider_code) query.append("provider_code", params.provider_code); | |
| if (params.date) query.append("date", params.date); | |
| if (params.skip !== undefined) query.append("skip", params.skip.toString()); | |
| if (params.limit !== undefined) query.append("limit", params.limit.toString()); | |
| const res = await fetch(`${API_BASE}/api/tenders?${query.toString()}`); | |
| if (!res.ok) { | |
| throw new Error("Error searching tenders"); | |
| } | |
| return res.json(); | |
| } | |
| export async function analyzeTender( | |
| tender: Tender, | |
| companyProfile: CompanyProfile, | |
| documentText?: string, | |
| models?: Record<string, string> | |
| ): Promise<AnalysisResult> { | |
| const res = await fetch(`${API_BASE}/api/analyze`, { | |
| method: "POST", | |
| headers: jsonHeaders, | |
| body: JSON.stringify({ | |
| tender, | |
| company_profile: companyProfile, | |
| document_text: documentText, | |
| models: models | |
| }), | |
| }); | |
| if (!res.ok) { | |
| throw new Error("Error analyzing tender"); | |
| } | |
| return res.json(); | |
| } | |
| export async function uploadDocument(file: File): Promise<{ text: string; filename: string }> { | |
| const formData = new FormData(); | |
| formData.append("file", file); | |
| const res = await fetch(`${API_BASE}/api/upload-document`, { | |
| method: "POST", | |
| body: formData, | |
| }); | |
| if (!res.ok) { | |
| throw new Error("Error uploading document"); | |
| } | |
| return res.json(); | |
| } | |
| export async function saveCompanyProfile(profile: CompanyProfile): Promise<CompanyProfile> { | |
| const res = await fetch(`${API_BASE}/api/company-profile`, { | |
| method: "POST", | |
| headers: jsonHeaders, | |
| body: JSON.stringify(profile), | |
| }); | |
| if (!res.ok) { | |
| throw new Error("Error saving company profile"); | |
| } | |
| return res.json(); | |
| } | |
| export async function fetchCompanyProfile(): Promise<CompanyProfile> { | |
| const res = await fetch(`${API_BASE}/api/company-profile`); | |
| if (!res.ok) { | |
| throw new Error("No company profile available"); | |
| } | |
| return res.json(); | |
| } | |
| export async function fetchAnalysisHistory(): Promise<AnalysisHistoryItem[]> { | |
| const res = await fetch(`${API_BASE}/api/analysis-history`); | |
| if (!res.ok) { | |
| throw new Error("Error fetching analysis history"); | |
| } | |
| return res.json(); | |
| } | |
| export async function syncDatabase() { | |
| const res = await fetch(`${API_BASE}/api/tenders/sync`, { method: "POST" }); | |
| if (!res.ok) { | |
| throw new Error("Error syncing database"); | |
| } | |
| return res.json(); | |
| } | |
| export async function scrapeTenders(keyword: string): Promise<Tender[]> { | |
| const res = await fetch(`${API_BASE}/api/tenders/scrape?keyword=${encodeURIComponent(keyword)}`); | |
| if (!res.ok) { | |
| throw new Error("Error scraping tenders"); | |
| } | |
| return res.json(); | |
| } | |