import { apiClient } from './api/client'; import { Product, Order, CreateProductRequest, CreateOrderRequest, ProductStatus, } from '../types/marketplace'; /** * Marketplace Service * Implémente les endpoints marketplace selon le backend * Endpoints: * - GET /marketplace/products (public, avec query params: status, seller_id) * - POST /marketplace/products (protected, nécessite content creator role) * - POST /marketplace/orders (protected) * - GET /marketplace/download/:product_id (protected) */ export const marketplaceService = { /** * Liste les produits de la marketplace * @param filters Filtres optionnels (status, seller_id, product_type, min_price, max_price, search) * @param pagination Pagination (page, limit) * @returns Liste des produits avec pagination */ fetchProducts: async ( filters?: { status?: ProductStatus; seller_id?: string; product_type?: string; min_price?: number; max_price?: number; search?: string; }, pagination?: { page?: number; limit?: number; }, ): Promise<{ products: Product[]; total: number; page: number; limit: number; total_pages: number }> => { const params = new URLSearchParams(); if (filters?.status) { params.append('status', filters.status); } if (filters?.seller_id) { params.append('seller_id', filters.seller_id); } if (filters?.product_type) { params.append('product_type', filters.product_type); } if (filters?.min_price !== undefined) { params.append('min_price', filters.min_price.toString()); } if (filters?.max_price !== undefined) { params.append('max_price', filters.max_price.toString()); } if (filters?.search) { params.append('search', filters.search); } if (pagination?.page) { params.append('page', pagination.page.toString()); } if (pagination?.limit) { params.append('limit', pagination.limit.toString()); } const queryString = params.toString(); const url = `/marketplace/products${queryString ? `?${queryString}` : ''}`; const response = await apiClient.get<{ products: Product[]; total: number; page: number; limit: number; total_pages: number; }>(url); // Handle both old format (array) and new format (object with pagination) if (Array.isArray(response.data)) { return { products: response.data, total: response.data.length, page: 1, limit: response.data.length, total_pages: 1, }; } return response.data; }, /** * Crée un nouveau produit * Nécessite l'authentification et le rôle content creator * @param data Données du produit à créer * @returns Le produit créé */ createProduct: async (data: CreateProductRequest): Promise => { const response = await apiClient.post( '/marketplace/products', data, ); return response.data; }, /** * Crée une commande (achat de produits) * Nécessite l'authentification * @param items Liste des produits à acheter (peut contenir plusieurs produits) * @returns La commande créée */ createOrder: async (items: { product_id: string }[]): Promise => { const data: CreateOrderRequest = { items }; const response = await apiClient.post('/marketplace/orders', data); return response.data; }, /** * Achète un seul produit (helper pour créer une commande avec un seul item) * @param productId ID du produit à acheter * @returns La commande créée */ purchaseProduct: async (productId: string): Promise => { return marketplaceService.createOrder([{ product_id: productId }]); }, /** * Récupère l'URL de téléchargement pour un produit acheté * Nécessite l'authentification et une licence valide pour le produit * @param productId ID du produit * @returns URL de téléchargement sécurisée */ getDownloadLink: async (productId: string): Promise => { const response = await apiClient.get<{ url: string }>( `/marketplace/download/${productId}`, ); return response.data.url; }, };