import { http, HttpResponse } from 'msw'; import type { OfferingAdminDto, CreateOfferingRequest, UpdateOfferingRequest } from '@/features/offerings/services/types'; import { API_BASE } from '@/features/auth/mocks/fixtures'; const seed: OfferingAdminDto[] = [ { id: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', title: 'Starter', description: 'A simple website', price: '€ 300', priceNote: 'one-time', features: ['1 page', 'Contact form'], ctaLabel: 'Get started', featured: false, displayOrder: 0, }, { id: 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', title: 'Pro', description: 'A full website', price: '€ 800', priceNote: 'one-time', features: ['5 pages', 'Contact form', 'SEO'], ctaLabel: 'Get started', featured: true, displayOrder: 1, }, ]; let mockOfferings: OfferingAdminDto[] = [...seed]; export const resetMockOfferings = () => { mockOfferings = [...seed]; }; export const getMockOfferings = () => mockOfferings; export const offeringsHandlers = [ http.get(`${API_BASE}/api/v1/offerings`, () => HttpResponse.json(mockOfferings.map(({ displayOrder: _displayOrder, ...dto }) => dto)), ), http.get(`${API_BASE}/api/v1/offerings/admin`, () => HttpResponse.json(mockOfferings)), http.post(`${API_BASE}/api/v1/offerings/admin`, async ({ request }) => { const body = (await request.json()) as CreateOfferingRequest; const newOffering: OfferingAdminDto = { id: crypto.randomUUID(), ...body, displayOrder: mockOfferings.length, }; mockOfferings = [...mockOfferings, newOffering]; return HttpResponse.json(newOffering, { status: 201 }); }), http.put(`${API_BASE}/api/v1/offerings/admin/:id`, async ({ params, request }) => { const { id } = params as { id: string }; const body = (await request.json()) as UpdateOfferingRequest; const existing = mockOfferings.find((o) => o.id === id); if (!existing) return new HttpResponse(null, { status: 404 }); const updated: OfferingAdminDto = { ...existing, ...body }; mockOfferings = mockOfferings.map((o) => (o.id === id ? updated : o)); return HttpResponse.json(updated); }), http.delete(`${API_BASE}/api/v1/offerings/admin/:id`, ({ params }) => { const { id } = params as { id: string }; mockOfferings = mockOfferings.filter((o) => o.id !== id); return new HttpResponse(null, { status: 204 }); }), http.put(`${API_BASE}/api/v1/offerings/admin/reorder`, async ({ request }) => { const body = (await request.json()) as { orderedIds: string[] }; mockOfferings = body.orderedIds .map((id, index) => { const offering = mockOfferings.find((o) => o.id === id); return offering ? { ...offering, displayOrder: index } : null; }) .filter((o): o is OfferingAdminDto => o !== null); return new HttpResponse(null, { status: 204 }); }), http.post(`${API_BASE}/api/v1/offerings/admin/:id/move-up`, ({ params }) => { const { id } = params as { id: string }; moveAdjacent(id, -1); return new HttpResponse(null, { status: 204 }); }), http.post(`${API_BASE}/api/v1/offerings/admin/:id/move-down`, ({ params }) => { const { id } = params as { id: string }; moveAdjacent(id, 1); return new HttpResponse(null, { status: 204 }); }), ]; function moveAdjacent(id: string, delta: number) { const sorted = [...mockOfferings].sort((a, b) => a.displayOrder - b.displayOrder); const index = sorted.findIndex((o) => o.id === id); const swapIndex = index + delta; if (index === -1 || swapIndex < 0 || swapIndex >= sorted.length) return; const a = sorted[index]; const b = sorted[swapIndex]; [a.displayOrder, b.displayOrder] = [b.displayOrder, a.displayOrder]; }