Skip to content
File

Blob: src/worker/durable/project-do/webhooks/types.ts

typescript101 lines
1import type {
2 ProjectId,
3 UnixTimestampMs,
4 WebhookDeliveryOutcome,
5 WebhookEventKind,
6 WebhookProviderConfig,
7 WebhookProvider,
8} from "@/contracts";
9import type { RecordVerifiedWebhookDeliveryResult, WebhookTriggerPayload } from "@/worker/contracts";
10import type * as projectSchema from "@/worker/db/durable/schema/project-do";
11import type { EncryptedSecret } from "@/worker/security/secrets";
12 
13export interface WebhookVerificationMaterial {
14 id: string;
15 projectId: ProjectId;
16 provider: WebhookProvider;
17 enabled: boolean;
18 config: WebhookProviderConfig | null;
19 updatedAt: UnixTimestampMs;
20 encryptedSecret: EncryptedSecret;
21}
22 
23export interface StoredProjectWebhook {
24 id: string;
25 projectId: ProjectId;
26 provider: WebhookProvider;
27 enabled: boolean;
28 config: WebhookProviderConfig | null;
29 createdAt: number;
30 updatedAt: number;
31 recentDeliveries: ParsedWebhookDeliveryRow[];
32}
33 
34export interface UpsertProjectWebhookInput {
35 projectId: ProjectId;
36 provider: WebhookProvider;
37 enabled: boolean;
38 config: WebhookProviderConfig | null | undefined;
39 encryptedSecret?: EncryptedSecret;
40 creating: boolean;
41 now: number;
42}
43 
44export type UpsertProjectWebhookResult =
45 | {
46 kind: "applied";
47 created: boolean;
48 webhook: StoredProjectWebhook;
49 }
50 | {
51 kind: "conflict";
52 reason: "create_conflict";
53 }
54 | {
55 kind: "rejected";
56 reason: "secret_not_allowed";
57 }
58 | {
59 kind: "invalid";
60 status: number;
61 code: string;
62 message: string;
63 }
64 | {
65 kind: "not_found";
66 };
67 
68export interface RotateProjectWebhookSecretInput {
69 projectId: ProjectId;
70 provider: WebhookProvider;
71 encryptedSecret: EncryptedSecret;
72 now: number;
73}
74 
75export interface DeleteProjectWebhookInput {
76 projectId: ProjectId;
77 provider: WebhookProvider;
78}
79 
80export interface TouchProjectWebhookVersionsInput {
81 projectId: ProjectId;
82 now: number;
83}
84 
85export interface ParsedWebhookDeliveryRow extends ProjectWebhookDeliveryRow {
86 provider: WebhookProvider;
87 eventKind: WebhookEventKind;
88 outcome: WebhookDeliveryOutcome;
89}
90 
91type ProjectWebhookRow = typeof projectSchema.projectWebhooks.$inferSelect;
92type ProjectWebhookDeliveryRow = typeof projectSchema.projectWebhookDeliveries.$inferSelect;
93 
94export interface StoredWebhookReplayResult extends RecordVerifiedWebhookDeliveryResult {
95 payload: WebhookTriggerPayload;
96 runInitialization: null;
97}
98 
99export const MAX_WEBHOOK_RECENT_DELIVERIES = 10;
100export const WEBHOOK_DELIVERY_RETENTION_MS = 72 * 60 * 60 * 1000;