@thebookingkit/server 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -0
- package/dist/adapters/email-adapter.js +2 -2
- package/dist/adapters/email-adapter.js.map +1 -1
- package/dist/adapters/job-adapter.d.ts +10 -10
- package/dist/adapters/job-adapter.d.ts.map +1 -1
- package/dist/adapters/job-adapter.js +10 -10
- package/dist/adapters/job-adapter.js.map +1 -1
- package/dist/api.d.ts +3 -3
- package/dist/api.js +5 -5
- package/dist/api.js.map +1 -1
- package/package.json +21 -2
- package/.turbo/turbo-build.log +0 -6
- package/.turbo/turbo-test.log +0 -20
- package/CHANGELOG.md +0 -9
- package/dist/__tests__/api.test.d.ts +0 -2
- package/dist/__tests__/api.test.d.ts.map +0 -1
- package/dist/__tests__/api.test.js +0 -280
- package/dist/__tests__/api.test.js.map +0 -1
- package/dist/__tests__/auth.test.d.ts +0 -2
- package/dist/__tests__/auth.test.d.ts.map +0 -1
- package/dist/__tests__/auth.test.js +0 -78
- package/dist/__tests__/auth.test.js.map +0 -1
- package/dist/__tests__/concurrent-booking.test.d.ts +0 -2
- package/dist/__tests__/concurrent-booking.test.d.ts.map +0 -1
- package/dist/__tests__/concurrent-booking.test.js +0 -111
- package/dist/__tests__/concurrent-booking.test.js.map +0 -1
- package/dist/__tests__/multi-tenancy.test.d.ts +0 -2
- package/dist/__tests__/multi-tenancy.test.d.ts.map +0 -1
- package/dist/__tests__/multi-tenancy.test.js +0 -196
- package/dist/__tests__/multi-tenancy.test.js.map +0 -1
- package/dist/__tests__/serialization-retry.test.d.ts +0 -2
- package/dist/__tests__/serialization-retry.test.d.ts.map +0 -1
- package/dist/__tests__/serialization-retry.test.js +0 -53
- package/dist/__tests__/serialization-retry.test.js.map +0 -1
- package/dist/__tests__/webhooks.test.d.ts +0 -2
- package/dist/__tests__/webhooks.test.d.ts.map +0 -1
- package/dist/__tests__/webhooks.test.js +0 -286
- package/dist/__tests__/webhooks.test.js.map +0 -1
- package/dist/__tests__/workflows.test.d.ts +0 -2
- package/dist/__tests__/workflows.test.d.ts.map +0 -1
- package/dist/__tests__/workflows.test.js +0 -299
- package/dist/__tests__/workflows.test.js.map +0 -1
- package/src/__tests__/api.test.ts +0 -354
- package/src/__tests__/auth.test.ts +0 -111
- package/src/__tests__/concurrent-booking.test.ts +0 -170
- package/src/__tests__/multi-tenancy.test.ts +0 -267
- package/src/__tests__/serialization-retry.test.ts +0 -76
- package/src/__tests__/webhooks.test.ts +0 -412
- package/src/__tests__/workflows.test.ts +0 -422
- package/src/adapters/calendar-adapter.ts +0 -49
- package/src/adapters/email-adapter.ts +0 -108
- package/src/adapters/index.ts +0 -36
- package/src/adapters/job-adapter.ts +0 -26
- package/src/adapters/payment-adapter.ts +0 -118
- package/src/adapters/sms-adapter.ts +0 -35
- package/src/adapters/storage-adapter.ts +0 -11
- package/src/api.ts +0 -446
- package/src/auth.ts +0 -146
- package/src/booking-tokens.ts +0 -61
- package/src/email-templates.ts +0 -140
- package/src/index.ts +0 -192
- package/src/multi-tenancy.ts +0 -301
- package/src/notification-jobs.ts +0 -428
- package/src/serialization-retry.ts +0 -94
- package/src/webhooks.ts +0 -378
- package/src/workflows.ts +0 -441
- package/tsconfig.json +0 -9
- package/vitest.config.ts +0 -7
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# @thebookingkit/server
|
|
2
|
+
|
|
3
|
+
Auth, webhooks, API keys, workflows, and adapter interfaces for booking system backends.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@thebookingkit/server)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://www.typescriptlang.org/)
|
|
8
|
+
|
|
9
|
+
Part of [The Booking Kit](https://docs.thebookingkit.dev) — The Headless Booking Primitive.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @thebookingkit/server
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { withAuth, signWebhookPayload, generateApiKey } from "@thebookingkit/server";
|
|
21
|
+
|
|
22
|
+
// Protect a route with auth middleware
|
|
23
|
+
const handler = withAuth(async (req) => {
|
|
24
|
+
const user = req.auth; // typed AuthUser
|
|
25
|
+
return Response.json({ ok: true });
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Sign and verify webhook payloads
|
|
29
|
+
const signature = signWebhookPayload(payload, secret);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Key Features
|
|
33
|
+
|
|
34
|
+
- **Auth Middleware** — `withAuth`, ownership assertions, pluggable `AuthAdapter` (NextAuth.js, Clerk, Supabase, Lucia)
|
|
35
|
+
- **Webhooks** — HMAC-SHA256 signing/verification, retry with exponential backoff, subscription matching
|
|
36
|
+
- **API Key Management** — Generation, hashing, verification, scopes, expiration, rate limiting
|
|
37
|
+
- **Booking Tokens** — Secure token generation and verification for confirmation/cancellation links
|
|
38
|
+
- **Workflows** — Trigger-based automation with conditions, template variables, and action routing
|
|
39
|
+
- **Notifications** — Email templates (confirmation, reminder, cancellation, reschedule) and calendar sync
|
|
40
|
+
- **Multi-Tenancy** — Role-based permissions, settings inheritance (org > provider > event type), tenant scoping
|
|
41
|
+
- **Serialization Retry** — `withSerializableRetry` for SERIALIZABLE transaction conflict handling
|
|
42
|
+
- **Adapter Interfaces** — Swappable `EmailAdapter`, `CalendarAdapter`, `JobAdapter`, `StorageAdapter`, `SmsAdapter`, `PaymentAdapter`
|
|
43
|
+
|
|
44
|
+
## Documentation
|
|
45
|
+
|
|
46
|
+
[**Full Documentation**](https://docs.thebookingkit.dev/features/webhooks/)
|
|
47
|
+
|
|
48
|
+
## License
|
|
49
|
+
|
|
50
|
+
MIT
|
|
@@ -6,11 +6,11 @@ export function generateICSAttachment(booking) {
|
|
|
6
6
|
const ics = [
|
|
7
7
|
"BEGIN:VCALENDAR",
|
|
8
8
|
"VERSION:2.0",
|
|
9
|
-
"PRODID:-//
|
|
9
|
+
"PRODID:-//TheBookingKit//EN",
|
|
10
10
|
"CALSCALE:GREGORIAN",
|
|
11
11
|
"METHOD:PUBLISH",
|
|
12
12
|
"BEGIN:VEVENT",
|
|
13
|
-
`UID:${booking.id}@
|
|
13
|
+
`UID:${booking.id}@thebookingkit`,
|
|
14
14
|
`DTSTART:${formatICSDate(booking.startsAt)}`,
|
|
15
15
|
`DTEND:${formatICSDate(booking.endsAt)}`,
|
|
16
16
|
`SUMMARY:${escapeICS(booking.title)}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-adapter.js","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAwDA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OASrC;IACC,MAAM,aAAa,GAAG,CAAC,CAAO,EAAE,EAAE,CAChC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG;QACV,iBAAiB;QACjB,aAAa;QACb,
|
|
1
|
+
{"version":3,"file":"email-adapter.js","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAwDA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OASrC;IACC,MAAM,aAAa,GAAG,CAAC,CAAO,EAAE,EAAE,CAChC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG;QACV,iBAAiB;QACjB,aAAa;QACb,6BAA6B;QAC7B,oBAAoB;QACpB,gBAAgB;QAChB,cAAc;QACd,OAAO,OAAO,CAAC,EAAE,gBAAgB;QACjC,WAAW,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC5C,SAAS,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACxC,WAAW,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACrC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACjE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1E,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,oBAAoB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1E,mBAAmB,OAAO,CAAC,aAAa,EAAE;QAC1C,WAAW,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;QACtC,YAAY;QACZ,eAAe;KAChB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,eAAe;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -11,16 +11,16 @@ export interface JobAdapter {
|
|
|
11
11
|
/** Cancel a previously scheduled job */
|
|
12
12
|
cancel(jobId: string): Promise<void>;
|
|
13
13
|
}
|
|
14
|
-
/** Common job names used by
|
|
14
|
+
/** Common job names used by The Booking Kit */
|
|
15
15
|
export declare const JOB_NAMES: {
|
|
16
|
-
readonly SEND_CONFIRMATION_EMAIL: "
|
|
17
|
-
readonly SEND_REMINDER_EMAIL: "
|
|
18
|
-
readonly SEND_CANCELLATION_EMAIL: "
|
|
19
|
-
readonly SEND_RESCHEDULE_EMAIL: "
|
|
20
|
-
readonly SYNC_CALENDAR_EVENT: "
|
|
21
|
-
readonly DELETE_CALENDAR_EVENT: "
|
|
22
|
-
readonly CHECK_CALENDAR_CONFLICTS: "
|
|
23
|
-
readonly AUTO_REJECT_PENDING: "
|
|
24
|
-
readonly PROCESS_WEBHOOK: "
|
|
16
|
+
readonly SEND_CONFIRMATION_EMAIL: "thebookingkit/send-confirmation-email";
|
|
17
|
+
readonly SEND_REMINDER_EMAIL: "thebookingkit/send-reminder-email";
|
|
18
|
+
readonly SEND_CANCELLATION_EMAIL: "thebookingkit/send-cancellation-email";
|
|
19
|
+
readonly SEND_RESCHEDULE_EMAIL: "thebookingkit/send-reschedule-email";
|
|
20
|
+
readonly SYNC_CALENDAR_EVENT: "thebookingkit/sync-calendar-event";
|
|
21
|
+
readonly DELETE_CALENDAR_EVENT: "thebookingkit/delete-calendar-event";
|
|
22
|
+
readonly CHECK_CALENDAR_CONFLICTS: "thebookingkit/check-calendar-conflicts";
|
|
23
|
+
readonly AUTO_REJECT_PENDING: "thebookingkit/auto-reject-pending-booking";
|
|
24
|
+
readonly PROCESS_WEBHOOK: "thebookingkit/process-webhook";
|
|
25
25
|
};
|
|
26
26
|
//# sourceMappingURL=job-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/job-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,0CAA0C;IAC1C,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,wCAAwC;IACxC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED
|
|
1
|
+
{"version":3,"file":"job-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/job-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,0CAA0C;IAC1C,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,wCAAwC;IACxC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,+CAA+C;AAC/C,eAAO,MAAM,SAAS;;;;;;;;;;CAUZ,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
/** Common job names used by
|
|
1
|
+
/** Common job names used by The Booking Kit */
|
|
2
2
|
export const JOB_NAMES = {
|
|
3
|
-
SEND_CONFIRMATION_EMAIL: "
|
|
4
|
-
SEND_REMINDER_EMAIL: "
|
|
5
|
-
SEND_CANCELLATION_EMAIL: "
|
|
6
|
-
SEND_RESCHEDULE_EMAIL: "
|
|
7
|
-
SYNC_CALENDAR_EVENT: "
|
|
8
|
-
DELETE_CALENDAR_EVENT: "
|
|
9
|
-
CHECK_CALENDAR_CONFLICTS: "
|
|
10
|
-
AUTO_REJECT_PENDING: "
|
|
11
|
-
PROCESS_WEBHOOK: "
|
|
3
|
+
SEND_CONFIRMATION_EMAIL: "thebookingkit/send-confirmation-email",
|
|
4
|
+
SEND_REMINDER_EMAIL: "thebookingkit/send-reminder-email",
|
|
5
|
+
SEND_CANCELLATION_EMAIL: "thebookingkit/send-cancellation-email",
|
|
6
|
+
SEND_RESCHEDULE_EMAIL: "thebookingkit/send-reschedule-email",
|
|
7
|
+
SYNC_CALENDAR_EVENT: "thebookingkit/sync-calendar-event",
|
|
8
|
+
DELETE_CALENDAR_EVENT: "thebookingkit/delete-calendar-event",
|
|
9
|
+
CHECK_CALENDAR_CONFLICTS: "thebookingkit/check-calendar-conflicts",
|
|
10
|
+
AUTO_REJECT_PENDING: "thebookingkit/auto-reject-pending-booking",
|
|
11
|
+
PROCESS_WEBHOOK: "thebookingkit/process-webhook",
|
|
12
12
|
};
|
|
13
13
|
//# sourceMappingURL=job-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-adapter.js","sourceRoot":"","sources":["../../src/adapters/job-adapter.ts"],"names":[],"mappings":"AAcA
|
|
1
|
+
{"version":3,"file":"job-adapter.js","sourceRoot":"","sources":["../../src/adapters/job-adapter.ts"],"names":[],"mappings":"AAcA,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,uBAAuB,EAAE,uCAAuC;IAChE,mBAAmB,EAAE,mCAAmC;IACxD,uBAAuB,EAAE,uCAAuC;IAChE,qBAAqB,EAAE,qCAAqC;IAC5D,mBAAmB,EAAE,mCAAmC;IACxD,qBAAqB,EAAE,qCAAqC;IAC5D,wBAAwB,EAAE,wCAAwC;IAClE,mBAAmB,EAAE,2CAA2C;IAChE,eAAe,EAAE,+BAA+B;CACxC,CAAC"}
|
package/dist/api.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* REST API utilities for
|
|
2
|
+
* REST API utilities for The Booking Kit.
|
|
3
3
|
*
|
|
4
4
|
* Provides standardized response formatting, API key management,
|
|
5
5
|
* rate limiting, pagination, and request validation helpers
|
|
@@ -112,11 +112,11 @@ export declare function generateApiKey(prefix?: string): GeneratedApiKey;
|
|
|
112
112
|
/**
|
|
113
113
|
* Hash an API key for secure storage.
|
|
114
114
|
*
|
|
115
|
-
* Uses HMAC-SHA256 with a secret from the
|
|
115
|
+
* Uses HMAC-SHA256 with a secret from the THEBOOKINGKIT_API_KEY_SECRET
|
|
116
116
|
* environment variable. Throws if the secret is not configured.
|
|
117
117
|
*
|
|
118
118
|
* @param key - The full API key
|
|
119
|
-
* @param secret - Optional HMAC secret (defaults to
|
|
119
|
+
* @param secret - Optional HMAC secret (defaults to THEBOOKINGKIT_API_KEY_SECRET env var)
|
|
120
120
|
* @returns The hex-encoded hash
|
|
121
121
|
*/
|
|
122
122
|
export declare function hashApiKey(key: string, secret?: string): string;
|
package/dist/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* REST API utilities for
|
|
2
|
+
* REST API utilities for The Booking Kit.
|
|
3
3
|
*
|
|
4
4
|
* Provides standardized response formatting, API key management,
|
|
5
5
|
* rate limiting, pagination, and request validation helpers
|
|
@@ -90,17 +90,17 @@ export function generateApiKey(prefix = "sk_live_") {
|
|
|
90
90
|
/**
|
|
91
91
|
* Hash an API key for secure storage.
|
|
92
92
|
*
|
|
93
|
-
* Uses HMAC-SHA256 with a secret from the
|
|
93
|
+
* Uses HMAC-SHA256 with a secret from the THEBOOKINGKIT_API_KEY_SECRET
|
|
94
94
|
* environment variable. Throws if the secret is not configured.
|
|
95
95
|
*
|
|
96
96
|
* @param key - The full API key
|
|
97
|
-
* @param secret - Optional HMAC secret (defaults to
|
|
97
|
+
* @param secret - Optional HMAC secret (defaults to THEBOOKINGKIT_API_KEY_SECRET env var)
|
|
98
98
|
* @returns The hex-encoded hash
|
|
99
99
|
*/
|
|
100
100
|
export function hashApiKey(key, secret) {
|
|
101
|
-
const hmacSecret = secret ?? process.env.
|
|
101
|
+
const hmacSecret = secret ?? process.env.THEBOOKINGKIT_API_KEY_SECRET;
|
|
102
102
|
if (!hmacSecret) {
|
|
103
|
-
throw new Error("
|
|
103
|
+
throw new Error("THEBOOKINGKIT_API_KEY_SECRET environment variable is required for API key hashing. " +
|
|
104
104
|
"Set it to a random 32+ character string.");
|
|
105
105
|
}
|
|
106
106
|
return createHmac("sha256", hmacSecret).update(key).digest("hex");
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA0CtD,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,+BAA+B;AAC/B,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC;AAIX,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAA2B,EAC3B,OAAe,EACf,OAAiC;IAEjC,OAAO;QACL,KAAK,EAAE;YACL,IAAI;YACJ,OAAO;YACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAO,EACP,IAAc;IAEd,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAU,EACV,UAAyB,EACzB,KAAc;IAEd,OAAO;QACL,IAAI,EAAE,KAAK;QACX,IAAI,EAAE;YACJ,UAAU;YACV,OAAO,EAAE,UAAU,KAAK,IAAI;YAC5B,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C;KACF,CAAC;AACJ,CAAC;AA4CD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,UAAU;IACxD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAE9D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,MAAe;IACrD,MAAM,UAAU,GACd,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thebookingkit/server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Backend APIs, auth middleware, webhooks, notifications, and multi-tenant utilities for The Booking Kit",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/thebookingkit/thebookingkit.git",
|
|
9
|
+
"directory": "packages/server"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://thebookingkit.com",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"thebookingkit",
|
|
14
|
+
"booking",
|
|
15
|
+
"scheduling",
|
|
16
|
+
"server",
|
|
17
|
+
"api"
|
|
18
|
+
],
|
|
4
19
|
"publishConfig": {
|
|
5
20
|
"access": "public"
|
|
6
21
|
},
|
|
@@ -14,6 +29,10 @@
|
|
|
14
29
|
"types": "./dist/index.d.ts"
|
|
15
30
|
}
|
|
16
31
|
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"!dist/__tests__"
|
|
35
|
+
],
|
|
17
36
|
"scripts": {
|
|
18
37
|
"build": "tsc",
|
|
19
38
|
"prepublishOnly": "npm run build",
|
|
@@ -22,7 +41,7 @@
|
|
|
22
41
|
"test:watch": "vitest"
|
|
23
42
|
},
|
|
24
43
|
"dependencies": {
|
|
25
|
-
"@thebookingkit/core": "^0.1.
|
|
44
|
+
"@thebookingkit/core": "^0.1.3"
|
|
26
45
|
},
|
|
27
46
|
"devDependencies": {
|
|
28
47
|
"@types/node": "^25.3.5",
|
package/.turbo/turbo-build.log
DELETED
package/.turbo/turbo-test.log
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @thebookingkit/server@0.1.0 test
|
|
3
|
-
> vitest run
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
RUN v3.2.4 /Users/zain/Desktop/slotkit/packages/server
|
|
7
|
-
|
|
8
|
-
✓ src/__tests__/multi-tenancy.test.ts (26 tests) 7ms
|
|
9
|
-
✓ src/__tests__/webhooks.test.ts (35 tests) 10ms
|
|
10
|
-
✓ src/__tests__/workflows.test.ts (37 tests) 14ms
|
|
11
|
-
✓ src/__tests__/api.test.ts (40 tests) 15ms
|
|
12
|
-
✓ src/__tests__/auth.test.ts (8 tests) 15ms
|
|
13
|
-
✓ src/__tests__/serialization-retry.test.ts (6 tests) 106ms
|
|
14
|
-
✓ src/__tests__/concurrent-booking.test.ts (5 tests) 167ms
|
|
15
|
-
|
|
16
|
-
Test Files 7 passed (7)
|
|
17
|
-
Tests 157 passed (157)
|
|
18
|
-
Start at 01:24:25
|
|
19
|
-
Duration 700ms (transform 315ms, setup 0ms, collect 1.10s, tests 335ms, environment 1ms, prepare 475ms)
|
|
20
|
-
|
package/CHANGELOG.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { createErrorResponse, createSuccessResponse, createPaginatedResponse, generateApiKey, hashApiKey, verifyApiKey, hasScope, isKeyExpired, checkRateLimit, encodeCursor, decodeCursor, validateSlotQueryParams, parseSortParam, API_ERROR_CODES, } from "../api.js";
|
|
3
|
-
// Set the required env var for API key hashing in tests
|
|
4
|
-
process.env.SLOTKIT_API_KEY_SECRET = "test-secret-for-unit-tests-only";
|
|
5
|
-
// ---------------------------------------------------------------------------
|
|
6
|
-
// Response Helpers
|
|
7
|
-
// ---------------------------------------------------------------------------
|
|
8
|
-
describe("createErrorResponse", () => {
|
|
9
|
-
it("creates a standard error envelope", () => {
|
|
10
|
-
const response = createErrorResponse("NOT_FOUND", "Booking not found");
|
|
11
|
-
expect(response).toEqual({
|
|
12
|
-
error: { code: "NOT_FOUND", message: "Booking not found" },
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
it("includes details when provided", () => {
|
|
16
|
-
const response = createErrorResponse("VALIDATION_ERROR", "Invalid input", { field: "email" });
|
|
17
|
-
expect(response.error.details).toEqual({ field: "email" });
|
|
18
|
-
});
|
|
19
|
-
it("omits details when not provided", () => {
|
|
20
|
-
const response = createErrorResponse("UNAUTHORIZED", "Invalid key");
|
|
21
|
-
expect(response.error.details).toBeUndefined();
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
describe("createSuccessResponse", () => {
|
|
25
|
-
it("wraps data in a success envelope", () => {
|
|
26
|
-
const response = createSuccessResponse({ id: "bk-1" });
|
|
27
|
-
expect(response).toEqual({ data: { id: "bk-1" } });
|
|
28
|
-
});
|
|
29
|
-
it("includes meta when provided", () => {
|
|
30
|
-
const response = createSuccessResponse([], {
|
|
31
|
-
nextCursor: "abc",
|
|
32
|
-
hasMore: true,
|
|
33
|
-
});
|
|
34
|
-
expect(response.meta?.nextCursor).toBe("abc");
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe("createPaginatedResponse", () => {
|
|
38
|
-
it("creates paginated response with cursor", () => {
|
|
39
|
-
const response = createPaginatedResponse(["a", "b"], "cursor123", 10);
|
|
40
|
-
expect(response.data).toEqual(["a", "b"]);
|
|
41
|
-
expect(response.meta.nextCursor).toBe("cursor123");
|
|
42
|
-
expect(response.meta.hasMore).toBe(true);
|
|
43
|
-
expect(response.meta.total).toBe(10);
|
|
44
|
-
});
|
|
45
|
-
it("marks hasMore false when nextCursor is null", () => {
|
|
46
|
-
const response = createPaginatedResponse(["a"], null);
|
|
47
|
-
expect(response.meta.hasMore).toBe(false);
|
|
48
|
-
expect(response.meta.nextCursor).toBeNull();
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
// API Key Management
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
describe("generateApiKey", () => {
|
|
55
|
-
it("generates a key with the given prefix", () => {
|
|
56
|
-
const { key } = generateApiKey("sk_live_");
|
|
57
|
-
expect(key).toMatch(/^sk_live_[0-9a-f]{64}$/);
|
|
58
|
-
});
|
|
59
|
-
it("generates a display prefix", () => {
|
|
60
|
-
const { prefix } = generateApiKey("sk_live_");
|
|
61
|
-
expect(prefix).toContain("...");
|
|
62
|
-
});
|
|
63
|
-
it("generates a 64-char hex hash", () => {
|
|
64
|
-
const { hash } = generateApiKey();
|
|
65
|
-
expect(hash).toMatch(/^[0-9a-f]{64}$/);
|
|
66
|
-
});
|
|
67
|
-
it("generates unique keys each time", () => {
|
|
68
|
-
const { key: k1 } = generateApiKey();
|
|
69
|
-
const { key: k2 } = generateApiKey();
|
|
70
|
-
expect(k1).not.toBe(k2);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe("hashApiKey", () => {
|
|
74
|
-
it("throws when SLOTKIT_API_KEY_SECRET is missing", () => {
|
|
75
|
-
const original = process.env.SLOTKIT_API_KEY_SECRET;
|
|
76
|
-
delete process.env.SLOTKIT_API_KEY_SECRET;
|
|
77
|
-
try {
|
|
78
|
-
expect(() => hashApiKey("sk_live_test")).toThrow("SLOTKIT_API_KEY_SECRET environment variable is required");
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
process.env.SLOTKIT_API_KEY_SECRET = original;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
it("accepts an explicit secret parameter", () => {
|
|
85
|
-
const hash = hashApiKey("sk_live_test", "my-explicit-secret");
|
|
86
|
-
expect(hash).toMatch(/^[0-9a-f]{64}$/);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
describe("verifyApiKey", () => {
|
|
90
|
-
it("returns true for correct key", () => {
|
|
91
|
-
const { key, hash } = generateApiKey();
|
|
92
|
-
expect(verifyApiKey(key, hash)).toBe(true);
|
|
93
|
-
});
|
|
94
|
-
it("returns false for tampered key", () => {
|
|
95
|
-
const { hash } = generateApiKey();
|
|
96
|
-
expect(verifyApiKey("sk_live_wrong", hash)).toBe(false);
|
|
97
|
-
});
|
|
98
|
-
it("returns false for wrong hash", () => {
|
|
99
|
-
const { key } = generateApiKey();
|
|
100
|
-
const { hash: otherHash } = generateApiKey();
|
|
101
|
-
expect(verifyApiKey(key, otherHash)).toBe(false);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
describe("hasScope", () => {
|
|
105
|
-
it("returns true when scope is present", () => {
|
|
106
|
-
const scopes = ["read:bookings", "write:bookings"];
|
|
107
|
-
expect(hasScope(scopes, "read:bookings")).toBe(true);
|
|
108
|
-
});
|
|
109
|
-
it("returns false when scope is absent", () => {
|
|
110
|
-
const scopes = ["read:bookings"];
|
|
111
|
-
expect(hasScope(scopes, "write:bookings")).toBe(false);
|
|
112
|
-
});
|
|
113
|
-
it("admin scope grants all permissions", () => {
|
|
114
|
-
const scopes = ["admin"];
|
|
115
|
-
expect(hasScope(scopes, "read:bookings")).toBe(true);
|
|
116
|
-
expect(hasScope(scopes, "write:event-types")).toBe(true);
|
|
117
|
-
expect(hasScope(scopes, "write:webhooks")).toBe(true);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
describe("isKeyExpired", () => {
|
|
121
|
-
it("returns false for no expiry", () => {
|
|
122
|
-
expect(isKeyExpired(undefined)).toBe(false);
|
|
123
|
-
expect(isKeyExpired(null)).toBe(false);
|
|
124
|
-
});
|
|
125
|
-
it("returns true for past expiry", () => {
|
|
126
|
-
expect(isKeyExpired(new Date(Date.now() - 1000))).toBe(true);
|
|
127
|
-
});
|
|
128
|
-
it("returns false for future expiry", () => {
|
|
129
|
-
expect(isKeyExpired(new Date(Date.now() + 86400000))).toBe(false);
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
// Rate Limiting
|
|
134
|
-
// ---------------------------------------------------------------------------
|
|
135
|
-
describe("checkRateLimit", () => {
|
|
136
|
-
beforeEach(() => {
|
|
137
|
-
vi.useFakeTimers();
|
|
138
|
-
vi.setSystemTime(new Date("2026-03-15T14:00:00.000Z"));
|
|
139
|
-
});
|
|
140
|
-
afterEach(() => {
|
|
141
|
-
vi.useRealTimers();
|
|
142
|
-
});
|
|
143
|
-
it("allows first request", () => {
|
|
144
|
-
const { result } = checkRateLimit(null, 120);
|
|
145
|
-
expect(result.allowed).toBe(true);
|
|
146
|
-
expect(result.remaining).toBe(119);
|
|
147
|
-
expect(result.limit).toBe(120);
|
|
148
|
-
});
|
|
149
|
-
it("tracks requests within a window", () => {
|
|
150
|
-
const { newState } = checkRateLimit(null, 120);
|
|
151
|
-
const { result } = checkRateLimit(newState, 120);
|
|
152
|
-
expect(result.allowed).toBe(true);
|
|
153
|
-
expect(result.remaining).toBe(118);
|
|
154
|
-
});
|
|
155
|
-
it("blocks requests when limit exceeded", () => {
|
|
156
|
-
let state = checkRateLimit(null, 2).newState;
|
|
157
|
-
state = checkRateLimit(state, 2).newState;
|
|
158
|
-
const { result } = checkRateLimit(state, 2);
|
|
159
|
-
expect(result.allowed).toBe(false);
|
|
160
|
-
expect(result.remaining).toBe(0);
|
|
161
|
-
});
|
|
162
|
-
it("resets counter in new window", () => {
|
|
163
|
-
let state = checkRateLimit(null, 2).newState;
|
|
164
|
-
state = checkRateLimit(state, 2).newState;
|
|
165
|
-
// Advance to next minute
|
|
166
|
-
vi.advanceTimersByTime(60 * 1000);
|
|
167
|
-
const { result } = checkRateLimit(state, 2);
|
|
168
|
-
expect(result.allowed).toBe(true);
|
|
169
|
-
expect(result.remaining).toBe(1);
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
// ---------------------------------------------------------------------------
|
|
173
|
-
// Cursor Pagination
|
|
174
|
-
// ---------------------------------------------------------------------------
|
|
175
|
-
describe("encodeCursor / decodeCursor", () => {
|
|
176
|
-
it("round-trips cursor data", () => {
|
|
177
|
-
const data = { id: "bk-1", createdAt: "2026-03-15T14:00:00Z" };
|
|
178
|
-
const cursor = encodeCursor(data);
|
|
179
|
-
const decoded = decodeCursor(cursor);
|
|
180
|
-
expect(decoded).toEqual(data);
|
|
181
|
-
});
|
|
182
|
-
it("returns null for invalid cursor", () => {
|
|
183
|
-
expect(decodeCursor("not-valid-base64!!!")).toBeNull();
|
|
184
|
-
});
|
|
185
|
-
it("returns null for non-JSON cursor", () => {
|
|
186
|
-
const cursor = Buffer.from("not json").toString("base64url");
|
|
187
|
-
expect(decodeCursor(cursor)).toBeNull();
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
// ---------------------------------------------------------------------------
|
|
191
|
-
// validateSlotQueryParams
|
|
192
|
-
// ---------------------------------------------------------------------------
|
|
193
|
-
describe("validateSlotQueryParams", () => {
|
|
194
|
-
const validParams = {
|
|
195
|
-
providerId: "prov-1",
|
|
196
|
-
start: "2026-03-15",
|
|
197
|
-
end: "2026-04-15",
|
|
198
|
-
timezone: "America/New_York",
|
|
199
|
-
};
|
|
200
|
-
it("accepts valid params", () => {
|
|
201
|
-
const result = validateSlotQueryParams(validParams);
|
|
202
|
-
expect(result.valid).toBe(true);
|
|
203
|
-
expect(result.errors).toHaveLength(0);
|
|
204
|
-
});
|
|
205
|
-
it("accepts teamId instead of providerId", () => {
|
|
206
|
-
const result = validateSlotQueryParams({
|
|
207
|
-
teamId: "team-1",
|
|
208
|
-
start: "2026-03-15",
|
|
209
|
-
end: "2026-04-15",
|
|
210
|
-
});
|
|
211
|
-
expect(result.valid).toBe(true);
|
|
212
|
-
});
|
|
213
|
-
it("rejects missing providerId and teamId", () => {
|
|
214
|
-
const result = validateSlotQueryParams({
|
|
215
|
-
start: "2026-03-15",
|
|
216
|
-
end: "2026-04-15",
|
|
217
|
-
});
|
|
218
|
-
expect(result.valid).toBe(false);
|
|
219
|
-
expect(result.errors[0].field).toBe("providerId");
|
|
220
|
-
});
|
|
221
|
-
it("rejects missing start date", () => {
|
|
222
|
-
const result = validateSlotQueryParams({
|
|
223
|
-
providerId: "p1",
|
|
224
|
-
end: "2026-04-15",
|
|
225
|
-
});
|
|
226
|
-
expect(result.valid).toBe(false);
|
|
227
|
-
expect(result.errors.some((e) => e.field === "start")).toBe(true);
|
|
228
|
-
});
|
|
229
|
-
it("rejects invalid start date", () => {
|
|
230
|
-
const result = validateSlotQueryParams({
|
|
231
|
-
providerId: "p1",
|
|
232
|
-
start: "not-a-date",
|
|
233
|
-
end: "2026-04-15",
|
|
234
|
-
});
|
|
235
|
-
expect(result.valid).toBe(false);
|
|
236
|
-
});
|
|
237
|
-
it("rejects end before start", () => {
|
|
238
|
-
const result = validateSlotQueryParams({
|
|
239
|
-
providerId: "p1",
|
|
240
|
-
start: "2026-04-15",
|
|
241
|
-
end: "2026-03-15",
|
|
242
|
-
});
|
|
243
|
-
expect(result.valid).toBe(false);
|
|
244
|
-
expect(result.errors.some((e) => e.message.includes("after start"))).toBe(true);
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
// ---------------------------------------------------------------------------
|
|
248
|
-
// parseSortParam
|
|
249
|
-
// ---------------------------------------------------------------------------
|
|
250
|
-
describe("parseSortParam", () => {
|
|
251
|
-
const allowedFields = ["createdAt", "startsAt", "status"];
|
|
252
|
-
it("parses ascending sort", () => {
|
|
253
|
-
const result = parseSortParam("startsAt", allowedFields);
|
|
254
|
-
expect(result).toEqual({ field: "startsAt", direction: "asc" });
|
|
255
|
-
});
|
|
256
|
-
it("parses descending sort with leading minus", () => {
|
|
257
|
-
const result = parseSortParam("-createdAt", allowedFields);
|
|
258
|
-
expect(result).toEqual({ field: "createdAt", direction: "desc" });
|
|
259
|
-
});
|
|
260
|
-
it("returns null for invalid field", () => {
|
|
261
|
-
expect(parseSortParam("unknownField", allowedFields)).toBeNull();
|
|
262
|
-
});
|
|
263
|
-
it("returns null for undefined input", () => {
|
|
264
|
-
expect(parseSortParam(undefined, allowedFields)).toBeNull();
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
// ---------------------------------------------------------------------------
|
|
268
|
-
// API_ERROR_CODES
|
|
269
|
-
// ---------------------------------------------------------------------------
|
|
270
|
-
describe("API_ERROR_CODES", () => {
|
|
271
|
-
it("exports all standard error codes", () => {
|
|
272
|
-
expect(API_ERROR_CODES.NOT_FOUND).toBe("NOT_FOUND");
|
|
273
|
-
expect(API_ERROR_CODES.UNAUTHORIZED).toBe("UNAUTHORIZED");
|
|
274
|
-
expect(API_ERROR_CODES.FORBIDDEN).toBe("FORBIDDEN");
|
|
275
|
-
expect(API_ERROR_CODES.VALIDATION_ERROR).toBe("VALIDATION_ERROR");
|
|
276
|
-
expect(API_ERROR_CODES.RATE_LIMITED).toBe("RATE_LIMITED");
|
|
277
|
-
expect(API_ERROR_CODES.CONFLICT).toBe("CONFLICT");
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
//# sourceMappingURL=api.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":""}
|