49 lines
1.9 KiB
TypeScript
49 lines
1.9 KiB
TypeScript
import z from "zod";
|
|
|
|
import { _SelectedCalendarModel as SelectedCalendar } from "@calcom/prisma/zod";
|
|
|
|
import { schemaQueryIdAsString } from "./shared/queryIdString";
|
|
import { schemaQueryIdParseInt } from "./shared/queryIdTransformParseInt";
|
|
|
|
export const schemaSelectedCalendarBaseBodyParams = SelectedCalendar;
|
|
|
|
export const schemaSelectedCalendarPublic = SelectedCalendar.omit({});
|
|
|
|
export const schemaSelectedCalendarBodyParams = schemaSelectedCalendarBaseBodyParams.partial({
|
|
userId: true,
|
|
});
|
|
|
|
export const schemaSelectedCalendarUpdateBodyParams = schemaSelectedCalendarBaseBodyParams.partial();
|
|
|
|
export const selectedCalendarIdSchema = schemaQueryIdAsString.transform((v, ctx) => {
|
|
/** We can assume the first part is the userId since it's an integer */
|
|
const [userIdStr, ...rest] = v.id.split("_");
|
|
/** We can assume that the remainder is both the integration type and external id combined */
|
|
const integration_externalId = rest.join("_");
|
|
/**
|
|
* Since we only handle calendars here we can split by `_calendar_` and re add it later on.
|
|
* This handle special cases like `google_calendar_c_blabla@group.calendar.google.com` and
|
|
* `hubspot_other_calendar`.
|
|
**/
|
|
const [_integration, externalId] = integration_externalId.split("_calendar_");
|
|
const userIdInt = schemaQueryIdParseInt.safeParse({ id: userIdStr });
|
|
if (!userIdInt.success) {
|
|
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "userId is not a number" });
|
|
return z.NEVER;
|
|
}
|
|
if (!_integration) {
|
|
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Missing integration" });
|
|
return z.NEVER;
|
|
}
|
|
if (!externalId) {
|
|
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Missing externalId" });
|
|
return z.NEVER;
|
|
}
|
|
return {
|
|
userId: userIdInt.data.id,
|
|
/** We re-add the split `_calendar` string */
|
|
integration: `${_integration}_calendar`,
|
|
externalId,
|
|
};
|
|
});
|