infoalloggi-monorepo/apps/infoalloggi/src/server/api/routers/pagamenti.ts

80 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import { TRPCError } from "@trpc/server";
import { z } from "zod/v4";
import type OrderTypeEnum from "~/schemas/public/OrderTypeEnum";
2025-08-04 17:45:44 +02:00
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import {
getPagamentoDataForCheckout,
preparePayment,
type PreparedPaymentData,
} from "~/server/controllers/pagamenti.controller";
2025-08-04 17:45:44 +02:00
import { db } from "~/server/db";
import { genPdfRicevutaCortesia } from "~/server/services/puppeteer.service";
import { zOrdineId, zServizioId } from "~/server/utils/zod_types";
2025-08-04 17:45:44 +02:00
// Create a new ratelimiter, that allows 10 requests per 10 seconds
/*
const ratelimit = new RateLimiterHandler({
maxRequests: 10,
windowSize: 60,
analytics: false,
});
*/
export const pagamentiRouter = createTRPCRouter({
2025-08-28 18:27:07 +02:00
getPaymentFromIntent: protectedProcedure
.input(z.object({ pIntentId: z.string() }))
.query(async ({ input }) => {
try {
const ordine = await db
.selectFrom("ordini")
.selectAll("ordini")
.where("ordini.intent_id", "=", input.pIntentId)
.executeTakeFirst();
return ordine || null;
2025-08-28 18:27:07 +02:00
} catch (error) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Errore durante il recupero del pagamento: ${(error as Error).message}`,
2025-08-28 18:27:07 +02:00
});
}
}),
preparePayment: protectedProcedure
.input(
z.object({
servizioId: zServizioId,
type: z.custom<OrderTypeEnum>(),
}),
)
.output(z.discriminatedUnion("", [
z.object({
success: z.literal(true),
data: z.custom<PreparedPaymentData>(),
}),
z.object({
success: z.literal(false),
message: z.string(),
}),
]),)
.query(async ({ input }) => {
return await preparePayment(input.servizioId, input.type);
}),
getPagamentoDataForCheckout: protectedProcedure
.input(z.object({ ordineId: zOrdineId }))
.query(async ({ input }) => {
return await getPagamentoDataForCheckout(input.ordineId);
}),
getRicevutaCortesiaPdf: protectedProcedure
.input(z.object({ ordineId: zOrdineId }))
.mutation(async ({ input }) => {
try {
return await genPdfRicevutaCortesia(input.ordineId);
} catch (e) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Errore nella generazione della ricevuta di cortesia: ${(e as Error).message}`,
});
}
}),
2025-08-04 17:45:44 +02:00
});