diff --git a/apps/web/pages/api/book/request-reschedule.ts b/apps/web/pages/api/book/request-reschedule.ts index 3602bc0a78..a3f08adcf0 100644 --- a/apps/web/pages/api/book/request-reschedule.ts +++ b/apps/web/pages/api/book/request-reschedule.ts @@ -61,7 +61,7 @@ const handler = async ( if (session?.user?.id) { userOwner = await findUserDataByUserId(session?.user.id); } else { - return res.status(501); + return res.status(501).end(); } const bookingToReschedule = await prisma.booking.findFirst({ @@ -235,10 +235,10 @@ function validate( if (error instanceof ZodError && error?.name === "ZodError") { return res.status(400).json(error?.issues); } - return res.status(402); + return res.status(402).end(); } } else { - return res.status(405); + return res.status(405).end(); } await handler(req, res); }; diff --git a/apps/web/playwright/fixtures/bookings.ts b/apps/web/playwright/fixtures/bookings.ts index 72045a7b64..ef4e2fa37e 100644 --- a/apps/web/playwright/fixtures/bookings.ts +++ b/apps/web/playwright/fixtures/bookings.ts @@ -21,9 +21,11 @@ export const createBookingsFixture = (page: Page) => { userId: number, username: string | null, eventTypeId = -1, - { rescheduled = false, paid = false, status = "ACCEPTED" }: Partial = {} + { rescheduled = false, paid = false, status = "ACCEPTED" }: Partial = {}, + startDateParam?: Date, + endDateParam?: Date ) => { - const startDate = dayjs().add(1, "day").toDate(); + const startDate = startDateParam || dayjs().add(1, "day").toDate(); const seed = `${username}:${dayjs(startDate).utc().format()}:${new Date().getTime()}`; const uid = translator.fromUUID(uuidv5(seed, uuidv5.URL)); const booking = await prisma.booking.create({ @@ -31,7 +33,7 @@ export const createBookingsFixture = (page: Page) => { uid: uid, title: "30min", startTime: startDate, - endTime: dayjs().add(1, "day").add(30, "minutes").toDate(), + endTime: endDateParam || dayjs().add(1, "day").add(30, "minutes").toDate(), user: { connect: { id: userId, diff --git a/apps/web/playwright/lib/appstore/wipe-my-cal.test.ts b/apps/web/playwright/lib/appstore/wipe-my-cal.test.ts new file mode 100644 index 0000000000..38501dd703 --- /dev/null +++ b/apps/web/playwright/lib/appstore/wipe-my-cal.test.ts @@ -0,0 +1,69 @@ +import { expect } from "@playwright/test"; +import dayjs from "dayjs"; + +import prisma from "@calcom/prisma"; + +import { test } from "../../lib/fixtures"; + +test.describe.configure({ mode: "parallel" }); + +test.describe("Wipe my Cal App Test", () => { + test("Browse upcoming bookings and validate button shows and triggering wipe my cal button", async ({ + page, + users, + bookings, + }) => { + const pro = await users.create(); + const [eventType] = pro.eventTypes; + await prisma.credential.create({ + data: { + key: {}, + type: "wipemycal_other", + userId: pro.id, + appId: "wipe-my-cal", + }, + }); + await bookings.create( + pro.id, + pro.username, + eventType.id, + {}, + dayjs().endOf("day").subtract(29, "minutes").toDate(), + dayjs().endOf("day").toDate() + ); + await prisma.credential.create({ + data: { + key: {}, + type: "wipemycal_other", + userId: pro.id, + appId: "wipe-my-cal", + }, + }); + + await bookings.create(pro.id, pro.username, eventType.id, {}); + await bookings.create(pro.id, pro.username, eventType.id, {}); + await pro.login(); + await page.goto("/bookings/upcoming"); + await expect(page.locator("data-testid=wipe-today-button")).toBeVisible(); + + const totalUserBookings = await prisma.booking.findMany({ + where: { + userId: pro.id, + }, + }); + expect(totalUserBookings?.length).toBe(3); + await page.locator("data-testid=wipe-today-button").click(); + await page.locator("data-testid=send_request").click(); + // eslint-disable-next-line playwright/no-wait-for-timeout + await page.waitForTimeout(250); + const totalUserBookingsCancelled = await prisma.booking.findMany({ + where: { + userId: pro.id, + status: "CANCELLED", + }, + }); + + await expect(totalUserBookingsCancelled?.length).toBe(1); + await users.deleteAll(); + }); +}); diff --git a/packages/app-store/vital/lib/reschedule.ts b/packages/app-store/vital/lib/reschedule.ts index a6820fe1ef..be6e382349 100644 --- a/packages/app-store/vital/lib/reschedule.ts +++ b/packages/app-store/vital/lib/reschedule.ts @@ -139,19 +139,6 @@ const Reschedule = async (bookingUid: string, cancellationReason: string) => { logger.error(error.message); } } - // Creating cancelled event as placeholders in calendars, remove when virtual calendar handles it - try { - const eventManager = new EventManager({ - credentials: userOwner.credentials, - destinationCalendar: userOwner.destinationCalendar, - }); - builder.calendarEvent.title = `Cancelled: ${builder.calendarEvent.title}`; - await eventManager.updateAndSetCancelledPlaceholder(builder.calendarEvent, bookingToReschedule); - } catch (error) { - if (error instanceof Error) { - logger.error(error.message); - } - } // Send emails try { diff --git a/packages/app-store/wipemycalother/api/wipe.ts b/packages/app-store/wipemycalother/api/wipe.ts index 96cd7f22af..573e6036f1 100644 --- a/packages/app-store/wipemycalother/api/wipe.ts +++ b/packages/app-store/wipemycalother/api/wipe.ts @@ -21,7 +21,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => { if (!req.session?.user?.id) { return res.status(401).json({ message: "You must be logged in to do this" }); } - let result = false; + try { const { initialDate, endDate } = req.body; diff --git a/packages/app-store/wipemycalother/components/confirmDialog.tsx b/packages/app-store/wipemycalother/components/confirmDialog.tsx index a5116bff42..7be78bd983 100644 --- a/packages/app-store/wipemycalother/components/confirmDialog.tsx +++ b/packages/app-store/wipemycalother/components/confirmDialog.tsx @@ -29,7 +29,7 @@ const wipeMyCalAction = async (props: IWipeMyCalAction) => { }; try { const endpoint = "/api/integrations/wipemycalother/wipe"; - return fetch(`${process.env.NEXT_PUBLIC_APP_BASE_URL}` + endpoint, { + return fetch(`${process.env.NEXT_PUBLIC_WEBAPP_URL}` + endpoint, { method: "POST", headers: { "Content-Type": "application/json", @@ -81,7 +81,7 @@ export const ConfirmDialog = (props: IConfirmDialogWipe) => { return ( - + e.preventDefault()}>
@@ -99,9 +99,10 @@ export const ConfirmDialog = (props: IConfirmDialogWipe) => {
- - - + + + )}
diff --git a/packages/app-store/wipemycalother/lib/reschedule.ts b/packages/app-store/wipemycalother/lib/reschedule.ts index a6820fe1ef..b042a4a862 100644 --- a/packages/app-store/wipemycalother/lib/reschedule.ts +++ b/packages/app-store/wipemycalother/lib/reschedule.ts @@ -78,7 +78,7 @@ const Reschedule = async (bookingUid: string, cancellationReason: string) => { }, }); const [mainAttendee] = bookingToReschedule.attendees; - // @NOTE: Should we assume attendees language? + const tAttendees = await getTranslation(mainAttendee.locale ?? "en", "common"); const usersToPeopleType = ( users: PersonAttendeeCommonFields[], @@ -139,19 +139,6 @@ const Reschedule = async (bookingUid: string, cancellationReason: string) => { logger.error(error.message); } } - // Creating cancelled event as placeholders in calendars, remove when virtual calendar handles it - try { - const eventManager = new EventManager({ - credentials: userOwner.credentials, - destinationCalendar: userOwner.destinationCalendar, - }); - builder.calendarEvent.title = `Cancelled: ${builder.calendarEvent.title}`; - await eventManager.updateAndSetCancelledPlaceholder(builder.calendarEvent, bookingToReschedule); - } catch (error) { - if (error instanceof Error) { - logger.error(error.message); - } - } // Send emails try {