recal-sdk 0.2.0 → 0.2.1
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 +27 -27
- package/dist/entities/organization.d.ts +2 -2
- package/dist/entities/organization.d.ts.map +1 -1
- package/dist/entities/organization.js +32 -0
- package/dist/entities/organization.js.map +1 -0
- package/dist/entities/user.d.ts +2 -2
- package/dist/entities/user.d.ts.map +1 -1
- package/dist/entities/user.js +45 -0
- package/dist/entities/user.js.map +1 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -7092
- package/dist/index.js.map +1 -1
- package/dist/services/calendar.service.d.ts +2 -2
- package/dist/services/calendar.service.d.ts.map +1 -1
- package/dist/services/calendar.service.js +292 -0
- package/dist/services/calendar.service.js.map +1 -0
- package/dist/services/oauth.service.js +168 -0
- package/dist/services/oauth.service.js.map +1 -0
- package/dist/services/organizations.service.d.ts +1 -1
- package/dist/services/organizations.service.d.ts.map +1 -1
- package/dist/services/organizations.service.js +132 -0
- package/dist/services/organizations.service.js.map +1 -0
- package/dist/services/scheduling.service.d.ts +2 -2
- package/dist/services/scheduling.service.d.ts.map +1 -1
- package/dist/services/scheduling.service.js +122 -0
- package/dist/services/scheduling.service.js.map +1 -0
- package/dist/services/users.service.js +93 -0
- package/dist/services/users.service.js.map +1 -0
- package/dist/typebox/calendar.tb.d.ts +5 -4
- package/dist/typebox/calendar.tb.d.ts.map +1 -1
- package/dist/typebox/calendar.tb.js +92 -0
- package/dist/typebox/calendar.tb.js.map +1 -0
- package/dist/typebox/oauth.tb.d.ts +2 -2
- package/dist/typebox/oauth.tb.js +16 -0
- package/dist/typebox/oauth.tb.js.map +1 -0
- package/dist/typebox/organization.stripped.tb.js +7 -0
- package/dist/typebox/organization.stripped.tb.js.map +1 -0
- package/dist/typebox/organization.tb.js +8 -0
- package/dist/typebox/organization.tb.js.map +1 -0
- package/dist/typebox/scheduling.tb.js +118 -0
- package/dist/typebox/scheduling.tb.js.map +1 -0
- package/dist/typebox/timeString.tb.js +7 -0
- package/dist/typebox/timeString.tb.js.map +1 -0
- package/dist/typebox/user.stripped.tb.js +6 -0
- package/dist/typebox/user.stripped.tb.js.map +1 -0
- package/dist/typebox/user.tb.d.ts +1 -1
- package/dist/typebox/user.tb.js +10 -0
- package/dist/typebox/user.tb.js.map +1 -0
- package/dist/types/calendar.types.d.ts +2 -4
- package/dist/types/calendar.types.d.ts.map +1 -1
- package/dist/types/calendar.types.js +27 -56
- package/dist/types/calendar.types.js.map +1 -1
- package/dist/types/internal.types.js +2 -0
- package/dist/types/internal.types.js.map +1 -0
- package/dist/types/oauth.types.d.ts +1 -1
- package/dist/types/oauth.types.d.ts.map +1 -1
- package/dist/types/oauth.types.js +2 -0
- package/dist/types/oauth.types.js.map +1 -0
- package/dist/types/scheduling.types.js +2 -0
- package/dist/types/scheduling.types.js.map +1 -0
- package/dist/utils/fetch.helper.d.ts +1 -1
- package/dist/utils/fetch.helper.d.ts.map +1 -1
- package/dist/utils/fetch.helper.js +93 -0
- package/dist/utils/fetch.helper.js.map +1 -0
- package/dist/utils/fetchErrorHandler.js +32 -0
- package/dist/utils/fetchErrorHandler.js.map +1 -0
- package/dist/utils/functionize.js +6 -0
- package/dist/utils/functionize.js.map +1 -0
- package/dist/utils/includes.helper.js +10 -0
- package/dist/utils/includes.helper.js.map +1 -0
- package/dist/utils/omit.js +4 -0
- package/dist/utils/omit.js.map +1 -0
- package/package.json +7 -5
package/README.md
CHANGED
|
@@ -92,7 +92,7 @@ const busyFiltered = await recal.calendar.getBusy(
|
|
|
92
92
|
new Date('2024-01-01'),
|
|
93
93
|
new Date('2024-01-07'),
|
|
94
94
|
{
|
|
95
|
-
provider:
|
|
95
|
+
provider: 'google', // optional: filter by provider
|
|
96
96
|
timeZone: 'America/New_York', // optional: timezone
|
|
97
97
|
}
|
|
98
98
|
)
|
|
@@ -114,7 +114,7 @@ const eventsFiltered = await recal.calendar.getEvents(
|
|
|
114
114
|
new Date('2024-01-01'),
|
|
115
115
|
new Date('2024-01-31'),
|
|
116
116
|
{
|
|
117
|
-
provider:
|
|
117
|
+
provider: 'google', // optional: filter by provider
|
|
118
118
|
timeZone: 'Europe/London' // optional: timezone
|
|
119
119
|
}
|
|
120
120
|
)
|
|
@@ -126,7 +126,7 @@ const eventsFiltered = await recal.calendar.getEvents(
|
|
|
126
126
|
// Create a new event (without optional timezone)
|
|
127
127
|
const event = await recal.calendar.createEvent({
|
|
128
128
|
userId: 'user_id',
|
|
129
|
-
provider:
|
|
129
|
+
provider: 'google',
|
|
130
130
|
calendarId: 'calendar_id',
|
|
131
131
|
event: {
|
|
132
132
|
subject: 'Team Meeting',
|
|
@@ -142,7 +142,7 @@ const event = await recal.calendar.createEvent({
|
|
|
142
142
|
// Or with timezone option
|
|
143
143
|
const eventWithTZ = await recal.calendar.createEvent({
|
|
144
144
|
userId: 'user_id',
|
|
145
|
-
provider:
|
|
145
|
+
provider: 'google',
|
|
146
146
|
calendarId: 'calendar_id',
|
|
147
147
|
event: {
|
|
148
148
|
subject: 'Team Meeting',
|
|
@@ -162,7 +162,7 @@ const eventWithTZ = await recal.calendar.createEvent({
|
|
|
162
162
|
// Get an existing event
|
|
163
163
|
const event = await recal.calendar.getEvent({
|
|
164
164
|
userId: 'user_id',
|
|
165
|
-
provider:
|
|
165
|
+
provider: 'google',
|
|
166
166
|
calendarId: 'calendar_id',
|
|
167
167
|
eventId: 'event_id',
|
|
168
168
|
options: { timeZone: 'Europe/Berlin' } // optional
|
|
@@ -175,7 +175,7 @@ const event = await recal.calendar.getEvent({
|
|
|
175
175
|
// Update an existing event (simplest form)
|
|
176
176
|
const updated = await recal.calendar.updateEvent({
|
|
177
177
|
userId: 'user_id',
|
|
178
|
-
provider:
|
|
178
|
+
provider: 'google',
|
|
179
179
|
calendarId: 'calendar_id',
|
|
180
180
|
eventId: 'event_id',
|
|
181
181
|
event: {
|
|
@@ -190,7 +190,7 @@ const updated = await recal.calendar.updateEvent({
|
|
|
190
190
|
// or with more options
|
|
191
191
|
const updated = await recal.calendar.updateEvent({
|
|
192
192
|
userId: 'user_id',
|
|
193
|
-
provider:
|
|
193
|
+
provider: 'google',
|
|
194
194
|
calendarId: 'calendar_id',
|
|
195
195
|
eventId: 'event_id',
|
|
196
196
|
event: {
|
|
@@ -212,7 +212,7 @@ const updated = await recal.calendar.updateEvent({
|
|
|
212
212
|
// Delete an event
|
|
213
213
|
await recal.calendar.deleteEvent({
|
|
214
214
|
userId: 'user_id',
|
|
215
|
-
provider:
|
|
215
|
+
provider: 'google',
|
|
216
216
|
calendarId: 'calendar_id',
|
|
217
217
|
eventId: 'event_id'
|
|
218
218
|
})
|
|
@@ -242,7 +242,7 @@ const metaEventSpecific = await recal.calendar.createEventByMetaId(
|
|
|
242
242
|
end: new Date('2024-01-20T16:00:00Z')
|
|
243
243
|
},
|
|
244
244
|
{
|
|
245
|
-
provider: [
|
|
245
|
+
provider: ['google', 'microsoft'], // Create on specific providers
|
|
246
246
|
timeZone: 'Europe/Berlin' // optional
|
|
247
247
|
}
|
|
248
248
|
)
|
|
@@ -292,7 +292,7 @@ const availabilityDetailed = await recal.scheduling.userSchedulingBasic(
|
|
|
292
292
|
padding: 0, // Padding between slots
|
|
293
293
|
earliestTimeEachDay: '09:00', // Format: HH:mm
|
|
294
294
|
latestTimeEachDay: '17:00', // Format: HH:mm
|
|
295
|
-
provider:
|
|
295
|
+
provider: 'google', // optional: filter by provider
|
|
296
296
|
timeZone: 'America/New_York' // optional
|
|
297
297
|
}
|
|
298
298
|
)
|
|
@@ -329,7 +329,7 @@ const availabilityDetailed = await recal.scheduling.userSchedulingAdvanced(
|
|
|
329
329
|
{
|
|
330
330
|
slotDuration: 30,
|
|
331
331
|
padding: 15,
|
|
332
|
-
provider:
|
|
332
|
+
provider: 'google', // optional
|
|
333
333
|
timeZone: 'America/New_York' // optional
|
|
334
334
|
}
|
|
335
335
|
)
|
|
@@ -356,7 +356,7 @@ const orgAvailabilityConstrained = await recal.scheduling.getOrgWideAvailability
|
|
|
356
356
|
padding: 0,
|
|
357
357
|
earliestTimeEachDay: '09:00',
|
|
358
358
|
latestTimeEachDay: '17:00',
|
|
359
|
-
provider: [
|
|
359
|
+
provider: ['google', 'microsoft'], // optional
|
|
360
360
|
timeZone: 'America/New_York' // optional
|
|
361
361
|
}
|
|
362
362
|
)
|
|
@@ -490,7 +490,7 @@ const teamBusyFiltered = await recal.calendar.getOrgWideBusy(
|
|
|
490
490
|
new Date('2024-01-20'),
|
|
491
491
|
true, // primaryOnly: only check primary calendars
|
|
492
492
|
{
|
|
493
|
-
provider:
|
|
493
|
+
provider: 'google', // optional: filter by provider
|
|
494
494
|
timeZone: 'America/New_York' // optional
|
|
495
495
|
}
|
|
496
496
|
)
|
|
@@ -504,13 +504,13 @@ const teamBusyFiltered = await recal.calendar.getOrgWideBusy(
|
|
|
504
504
|
// Get OAuth authorization URL (with defaults)
|
|
505
505
|
const link = await recal.oauth.getLink(
|
|
506
506
|
'user_id',
|
|
507
|
-
|
|
507
|
+
'google'
|
|
508
508
|
)
|
|
509
509
|
|
|
510
510
|
// Or with custom options
|
|
511
511
|
const linkWithOptions = await recal.oauth.getLink(
|
|
512
512
|
'user_id',
|
|
513
|
-
|
|
513
|
+
'google',
|
|
514
514
|
{
|
|
515
515
|
scope: 'edit', // 'edit' or 'free-busy' (for OAuth scopes)
|
|
516
516
|
accessType: 'offline', // 'offline' or 'online'
|
|
@@ -530,7 +530,7 @@ const links = await recal.oauth.getBulkLinks('user_id')
|
|
|
530
530
|
const linksFiltered = await recal.oauth.getBulkLinks(
|
|
531
531
|
'user_id',
|
|
532
532
|
{
|
|
533
|
-
provider: [
|
|
533
|
+
provider: ['google', 'microsoft'],
|
|
534
534
|
scope: 'edit',
|
|
535
535
|
accessType: 'offline'
|
|
536
536
|
}
|
|
@@ -549,14 +549,14 @@ const connections = await recal.oauth.getAllConnections(
|
|
|
549
549
|
// Get specific provider connection
|
|
550
550
|
const googleConnection = await recal.oauth.getConnection(
|
|
551
551
|
'user_id',
|
|
552
|
-
|
|
552
|
+
'google',
|
|
553
553
|
false // redacted
|
|
554
554
|
)
|
|
555
555
|
|
|
556
556
|
// Set OAuth tokens manually
|
|
557
557
|
const connection = await recal.oauth.setConnection(
|
|
558
558
|
'user_id',
|
|
559
|
-
|
|
559
|
+
'google',
|
|
560
560
|
{
|
|
561
561
|
accessToken: 'access_token',
|
|
562
562
|
refreshToken: 'refresh_token', // optional
|
|
@@ -567,7 +567,7 @@ const connection = await recal.oauth.setConnection(
|
|
|
567
567
|
)
|
|
568
568
|
|
|
569
569
|
// Disconnect a provider
|
|
570
|
-
await recal.oauth.disconnect('user_id',
|
|
570
|
+
await recal.oauth.disconnect('user_id', 'google')
|
|
571
571
|
```
|
|
572
572
|
|
|
573
573
|
#### Verify OAuth Callback
|
|
@@ -575,7 +575,7 @@ await recal.oauth.disconnect('user_id', Provider.GOOGLE)
|
|
|
575
575
|
```typescript
|
|
576
576
|
// Verify OAuth code from callback
|
|
577
577
|
const result = await recal.oauth.verify(
|
|
578
|
-
|
|
578
|
+
'google',
|
|
579
579
|
'auth_code_from_callback',
|
|
580
580
|
'edit', // 'edit' or 'free-busy' - single scope, not array
|
|
581
581
|
'state_parameter',
|
|
@@ -600,7 +600,7 @@ import {
|
|
|
600
600
|
try {
|
|
601
601
|
const event = await recal.calendar.getEvent({
|
|
602
602
|
userId: 'user_id',
|
|
603
|
-
provider:
|
|
603
|
+
provider: 'google',
|
|
604
604
|
calendarId: 'calendar_id',
|
|
605
605
|
eventId: 'event_id'
|
|
606
606
|
})
|
|
@@ -645,7 +645,7 @@ const allBusy = await recal.calendar.getBusy(
|
|
|
645
645
|
)
|
|
646
646
|
|
|
647
647
|
// Or aggregate by specific providers
|
|
648
|
-
const providers: Provider[] = [
|
|
648
|
+
const providers: Provider[] = ['google', 'microsoft']
|
|
649
649
|
const busyTimes = await Promise.all(
|
|
650
650
|
providers.map(provider =>
|
|
651
651
|
recal.calendar.getBusy(
|
|
@@ -702,7 +702,7 @@ const clientEmail = 'john@example.com'
|
|
|
702
702
|
// 4. Create an event for the selected slot (using calendar service)
|
|
703
703
|
const booking = await recal.calendar.createEvent({
|
|
704
704
|
userId: 'consultant_id',
|
|
705
|
-
provider:
|
|
705
|
+
provider: 'google',
|
|
706
706
|
calendarId: 'primary',
|
|
707
707
|
event: {
|
|
708
708
|
subject: 'Consultation with ' + clientName,
|
|
@@ -734,7 +734,7 @@ async function syncCalendars(userId: string) {
|
|
|
734
734
|
userId,
|
|
735
735
|
new Date(),
|
|
736
736
|
new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
|
|
737
|
-
{ provider:
|
|
737
|
+
{ provider: 'google' }
|
|
738
738
|
)
|
|
739
739
|
|
|
740
740
|
// Copy to Microsoft calendar
|
|
@@ -742,7 +742,7 @@ async function syncCalendars(userId: string) {
|
|
|
742
742
|
if (!event.metaId) { // Not already synced
|
|
743
743
|
await recal.calendar.createEvent({
|
|
744
744
|
userId,
|
|
745
|
-
provider:
|
|
745
|
+
provider: 'microsoft',
|
|
746
746
|
calendarId: 'primary',
|
|
747
747
|
event: {
|
|
748
748
|
subject: event.subject,
|
|
@@ -798,9 +798,9 @@ async function findTeamSlot(
|
|
|
798
798
|
|
|
799
799
|
### Prerequisites
|
|
800
800
|
|
|
801
|
-
- Node.js 18+ or Bun 1.0
|
|
801
|
+
- Node.js 18+ or Bun 1.0+, or any other JavaScript runtime
|
|
802
802
|
- TypeScript 5.0+
|
|
803
|
-
- Biome 2.1.2 (
|
|
803
|
+
- Biome 2.1.2 (for contributing)
|
|
804
804
|
|
|
805
805
|
### Setup
|
|
806
806
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Static } from '@sinclair/typebox';
|
|
2
|
-
import type { organizationSchema } from '
|
|
2
|
+
import type { organizationSchema } from '../typebox/organization.tb';
|
|
3
3
|
import type { FetchHelper } from '../utils/fetch.helper';
|
|
4
4
|
import { User } from './user';
|
|
5
5
|
export declare class Organization {
|
|
6
|
-
private fetchHelper;
|
|
6
|
+
private readonly fetchHelper;
|
|
7
7
|
slug: string;
|
|
8
8
|
name: string | null;
|
|
9
9
|
createdAt: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../src/entities/organization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../src/entities/organization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,OAAO,CAAC,EAAE,IAAI,EAAE,CAAA;gBAEX,EACR,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,WAAW,GACd,EAAE;QACC,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,SAAS,EAAE,IAAI,CAAA;QACf,OAAO,CAAC,EAAE,IAAI,EAAE,CAAA;QAChB,WAAW,EAAE,WAAW,CAAA;KAC3B;IAQD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,kBAAkB,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY;IAQnF,UAAU,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;CAQ5D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { OrganizationsService } from '../services/organizations.service.js';
|
|
2
|
+
import { User } from './user.js';
|
|
3
|
+
export class Organization {
|
|
4
|
+
fetchHelper;
|
|
5
|
+
slug;
|
|
6
|
+
name;
|
|
7
|
+
createdAt;
|
|
8
|
+
members;
|
|
9
|
+
constructor({ slug, name, createdAt, members, fetchHelper, }) {
|
|
10
|
+
this.slug = slug;
|
|
11
|
+
this.name = name;
|
|
12
|
+
this.createdAt = createdAt;
|
|
13
|
+
this.members = members;
|
|
14
|
+
this.fetchHelper = fetchHelper;
|
|
15
|
+
}
|
|
16
|
+
static fromJson(json, fetchHelper) {
|
|
17
|
+
return new Organization({
|
|
18
|
+
...json,
|
|
19
|
+
members: json.members?.map((member) => User.fromJson(member, fetchHelper)),
|
|
20
|
+
fetchHelper,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async getMembers(refetch = false) {
|
|
24
|
+
if (refetch) {
|
|
25
|
+
const organizationsService = new OrganizationsService(this.fetchHelper);
|
|
26
|
+
const newData = await organizationsService.getMembers(this.slug);
|
|
27
|
+
this.members = newData;
|
|
28
|
+
}
|
|
29
|
+
return this.members ?? [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=organization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization.js","sourceRoot":"","sources":["../../src/entities/organization.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAGvE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,MAAM,OAAO,YAAY;IACJ,WAAW,CAAa;IAClC,IAAI,CAAQ;IACZ,IAAI,CAAe;IACnB,SAAS,CAAM;IACf,OAAO,CAAS;IAEvB,YAAY,EACR,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,WAAW,GAOd;QACG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAuC,EAAE,WAAwB;QAC7E,OAAO,IAAI,YAAY,CAAC;YACpB,GAAG,IAAI;YACP,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1E,WAAW;SACd,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,KAAK;QACnC,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACvE,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;IAC7B,CAAC;CACJ"}
|
package/dist/entities/user.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Static } from '@sinclair/typebox';
|
|
2
|
-
import type { userSchema } from '
|
|
2
|
+
import type { userSchema } from '../typebox/user.tb';
|
|
3
3
|
import type { OAuthConnection } from '../types/oauth.types';
|
|
4
4
|
import type { FetchHelper } from '../utils/fetch.helper';
|
|
5
5
|
import { Organization } from './organization';
|
|
6
6
|
export declare class User {
|
|
7
|
-
private fetchHelper;
|
|
7
|
+
private readonly fetchHelper;
|
|
8
8
|
id: string;
|
|
9
9
|
createdAt: Date;
|
|
10
10
|
organizations?: Organization[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,qBAAa,IAAI;IACb,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,IAAI,CAAA;IACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;gBAE/B,EACR,EAAE,EACF,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,WAAW,GACd,EAAE;QACC,EAAE,EAAE,MAAM,CAAA;QACV,SAAS,EAAE,IAAI,CAAA;QACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;QAC9B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;QACpC,WAAW,EAAE,WAAW,CAAA;KAC3B;IAQD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,UAAU,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IASnE,gBAAgB,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAU1D,mBAAmB,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAQhF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { UserNotFoundError } from '../errors.js';
|
|
2
|
+
import { OAuthService } from '../services/oauth.service.js';
|
|
3
|
+
import { OrganizationsService } from '../services/organizations.service.js';
|
|
4
|
+
import { Organization } from './organization.js';
|
|
5
|
+
export class User {
|
|
6
|
+
fetchHelper;
|
|
7
|
+
id;
|
|
8
|
+
createdAt;
|
|
9
|
+
organizations;
|
|
10
|
+
oauthConnections;
|
|
11
|
+
constructor({ id, createdAt, organizations, oauthConnections, fetchHelper, }) {
|
|
12
|
+
this.id = id;
|
|
13
|
+
this.createdAt = createdAt;
|
|
14
|
+
this.organizations = organizations;
|
|
15
|
+
this.oauthConnections = oauthConnections;
|
|
16
|
+
this.fetchHelper = fetchHelper;
|
|
17
|
+
}
|
|
18
|
+
static fromJson(json, fetchHelper) {
|
|
19
|
+
return new User({
|
|
20
|
+
...json,
|
|
21
|
+
organizations: json.organizations?.map((org) => Organization.fromJson(org, fetchHelper)),
|
|
22
|
+
oauthConnections: json.oauthConnections,
|
|
23
|
+
fetchHelper,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async getOrganizations(refetch = false) {
|
|
27
|
+
if (this.organizations === undefined || refetch) {
|
|
28
|
+
const organizationsService = new OrganizationsService(this.fetchHelper);
|
|
29
|
+
const orgs = await organizationsService.listAllFromUser(this.id);
|
|
30
|
+
if (!orgs)
|
|
31
|
+
throw new UserNotFoundError(this.id);
|
|
32
|
+
this.organizations = orgs;
|
|
33
|
+
}
|
|
34
|
+
return this.organizations ?? [];
|
|
35
|
+
}
|
|
36
|
+
async getOAuthConnections(refetch = false) {
|
|
37
|
+
if (this.oauthConnections === undefined || refetch) {
|
|
38
|
+
const oauthService = new OAuthService(this.fetchHelper);
|
|
39
|
+
const connections = await oauthService.getAllConnections(this.id);
|
|
40
|
+
this.oauthConnections = connections;
|
|
41
|
+
}
|
|
42
|
+
return this.oauthConnections ?? [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/entities/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAIvE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,OAAO,IAAI;IACI,WAAW,CAAa;IAClC,EAAE,CAAQ;IACV,SAAS,CAAM;IACf,aAAa,CAAiB;IAC9B,gBAAgB,CAAoB;IAE3C,YAAY,EACR,EAAE,EACF,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,WAAW,GAOd;QACG,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QACxC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAA+B,EAAE,WAAwB;QACrE,OAAO,IAAI,IAAI,CAAC;YACZ,GAAG,IAAI;YACP,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACxF,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,WAAW;SACd,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,KAAK;QACzC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YAC9C,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACvE,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAChE,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC/C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,IAAI,EAAE,CAAA;IACnC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,OAAO,GAAG,KAAK;QAC5C,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YACjD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACvD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACjE,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAA;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAA;IACtC,CAAC;CACJ"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export class OrganizationNotFoundError extends Error {
|
|
2
|
+
constructor(slug) {
|
|
3
|
+
super(`[Recal] Organization ${slug} not found`);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export class OrganizationAlreadyExistsError extends Error {
|
|
7
|
+
constructor(slug) {
|
|
8
|
+
super(`[Recal] Organization ${slug} already exists`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class UserAlreadyExistsError extends Error {
|
|
12
|
+
constructor(userId) {
|
|
13
|
+
super(`[Recal] User ${userId} already exists`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class UserNotFoundError extends Error {
|
|
17
|
+
constructor(userId) {
|
|
18
|
+
super(`[Recal] User ${userId} not found`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class ProviderCredentialsNotSetError extends Error {
|
|
22
|
+
constructor(provider) {
|
|
23
|
+
super(`[Recal] Provider ${provider} credentials not set`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class OAuthConnectionNotFoundError extends Error {
|
|
27
|
+
constructor(userId, provider) {
|
|
28
|
+
super(`[Recal] OAuth connection not found for user ${userId} and provider ${provider}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class EventNotFoundError extends Error {
|
|
32
|
+
constructor(eventId) {
|
|
33
|
+
super(`[Recal] Event ${eventId} not found`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAChD,YAAmB,IAAY;QAC3B,KAAK,CAAC,wBAAwB,IAAI,YAAY,CAAC,CAAA;IACnD,CAAC;CACJ;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACrD,YAAmB,IAAY;QAC3B,KAAK,CAAC,wBAAwB,IAAI,iBAAiB,CAAC,CAAA;IACxD,CAAC;CACJ;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC7C,YAAmB,MAAc;QAC7B,KAAK,CAAC,gBAAgB,MAAM,iBAAiB,CAAC,CAAA;IAClD,CAAC;CACJ;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACxC,YAAmB,MAAc;QAC7B,KAAK,CAAC,gBAAgB,MAAM,YAAY,CAAC,CAAA;IAC7C,CAAC;CACJ;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACrD,YAAmB,QAAgB;QAC/B,KAAK,CAAC,oBAAoB,QAAQ,sBAAsB,CAAC,CAAA;IAC7D,CAAC;CACJ;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACnD,YAAmB,MAAc,EAAE,QAAgB;QAC/C,KAAK,CAAC,+CAA+C,MAAM,iBAAiB,QAAQ,EAAE,CAAC,CAAA;IAC3F,CAAC;CACJ;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzC,YAAmB,OAAe;QAC9B,KAAK,CAAC,iBAAiB,OAAO,YAAY,CAAC,CAAA;IAC/C,CAAC;CACJ"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,8 +6,8 @@ import { UsersService } from './services/users.service';
|
|
|
6
6
|
import type { RecalOptions } from './types/internal.types';
|
|
7
7
|
/**
|
|
8
8
|
* Recal SDK
|
|
9
|
-
* @description Recal SDK for
|
|
10
|
-
* @version 0.
|
|
9
|
+
* @description Recal SDK for JavaScript/TypeScript
|
|
10
|
+
* @version 0.2.0
|
|
11
11
|
* @author Recal <team@recal.dev>
|
|
12
12
|
* @license MIT
|
|
13
13
|
*/
|
|
@@ -26,8 +26,7 @@ export * from './entities/organization';
|
|
|
26
26
|
export * from './entities/user';
|
|
27
27
|
export * from './errors';
|
|
28
28
|
export * from './types/calendar.types';
|
|
29
|
-
export
|
|
29
|
+
export type { RecalOptions, RecalOptions as RecalClientOptions } from './types/internal.types';
|
|
30
30
|
export * from './types/oauth.types';
|
|
31
|
-
export
|
|
32
|
-
export type { RecalOptions as RecalClientOptions } from './types/internal.types';
|
|
31
|
+
export * from './types/scheduling.types';
|
|
33
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAI1D;;;;;;GAMG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAa;IAGhC,KAAK,EAAE,YAAY,CAAA;IACnB,aAAa,EAAE,oBAAoB,CAAA;IACnC,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,iBAAiB,CAAA;gBAEV,OAAO,CAAC,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAI1D;;;;;;GAMG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAa;IAGhC,KAAK,EAAE,YAAY,CAAA;IACnB,aAAa,EAAE,oBAAoB,CAAA;IACnC,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,iBAAiB,CAAA;gBAEV,OAAO,CAAC,EAAE,YAAY;CAiB5C;AAED,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AAExB,cAAc,wBAAwB,CAAA;AACtC,YAAY,EAAE,YAAY,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA"}
|