import { Project, Package, Tag, Artifact, UploadResponse } 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(); } // Paginated response type interface PaginatedResponse { items: T[]; pagination: { page: number; limit: number; total: number; total_pages: number; }; } // Project API export async function listProjects(): Promise { const response = await fetch(`${API_BASE}/projects`); const data = await handleResponse>(response); 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): Promise { const response = await fetch(`${API_BASE}/project/${projectName}/packages`); const data = await handleResponse>(response); return data.items; } 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): Promise { const response = await fetch(`${API_BASE}/project/${projectName}/${packageName}/tags`); 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); } // 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}`; }