* feat: optimize Prisma queries by replacing findFirst with findUnique where applicable - Replace findFirst/findFirstOrThrow with findUnique/findUniqueOrThrow for queries using unique constraints - Maintain existing functionality and error handling behavior - Focus on queries using primary keys and unique index fields from schema - Revert problematic changes that caused test failures to maintain stability Co-Authored-By: benny@cal.com <benny@cal.com> * revert: exclude API files from Prisma query optimizations per user request - Reverted all 55 API-related files to their original state - Kept all non-API Prisma query optimizations intact - API files include apps/api/v1, apps/api/v2, apps/web/app/api, and packages/app-store/*/api - Non-API optimizations remain for packages/lib, packages/features, apps/web (non-api), etc. Co-Authored-By: benny@cal.com <benny@cal.com> * feat: optimize membership query in attributeUtils to use findUnique with userId_teamId constraint Co-Authored-By: benny@cal.com <benny@cal.com> * revert: exclude test files from Prisma query optimizations per user request Co-Authored-By: benny@cal.com <benny@cal.com> * revert: revert attributeUtils.ts to use findFirst for test compatibility Co-Authored-By: benny@cal.com <benny@cal.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: benny@cal.com <benny@cal.com> Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
142 lines
3.3 KiB
TypeScript
142 lines
3.3 KiB
TypeScript
import type { Booking, Payment, Prisma, PaymentOption } from "@prisma/client";
|
|
import { v4 as uuidv4 } from "uuid";
|
|
|
|
import prisma from "@calcom/prisma";
|
|
import type { IAbstractPaymentService } from "@calcom/types/PaymentService";
|
|
|
|
export class PaymentService implements IAbstractPaymentService {
|
|
async create(
|
|
payment: Pick<Prisma.PaymentUncheckedCreateInput, "amount" | "currency">,
|
|
bookingId: Booking["id"]
|
|
) {
|
|
try {
|
|
const booking = await prisma.booking.findUnique({
|
|
select: {
|
|
uid: true,
|
|
title: true,
|
|
},
|
|
where: {
|
|
id: bookingId,
|
|
},
|
|
});
|
|
|
|
if (booking === null) {
|
|
throw new Error("Booking not found");
|
|
}
|
|
|
|
const uid = uuidv4();
|
|
|
|
console.log("CREATE payment");
|
|
|
|
const paymentData = await prisma.payment.create({
|
|
data: {
|
|
uid,
|
|
app: {
|
|
connect: {
|
|
slug: "mock-payment-app",
|
|
},
|
|
},
|
|
booking: {
|
|
connect: {
|
|
id: bookingId,
|
|
},
|
|
},
|
|
amount: payment.amount,
|
|
externalId: uid,
|
|
currency: payment.currency,
|
|
data: {} as Prisma.InputJsonValue,
|
|
fee: 0,
|
|
refunded: false,
|
|
success: false,
|
|
},
|
|
});
|
|
|
|
return paymentData;
|
|
} catch (error) {
|
|
console.error(error);
|
|
throw new Error("Payment could not be created");
|
|
}
|
|
}
|
|
async update(): Promise<Payment> {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
async refund(): Promise<Payment> {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
|
|
async collectCard(
|
|
payment: Pick<Prisma.PaymentUncheckedCreateInput, "amount" | "currency">,
|
|
bookingId: number,
|
|
_bookerEmail: string,
|
|
paymentOption: PaymentOption
|
|
): Promise<Payment> {
|
|
try {
|
|
const booking = await prisma.booking.findUnique({
|
|
select: {
|
|
uid: true,
|
|
title: true,
|
|
},
|
|
where: {
|
|
id: bookingId,
|
|
},
|
|
});
|
|
if (booking === null) {
|
|
throw new Error("Booking not found");
|
|
}
|
|
|
|
const uid = uuidv4();
|
|
|
|
const paymentData = await prisma.payment.create({
|
|
data: {
|
|
uid,
|
|
app: {
|
|
connect: {
|
|
slug: "paypal",
|
|
},
|
|
},
|
|
booking: {
|
|
connect: {
|
|
id: bookingId,
|
|
},
|
|
},
|
|
amount: payment.amount,
|
|
currency: payment.currency,
|
|
data: {} as Prisma.InputJsonValue,
|
|
fee: 0,
|
|
refunded: false,
|
|
success: false,
|
|
paymentOption,
|
|
externalId: "",
|
|
},
|
|
});
|
|
|
|
if (!paymentData) {
|
|
throw new Error();
|
|
}
|
|
return paymentData;
|
|
} catch (error) {
|
|
console.error(error);
|
|
throw new Error("Payment could not be created");
|
|
}
|
|
}
|
|
chargeCard(): Promise<Payment> {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
getPaymentPaidStatus(): Promise<string> {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
getPaymentDetails(): Promise<Payment> {
|
|
throw new Error("Method not implemented.");
|
|
}
|
|
afterPayment(): Promise<void> {
|
|
return Promise.resolve();
|
|
}
|
|
deletePayment(): Promise<boolean> {
|
|
return Promise.resolve(false);
|
|
}
|
|
|
|
isSetupAlready(): boolean {
|
|
return true;
|
|
}
|
|
}
|