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

125 lines
3.6 KiB
TypeScript

import { TRPCError } from "@trpc/server";
import { z } from "zod/v4";
import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import { ordiniOrdineId } from "~/schemas/public/Ordini";
import { rinnoviId } from "~/schemas/public/Rinnovi";
import { servizioServizioId } from "~/schemas/public/Servizio";
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import {
getPagamentoDataForCheckout,
getRicevutaData,
type PreparedPaymentData,
type PreparePaymentError,
preparePayment,
previewSaldo,
} from "~/server/controllers/pagamenti.controller";
import { db } from "~/server/db";
import { TypstGenerate } from "~/server/services/typst.service";
import { zResult } from "~/utils/result";
export const pagamentiRouter = createTRPCRouter({
getPaymentFromIntent: protectedProcedure
.input(z.object({ pIntentId: z.string() }))
.query(async ({ input }) => {
try {
const ordine = await db
.$pickTables<"ordini">()
.selectFrom("ordini")
.selectAll("ordini")
.where("ordini.intent_id", "=", input.pIntentId)
.executeTakeFirst();
return ordine || null;
} catch (error) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Errore durante il recupero del pagamento: ${(error as Error).message}`,
});
}
}),
preparePayment: protectedProcedure
.input(
z.object({
servizioId: servizioServizioId,
type: orderTypeEnum,
}),
)
.output(zResult<PreparedPaymentData, PreparePaymentError>())
.query(async ({ input }) => {
if (input.type === orderTypeEnum.enum.Rinnovo) {
return {
ok: false,
error: {
_tag: "InvalidInput",
message: "Use preparePaymentRinnovi for Rinnovo payments",
},
};
}
return await preparePayment({
type: input.type,
servizioId: input.servizioId,
});
}),
previewSaldo: protectedProcedure
.input(
z.object({
servizioId: servizioServizioId,
}),
)
.query(async ({ input }) => {
return await previewSaldo(input.servizioId);
}),
preparePaymentRinnovi: protectedProcedure
.input(
z.object({
rinnovoId: rinnoviId,
}),
)
.output(zResult<PreparedPaymentData, PreparePaymentError>())
.query(async ({ input }) => {
return await preparePayment({
type: orderTypeEnum.enum.Rinnovo,
rinnovoId: input.rinnovoId,
});
}),
getPagamentoDataForCheckout: protectedProcedure
.input(z.object({ ordineId: ordiniOrdineId }))
.query(async ({ input }) => {
return await getPagamentoDataForCheckout(input.ordineId);
}),
getRicevutaCortesiaPdf: protectedProcedure
.input(z.object({ ordineId: ordiniOrdineId }))
.mutation(async ({ input }) => {
try {
const ricData = await getRicevutaData(input.ordineId);
const pdf = await TypstGenerate({
templateId: "receipt.typ",
data: ricData.data,
});
return { title: ricData.title, pdf: pdf.toString("base64") };
} catch (e) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Errore nella generazione della ricevuta di cortesia: ${(e as Error).message}`,
});
}
}),
getRicevutaCortesiaPdfQuery: protectedProcedure
.input(z.object({ ordineId: ordiniOrdineId }))
.query(async ({ input }) => {
try {
const ricData = await getRicevutaData(input.ordineId);
const pdf = await TypstGenerate({
templateId: "receipt.typ",
data: ricData.data,
});
return { title: ricData.title, pdf: pdf.toString("base64") };
} catch (e) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Errore nella generazione della ricevuta di cortesia: ${(e as Error).message}`,
});
}
}),
});