import { FastifyInstance } from 'fastify'; import { z } from 'zod'; import { verifyReceipt } from '../services/payment/huawei-iap.js'; import { activateSubscription, getSubscriptionStatus } from '../services/payment/subscription-service.js'; const verifyHuaweiSchema = z.object({ purchaseToken: z.string().min(1), productId: z.string().min(1), tier: z.enum(['pro', 'proplus']), }); export async function paymentRoutes(app: FastifyInstance): Promise { app.post('/payment/verify-huawei', async (request) => { const parsed = verifyHuaweiSchema.safeParse(request.body); if (!parsed.success) { return { success: false, data: null, error: { code: 'VALIDATION_ERROR', message: parsed.error.issues[0]?.message } }; } const result = await verifyReceipt(parsed.data.purchaseToken); if (!result.valid) { return { success: false, data: null, error: { code: 'INVALID_RECEIPT', message: 'Purchase verification failed' } }; } const userId = (request.user as { userId: string }).userId; // Calculate expiry (1 month from now as default) const expiresAt = result.expiryTime ? new Date(result.expiryTime) : new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); await activateSubscription( userId, 'huawei', parsed.data.purchaseToken, parsed.data.tier, expiresAt, ); const subscription = await getSubscriptionStatus(userId); return { success: true, data: subscription, error: null }; }); app.get('/payment/subscription', async (request) => { const userId = (request.user as { userId: string }).userId; const data = await getSubscriptionStatus(userId); return { success: true, data, error: null }; }); }