import { onRequest } from "firebase-functions/v2/https"; import { Request } from "firebase-functions/v2/https"; import { getCorsHandler } from "../../../shared/middleware"; import { getAdmin, getLogger } from "../../../shared/config"; import { InvoiceService } from "./invoiceService"; const admin = getAdmin(); const logger = getLogger(); const corsHandler = getCorsHandler(); const invoiceService = new InvoiceService(); export const processInvoice = onRequest({ region: '#{SERVICES_RGN}#' }, async (request: Request, response) => { return corsHandler(request, response, async () => { try { const authHeader = request.headers.authorization || ''; if (!authHeader || !authHeader.startsWith('Bearer ')) { response.status(401).json({ error: 'Unauthorized' }); return; } const idToken = authHeader.split('Bearer ')[1]; try { await admin.auth().verifyIdToken(idToken); const { membershipId, paymentId, invoiceData, emailOptions } = request.body; if (!membershipId || !paymentId || !invoiceData) { response.status(400).json({ success: false, error: 'Missing required fields' }); return; } const result = await invoiceService.processInvoice( membershipId, paymentId, invoiceData, emailOptions ); if (!result.success) { response.status(400).json({ success: false, error: result.error || 'Failed to process invoice' }); return; } response.json({ success: true, message: 'Invoice processed successfully', invoicePath: result.invoicePath, downloadUrl: result.downloadUrl, emailSent: result.emailSent }); } catch (authError: any) { logger.error('Authentication error:', authError); response.status(401).json({ success: false, error: 'Invalid authentication token', details: authError.message }); } } catch (error: any) { logger.error('Error processing invoice:', error); response.status(500).json({ success: false, error: 'Failed to process invoice', details: error.message }); } }); });