diff --git a/apps/web/components/apps/CalendarListContainer.tsx b/apps/web/components/apps/CalendarListContainer.tsx
index 8afd92845e..87bce77cdc 100644
--- a/apps/web/components/apps/CalendarListContainer.tsx
+++ b/apps/web/components/apps/CalendarListContainer.tsx
@@ -116,6 +116,7 @@ function ConnectedCalendarsList(props: Props) {
type={item.integration.type}
isChecked={cal.isSelected}
destination={cal.externalId === props.destinationCalendarId}
+ credentialId={cal.credentialId}
/>
))}
diff --git a/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx b/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx
index f859274a5e..a611fe69b9 100644
--- a/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx
+++ b/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx
@@ -53,6 +53,7 @@ const ConnectedCalendarItem = (prop: IConnectedCalendarItem) => {
{calendars?.map((calendar, i) => (
{
{item.calendars.map((cal) => (
{
- const { title, externalId, type, isChecked, name, isLastItemInList = false } = props;
+ const { title, externalId, type, isChecked, name, isLastItemInList = false, credentialId } = props;
const [checkedInternal, setCheckedInternal] = useState(isChecked);
const utils = trpc.useContext();
const { t } = useLocale();
@@ -40,7 +41,7 @@ const CalendarSwitch = (props: ICalendarSwitchProps) => {
headers: {
"Content-Type": "application/json",
},
- body: JSON.stringify(body),
+ body: JSON.stringify({ ...body, credentialId }),
});
if (!res.ok) {
diff --git a/packages/prisma/migrations/20230911172537_connect_selected_calendar_to_credential/migration.sql b/packages/prisma/migrations/20230911172537_connect_selected_calendar_to_credential/migration.sql
new file mode 100644
index 0000000000..5d16cc6bad
--- /dev/null
+++ b/packages/prisma/migrations/20230911172537_connect_selected_calendar_to_credential/migration.sql
@@ -0,0 +1,5 @@
+-- AlterTable
+ALTER TABLE "SelectedCalendar" ADD COLUMN "credentialId" INTEGER;
+
+-- AddForeignKey
+ALTER TABLE "SelectedCalendar" ADD CONSTRAINT "SelectedCalendar_credentialId_fkey" FOREIGN KEY ("credentialId") REFERENCES "Credential"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma
index 199c2ea2af..ffcf80e83b 100644
--- a/packages/prisma/schema.prisma
+++ b/packages/prisma/schema.prisma
@@ -137,6 +137,7 @@ model Credential {
// How to make it a required column?
appId String?
destinationCalendars DestinationCalendar[]
+ selectedCalendars SelectedCalendar[]
invalid Boolean? @default(false)
@@index([userId])
@@ -448,10 +449,12 @@ model Availability {
}
model SelectedCalendar {
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
- userId Int
- integration String
- externalId String
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ userId Int
+ integration String
+ externalId String
+ credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade)
+ credentialId Int?
@@id([userId, integration, externalId])
@@index([userId])
diff --git a/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts b/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts
index 2b6e444633..fa6de6b98b 100644
--- a/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts
+++ b/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts
@@ -307,38 +307,6 @@ export const deleteCredentialHandler = async ({ ctx, input }: DeleteCredentialOp
}
}
- // If it's a calendar remove it from the SelectedCalendars
- if (credential.app?.categories.includes(AppCategories.calendar)) {
- const calendar = await getCalendar(credential);
-
- const calendars = await calendar?.listCalendars();
-
- if (calendars && calendars.length > 0) {
- calendars.map(async (cal) => {
- prisma.selectedCalendar
- .delete({
- where: {
- userId_integration_externalId: {
- userId: user.id,
- externalId: cal.externalId,
- integration: cal.integration as string,
- },
- },
- })
- .catch((error) => {
- if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2025") {
- console.log(
- `Error deleting selected calendars for user ${user.id} and calendar ${credential.appId}. Could not find selected calendar.`
- );
- }
- console.log(
- `Error deleting selected calendars for user ${user.id} and calendar ${credential.appId} with error: ${error}`
- );
- });
- });
- }
- }
-
// if zapier get disconnected, delete zapier apiKey, delete zapier webhooks and cancel all scheduled jobs from zapier
if (credential.app?.slug === "zapier") {
await prisma.apiKey.deleteMany({
@@ -372,4 +340,46 @@ export const deleteCredentialHandler = async ({ ctx, input }: DeleteCredentialOp
id: id,
},
});
+
+ // Backwards compatibility. Selected calendars cascade on delete when deleting a credential
+ // If it's a calendar remove it from the SelectedCalendars
+ if (credential.app?.categories.includes(AppCategories.calendar)) {
+ const selectedCalendars = await prisma.selectedCalendar.findMany({
+ where: {
+ userId: user.id,
+ integration: credential.type as string,
+ },
+ });
+
+ if (selectedCalendars.length) {
+ const calendar = await getCalendar(credential);
+
+ const calendars = await calendar?.listCalendars();
+
+ if (calendars && calendars.length > 0) {
+ calendars.map(async (cal) => {
+ prisma.selectedCalendar
+ .delete({
+ where: {
+ userId_integration_externalId: {
+ userId: user.id,
+ externalId: cal.externalId,
+ integration: cal.integration as string,
+ },
+ },
+ })
+ .catch((error) => {
+ if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2025") {
+ console.log(
+ `Error deleting selected calendars for user ${user.id} and calendar ${credential.appId}. Could not find selected calendar.`
+ );
+ }
+ console.log(
+ `Error deleting selected calendars for user ${user.id} and calendar ${credential.appId} with error: ${error}`
+ );
+ });
+ });
+ }
+ }
+ }
};
diff --git a/packages/types/Calendar.d.ts b/packages/types/Calendar.d.ts
index 0196cf6cb9..6cdd12f881 100644
--- a/packages/types/Calendar.d.ts
+++ b/packages/types/Calendar.d.ts
@@ -214,7 +214,7 @@ export interface IntegrationCalendar extends Ensure, "
// For displaying the connected email address
email?: string;
primaryEmail?: string;
- credentialId?: number;
+ credentialId?: number | null;
integrationTitle?: string;
}