Files
calendar/packages/features/webhooks/lib/interface/IWebhookRepository.ts
Syed Ali ShahbazandGitHub 4115eaacbd chore: Add initial webhook wiring (TRPC handlers) to the new architecture (#27170)
* --init

* clean up

* unnecessary comment

* remove comment

* fix factory resolver

* Add active filter to webhook query
2026-01-23 16:50:34 +04:00

90 lines
2.8 KiB
TypeScript

import type { UserPermissionRole, WebhookTriggerEvents } from "@calcom/prisma/enums";
import type { Webhook, WebhookGroup, WebhookSubscriber } from "../dto/types";
/**
* Webhook Version enum - defines the payload format versions.
*
* This is a TypeScript-only enum (not Prisma).
* DB operations go through the repository which enforces these values.
*/
const WebhookVersion = {
V_2021_10_20: "2021-10-20",
} as const;
type WebhookVersion = (typeof WebhookVersion)[keyof typeof WebhookVersion];
/**
* Default webhook version - used for new webhooks and as fallback
*/
const DEFAULT_WEBHOOK_VERSION: WebhookVersion = WebhookVersion.V_2021_10_20;
const VALID_WEBHOOK_VERSIONS: Set<string> = new Set<string>(Object.values(WebhookVersion));
export { WebhookVersion, DEFAULT_WEBHOOK_VERSION, VALID_WEBHOOK_VERSIONS };
export function isValidWebhookVersion(value: string): value is WebhookVersion {
return VALID_WEBHOOK_VERSIONS.has(value);
}
/**
* Parse and validate a webhook version string.
* Throws if the version is invalid.
*/
export function parseWebhookVersion(value: string): WebhookVersion {
if (!isValidWebhookVersion(value)) {
throw new Error(
`Invalid webhook version: "${value}". Valid versions are: ${Object.values(WebhookVersion).join(", ")}`
);
}
return value;
}
export interface GetSubscribersOptions {
userId?: number | null;
eventTypeId?: number | null;
triggerEvent: WebhookTriggerEvents;
teamId?: number | number[] | null;
orgId?: number | null;
oAuthClientId?: string | null;
}
export interface ListWebhooksOptions {
userId: number;
appId?: string | null;
eventTypeId?: number | null;
eventTriggers?: WebhookTriggerEvents[];
}
export interface IWebhookRepository {
getSubscribers(options: GetSubscribersOptions): Promise<WebhookSubscriber[]>;
getWebhookById(id: string): Promise<WebhookSubscriber | null>;
findByWebhookId(webhookId?: string): Promise<{
id: string;
subscriberUrl: string;
payloadTemplate: string | null;
active: boolean;
eventTriggers: WebhookTriggerEvents[];
secret: string | null;
teamId: number | null;
userId: number | null;
platform: boolean;
time: number | null;
timeUnit: string | null;
version: WebhookVersion;
}>;
findByOrgIdAndTrigger(options: {
orgId: number;
triggerEvent: WebhookTriggerEvents;
}): Promise<WebhookSubscriber[]>;
getFilteredWebhooksForUser(options: { userId: number; userRole?: UserPermissionRole }): Promise<{
webhookGroups: WebhookGroup[];
profiles: {
teamId: number | null | undefined;
slug: string | null;
name: string | null;
image?: string | undefined;
canModify?: boolean;
canDelete?: boolean;
}[];
}>;
listWebhooks(options: ListWebhooksOptions): Promise<Webhook[]>;
}