Álvaro Valenzuela Valdes
feat: Live Compra Ágil web scraper integration for real-time discovery
7259e84
raw
history blame
3.55 kB
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();
}