// ================================================================ // frontend/src/api/services/demo.ts // ================================================================ /** * Demo Session Service - Complete backend alignment * * Backend API structure (3-tier architecture): * - ATOMIC: demo_accounts.py, demo_sessions.py * - OPERATIONS: demo_operations.py * * Note: Demo service does NOT use tenant prefix * * Last Updated: 2025-10-05 * Status: ✅ Complete - Zero drift with backend */ import { apiClient } from '../client'; import type { DemoSessionResponse } from '../types/demo'; export interface DemoAccount { account_type: string; email: string; name: string; password: string; description?: string; features?: string[]; business_model?: string; } // Use the complete type from types/demo.ts which matches backend response export type DemoSession = DemoSessionResponse; export interface CreateSessionRequest { demo_account_type: 'individual_bakery' | 'central_baker'; } export interface ExtendSessionRequest { session_id: string; } export interface DestroySessionRequest { session_id: string; } export interface ServiceProgress { status: 'not_started' | 'in_progress' | 'completed' | 'failed'; records_cloned: number; error?: string; } export interface SessionStatusResponse { session_id: string; status: 'pending' | 'ready' | 'partial' | 'failed' | 'active' | 'expired' | 'destroyed'; total_records_cloned: number; progress?: Record; errors?: Array<{ service: string; error_message: string }>; } // =================================================================== // OPERATIONS: Demo Session Status and Cloning // =================================================================== /** * Get session status * GET /demo/sessions/{session_id}/status */ export const getSessionStatus = async (sessionId: string): Promise => { return await apiClient.get(`/demo/sessions/${sessionId}/status`); }; /** * Retry data cloning for a session * POST /demo/sessions/{session_id}/retry */ export const retryCloning = async (sessionId: string): Promise => { return await apiClient.post(`/demo/sessions/${sessionId}/retry`, {}); }; // =================================================================== // ATOMIC: Demo Accounts // Backend: services/demo_session/app/api/demo_accounts.py // =================================================================== /** * Get available demo accounts * GET /demo/accounts */ export const getDemoAccounts = async (): Promise => { return await apiClient.get('/demo/accounts'); }; // =================================================================== // ATOMIC: Demo Sessions // Backend: services/demo_session/app/api/demo_sessions.py // =================================================================== /** * Create a new demo session * POST /demo/sessions */ export const createDemoSession = async ( request: CreateSessionRequest ): Promise => { return await apiClient.post('/demo/sessions', request); }; /** * Get demo session details * GET /demo/sessions/{session_id} */ export const getDemoSession = async (sessionId: string): Promise => { return await apiClient.get(`/demo/sessions/${sessionId}`); }; // =================================================================== // OPERATIONS: Demo Session Management // Backend: services/demo_session/app/api/demo_operations.py // =================================================================== /** * Extend an existing demo session * POST /demo/sessions/{session_id}/extend */ export const extendDemoSession = async ( request: ExtendSessionRequest ): Promise => { return await apiClient.post( `/demo/sessions/${request.session_id}/extend`, {} ); }; /** * Destroy a demo session * Note: This might be a DELETE endpoint - verify backend implementation */ export const destroyDemoSession = async ( request: DestroySessionRequest ): Promise<{ message: string }> => { return await apiClient.post<{ message: string }>( `/demo/sessions/${request.session_id}/destroy`, {} ); }; /** * Get demo session statistics * GET /demo/stats */ export const getDemoStats = async (): Promise => { return await apiClient.get('/demo/stats'); }; /** * Cleanup expired demo sessions (Admin/Operations) * POST /demo/operations/cleanup */ export const cleanupExpiredSessions = async (): Promise => { return await apiClient.post('/demo/operations/cleanup', {}); }; // =================================================================== // API Service Class // =================================================================== export class DemoSessionAPI { async getDemoAccounts(): Promise { return getDemoAccounts(); } async createDemoSession(request: CreateSessionRequest): Promise { return createDemoSession(request); } async getDemoSession(sessionId: string): Promise { return getDemoSession(sessionId); } async extendDemoSession(request: ExtendSessionRequest): Promise { return extendDemoSession(request); } async destroyDemoSession(request: DestroySessionRequest): Promise<{ message: string }> { return destroyDemoSession(request); } async getDemoStats(): Promise { return getDemoStats(); } async cleanupExpiredSessions(): Promise { return cleanupExpiredSessions(); } async getSessionStatus(sessionId: string): Promise { return getSessionStatus(sessionId); } async retryCloning(sessionId: string): Promise { return retryCloning(sessionId); } } export const demoSessionAPI = new DemoSessionAPI();