import type { Product, Order, ProductVariantResponse, PatternVariantsResponse, ProductCover, Legal, DeliveryMethod, PaymentMethod, ApiResponse } from "~/types"; /** * Shop API composable. * All requests go through dedicated Nuxt server API routes. * The API token is handled server-side and never exposed to clients. */ export function useShopApi() { return { // Products async getProducts(coverId?: string, page = 1, pageSize = 24) { const params = new URLSearchParams(); if (coverId) params.append("cover", coverId); params.append("page", page.toString()); params.append("pageSize", pageSize.toString()); return await $fetch>(`/api/products?${params}`); }, async getCheapestProducts(coverId?: string, page = 1, pageSize = 24) { const params = new URLSearchParams(); if (coverId) params.append("cover", coverId); params.append("page", page.toString()); params.append("pageSize", pageSize.toString()); return await $fetch>(`/api/products/promo?${params}`); }, async getProductById(id: string) { return await $fetch(`/api/products/${id}`); }, async getProductBySlug(slug: string) { return await $fetch(`/api/product/${slug}`); }, async getProductVariants(id: string): Promise { return await $fetch(`/api/products/${id}/variants`); }, async getProductVariantsByProductId(id: number): Promise { return await $fetch(`/api/products/${id}/variants`); }, async getPatternVariants(id: string): Promise { return await $fetch(`/api/products/${id}/variants/pattern`); }, async getPatternVariantsByProductId(id: number): Promise { return await $fetch(`/api/products/${id}/variants/pattern`); }, // Product metadata async getProductRulings() { return await $fetch>(`/api/product-rulings`); }, async getProductPatterns() { return await $fetch>(`/api/product-patterns`); }, async getProductPages() { return await $fetch>(`/api/product-pages`); }, async getProductCovers() { return await $fetch>(`/api/product-covers`); }, async getProductCoverById(id: string) { return await $fetch>(`/api/product-covers/${id}`); }, // Orders async createOrder(): Promise { return await $fetch("/api/orders", { method: "POST" }); }, async getOrder(uuid: string): Promise { return await $fetch(`/api/orders/${uuid}`); }, async updateOrder(uuid: string, data: Partial): Promise { return await $fetch(`/api/orders/${uuid}`, { method: "PUT", body: { data } }); }, async addProductToCart(uuid: string, productId: number, count = 1): Promise { return await $fetch(`/api/orders/${uuid}/add-product/${productId}?count=${count}`, { method: "PUT" }); }, async removeProductFromCart(uuid: string, productId: number, count = 1): Promise { return await $fetch(`/api/orders/${uuid}/remove-product/${productId}?count=${count}`, { method: "PUT" }); }, async checkoutOrder(uuid: string): Promise<{ id: string }> { const returnUrl = import.meta.client ? window.location.href : ""; return await $fetch<{ id: string }>(`/api/orders/${uuid}/checkout?returnUrl=${encodeURIComponent(returnUrl)}`, { method: "POST" }); }, async capturePayment(uuid: string, paypalOrderId: string): Promise { return await $fetch(`/api/orders/${uuid}/capture/${paypalOrderId}`, { method: "POST" }); }, // Payment & Delivery async getPaymentMethods() { return await $fetch>(`/api/payments`); }, async getDeliveryMethods() { return await $fetch>(`/api/deliveries`); }, // Content async getLegal(): Promise { return await $fetch(`/api/legal`); }, async getContent(): Promise { return await $fetch(`/api/content`); }, async getWebsites(): Promise { return await $fetch(`/api/websites`); } }; }