import { Project, Package, Tag, TagDetail, Artifact, ArtifactDetail, UploadResponse, PaginatedResponse, ListParams, TagListParams, PackageListParams, ArtifactListParams, ProjectListParams, GlobalSearchResponse, } from './types'; const API_BASE = '/api/v1'; async function handleResponse(response: Response): Promise { if (!response.ok) { const error = await response.json().catch(() => ({ detail: 'Unknown error' })); throw new Error(error.detail || `HTTP ${response.status}`); } return response.json(); } function buildQueryString(params: Record): string { const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== null && value !== '') { searchParams.append(key, String(value)); } }); const query = searchParams.toString(); return query ? `?${query}` : ''; } // Global Search API export async function globalSearch(query: string, limit: number = 5): Promise { const params = buildQueryString({ q: query, limit }); const response = await fetch(`${API_BASE}/search${params}`); return handleResponse(response); } // Project API export async function listProjects(params: ProjectListParams = {}): Promise> { const query = buildQueryString(params as Record); const response = await fetch(`${API_BASE}/projects${query}`); return handleResponse>(response); } export async function listProjectsSimple(params: ListParams = {}): Promise { const data = await listProjects(params); return data.items; } export async function createProject(data: { name: string; description?: string; is_public?: boolean }): Promise { const response = await fetch(`${API_BASE}/projects`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return handleResponse(response); } export async function getProject(name: string): Promise { const response = await fetch(`${API_BASE}/projects/${name}`); return handleResponse(response); } // Package API export async function listPackages(projectName: string, params: PackageListParams = {}): Promise> { const query = buildQueryString(params as Record); const response = await fetch(`${API_BASE}/project/${projectName}/packages${query}`); return handleResponse>(response); } export async function listPackagesSimple(projectName: string, params: PackageListParams = {}): Promise { const data = await listPackages(projectName, params); return data.items; } export async function getPackage(projectName: string, packageName: string): Promise { const response = await fetch(`${API_BASE}/project/${projectName}/packages/${packageName}`); return handleResponse(response); } export async function createPackage(projectName: string, data: { name: string; description?: string }): Promise { const response = await fetch(`${API_BASE}/project/${projectName}/packages`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return handleResponse(response); } // Tag API export async function listTags(projectName: string, packageName: string, params: TagListParams = {}): Promise> { const query = buildQueryString(params as Record); const response = await fetch(`${API_BASE}/project/${projectName}/${packageName}/tags${query}`); return handleResponse>(response); } export async function listTagsSimple(projectName: string, packageName: string, params: TagListParams = {}): Promise { const data = await listTags(projectName, packageName, params); return data.items; } export async function getTag(projectName: string, packageName: string, tagName: string): Promise { const response = await fetch(`${API_BASE}/project/${projectName}/${packageName}/tags/${tagName}`); return handleResponse(response); } export async function createTag(projectName: string, packageName: string, data: { name: string; artifact_id: string }): Promise { const response = await fetch(`${API_BASE}/project/${projectName}/${packageName}/tags`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return handleResponse(response); } // Artifact API export async function getArtifact(artifactId: string): Promise { const response = await fetch(`${API_BASE}/artifact/${artifactId}`); return handleResponse(response); } export async function listPackageArtifacts( projectName: string, packageName: string, params: ArtifactListParams = {} ): Promise> { const query = buildQueryString(params as Record); const response = await fetch(`${API_BASE}/project/${projectName}/${packageName}/artifacts${query}`); return handleResponse>(response); } // Upload export async function uploadArtifact(projectName: string, packageName: string, file: File, tag?: string): Promise { const formData = new FormData(); formData.append('file', file); if (tag) { formData.append('tag', tag); } const response = await fetch(`${API_BASE}/project/${projectName}/${packageName}/upload`, { method: 'POST', body: formData, }); return handleResponse(response); } // Download URL export function getDownloadUrl(projectName: string, packageName: string, ref: string): string { return `${API_BASE}/project/${projectName}/${packageName}/+/${ref}`; }