import { api } from './api'; export interface RootProject { id: string; name: string; description: string; createdAt: string; } export interface RootVersion { id: string; productId?: string; projectId?: string | null; name: string; status?: string; releaseDate: string | null; createdAt: string; currentStage?: string | null; startDate?: string | null; expectedReleaseDate?: string | null; members?: unknown[]; progress?: unknown[]; priority?: string; links?: unknown; } export interface RootProduct { id: string; name: string; description: string; createdAt: string; updatedAt: string; projects: RootProject[]; versions: RootVersion[]; _count?: { requirements: number; projects: number; versions?: number }; } export async function createProductRoot(data: { name: string; description?: string }): Promise { const product = await api.post>('/products', data); return normalizeProductRoot({ ...product, projects: [], versions: [] }); } export async function updateProductRoot( productId: string, data: { name?: string; description?: string }, ): Promise> { return api.patch>(`/products/${productId}`, data); } export async function deleteProductRoot(productId: string): Promise { await api.delete(`/products/${productId}`); } export async function createProjectByProductId( productId: string, data: { name: string; description?: string }, ): Promise { return api.post(`/products/${productId}/projects`, data); } export async function updateProjectByProductId( productId: string, projectId: string, data: { name?: string; description?: string }, ): Promise { return api.patch(`/products/${productId}/projects/${projectId}`, data); } export async function deleteProjectByProductId(productId: string, projectId: string): Promise { await api.delete(`/products/${productId}/projects/${projectId}`); } export async function createVersionByProductId( productId: string, data: { name: string; status?: string; projectId?: string }, ): Promise { return normalizeVersionRoot(await api.post(`/products/${productId}/versions`, data)); } export async function updateVersionByProductId( productId: string, versionId: string, data: Record, ): Promise { return normalizeVersionRoot(await api.patch(`/products/${productId}/versions/${versionId}`, data)); } export async function deleteVersionByProductId(productId: string, versionId: string): Promise { await api.delete(`/products/${productId}/versions/${versionId}`); } function normalizeProductRoot(product: RootProduct): RootProduct { return { ...product, projects: product.projects ?? [], versions: (product.versions ?? []).map(normalizeVersionRoot), _count: product._count ?? { requirements: 0, projects: product.projects?.length ?? 0, versions: product.versions?.length ?? 0 }, }; } function normalizeVersionRoot(version: RootVersion): RootVersion { return { ...version, status: version.status ?? 'planned', releaseDate: version.releaseDate ?? null, members: Array.isArray(version.members) ? version.members : [], progress: Array.isArray(version.progress) ? version.progress : [], links: version.links && typeof version.links === 'object' ? version.links : {}, }; }