@soulbatical/tetra-core 0.1.39 → 0.1.41

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.

Potentially problematic release.


This version of @soulbatical/tetra-core might be problematic. Click here for more details.

Files changed (56) hide show
  1. package/dist/core/dualWriteProxy.d.ts +11 -0
  2. package/dist/core/dualWriteProxy.d.ts.map +1 -1
  3. package/dist/core/dualWriteProxy.js +142 -198
  4. package/dist/core/dualWriteProxy.js.map +1 -1
  5. package/dist/index.d.ts +4 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/shared/email/EmailService.d.ts +9 -1
  10. package/dist/shared/email/EmailService.d.ts.map +1 -1
  11. package/dist/shared/email/EmailService.js +83 -7
  12. package/dist/shared/email/EmailService.js.map +1 -1
  13. package/dist/shared/email/adminRoutes.d.ts +30 -0
  14. package/dist/shared/email/adminRoutes.d.ts.map +1 -0
  15. package/dist/shared/email/adminRoutes.js +227 -0
  16. package/dist/shared/email/adminRoutes.js.map +1 -0
  17. package/dist/shared/email/index.d.ts +3 -1
  18. package/dist/shared/email/index.d.ts.map +1 -1
  19. package/dist/shared/email/index.js +3 -0
  20. package/dist/shared/email/index.js.map +1 -1
  21. package/dist/shared/email/mailgun.d.ts +4 -1
  22. package/dist/shared/email/mailgun.d.ts.map +1 -1
  23. package/dist/shared/email/mailgun.js +41 -10
  24. package/dist/shared/email/mailgun.js.map +1 -1
  25. package/dist/shared/email/smtp.d.ts +4 -1
  26. package/dist/shared/email/smtp.d.ts.map +1 -1
  27. package/dist/shared/email/smtp.js +14 -2
  28. package/dist/shared/email/smtp.js.map +1 -1
  29. package/dist/shared/email/types.d.ts +23 -1
  30. package/dist/shared/email/types.d.ts.map +1 -1
  31. package/dist/shared/email/webhookRoutes.d.ts +29 -0
  32. package/dist/shared/email/webhookRoutes.d.ts.map +1 -0
  33. package/dist/shared/email/webhookRoutes.js +125 -0
  34. package/dist/shared/email/webhookRoutes.js.map +1 -0
  35. package/dist/shared/planner/GoogleCalendarService.d.ts +103 -0
  36. package/dist/shared/planner/GoogleCalendarService.d.ts.map +1 -0
  37. package/dist/shared/planner/GoogleCalendarService.js +365 -0
  38. package/dist/shared/planner/GoogleCalendarService.js.map +1 -0
  39. package/dist/shared/planner/PlannerService.d.ts +170 -0
  40. package/dist/shared/planner/PlannerService.d.ts.map +1 -0
  41. package/dist/shared/planner/PlannerService.js +860 -0
  42. package/dist/shared/planner/PlannerService.js.map +1 -0
  43. package/dist/shared/planner/index.d.ts +35 -0
  44. package/dist/shared/planner/index.d.ts.map +1 -0
  45. package/dist/shared/planner/index.js +34 -0
  46. package/dist/shared/planner/index.js.map +1 -0
  47. package/dist/shared/planner/routes.d.ts +67 -0
  48. package/dist/shared/planner/routes.d.ts.map +1 -0
  49. package/dist/shared/planner/routes.js +524 -0
  50. package/dist/shared/planner/routes.js.map +1 -0
  51. package/dist/shared/planner/types.d.ts +262 -0
  52. package/dist/shared/planner/types.d.ts.map +1 -0
  53. package/dist/shared/planner/types.js +9 -0
  54. package/dist/shared/planner/types.js.map +1 -0
  55. package/package.json +1 -1
  56. package/src/shared/email/migrations/004_add_email_logs_tracking_columns.sql +15 -0
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Planner Module — Types
3
+ *
4
+ * Configuration and data types for the Tetra Planner module.
5
+ * Handles: availability, appointments, vacations, scheduler settings,
6
+ * Google Calendar integration, and public booking.
7
+ */
8
+ import type { SupabaseClient } from '@supabase/supabase-js';
9
+ export interface PlannerConfig {
10
+ /**
11
+ * Role name for the resource owner (the person who has an agenda).
12
+ * Examples: 'coach', 'consultant', 'therapist', 'agent'
13
+ * Used for permission checks and owner identification.
14
+ */
15
+ ownerRole: string;
16
+ /**
17
+ * Table name for the owner entity (default: 'users_public').
18
+ */
19
+ ownerTable?: string;
20
+ /**
21
+ * Column on the owner table that holds the organization ID.
22
+ * Default: 'active_organization_id'
23
+ */
24
+ ownerOrgColumn?: string;
25
+ /**
26
+ * Optional parent resource that appointments can be linked to.
27
+ * Example: { table: 'tracks', foreignKey: 'coach_id', label: 'Traject' }
28
+ * If set, appointments can be linked to a parent record (e.g., a coaching track).
29
+ */
30
+ parentResource?: {
31
+ table: string;
32
+ foreignKey: string;
33
+ /** Column on the parent table for the client/assignee (for auto-linking public bookings) */
34
+ clientKey?: string;
35
+ /** Human-readable label for the parent (default: table name) */
36
+ label?: string;
37
+ };
38
+ /**
39
+ * Default timezone for calendar events.
40
+ * Default: 'Europe/Amsterdam'
41
+ */
42
+ timezone?: string;
43
+ /**
44
+ * Valid appointment types.
45
+ * Default: ['online', 'phone', 'in_person']
46
+ */
47
+ appointmentTypes?: string[];
48
+ /**
49
+ * Valid appointment statuses.
50
+ * Default: ['scheduled', 'completed', 'cancelled']
51
+ */
52
+ appointmentStatuses?: string[];
53
+ /**
54
+ * Default scheduler settings for new owners.
55
+ */
56
+ defaults?: {
57
+ sessionDurationMinutes?: number;
58
+ maxDaysAhead?: number;
59
+ minLeadTimeHours?: number;
60
+ timeIncrementMinutes?: number;
61
+ };
62
+ /**
63
+ * Callback: fired after an appointment is created.
64
+ * Use for sending emails, notifications, etc.
65
+ */
66
+ onAppointmentCreated?: (appointment: AppointmentRecord, context: PlannerCallbackContext) => Promise<void>;
67
+ /**
68
+ * Callback: fired after an appointment is cancelled.
69
+ */
70
+ onAppointmentCancelled?: (appointment: AppointmentRecord, context: PlannerCallbackContext) => Promise<void>;
71
+ /**
72
+ * Callback: fired after an appointment is completed.
73
+ */
74
+ onAppointmentCompleted?: (appointment: AppointmentRecord, context: PlannerCallbackContext) => Promise<void>;
75
+ /**
76
+ * Callback: fired after a public booking is created (unauthenticated).
77
+ * Receives visitor info (name, email, notes).
78
+ */
79
+ onPublicBooking?: (appointment: AppointmentRecord, visitor: PublicBookingVisitor, context: PlannerCallbackContext) => Promise<void>;
80
+ }
81
+ export interface PlannerCallbackContext {
82
+ /** The owner (coach/consultant) user ID */
83
+ ownerId: string;
84
+ /** Organization ID */
85
+ organizationId: string;
86
+ }
87
+ export interface PlannerCalendarConfig {
88
+ google: {
89
+ clientId: string;
90
+ clientSecret: string;
91
+ redirectUri: string;
92
+ };
93
+ /**
94
+ * Default timezone for Google Calendar events.
95
+ * Default: 'Europe/Amsterdam'
96
+ */
97
+ timezone?: string;
98
+ /**
99
+ * OAuth scopes for Google Calendar.
100
+ * Default: ['https://www.googleapis.com/auth/calendar.events', 'https://www.googleapis.com/auth/calendar.readonly']
101
+ */
102
+ scopes?: string[];
103
+ /**
104
+ * Function to get a system-level DB client (bypasses RLS).
105
+ * Default: uses systemDB from tetra-core.
106
+ */
107
+ getSystemDB?: () => Promise<SupabaseClient>;
108
+ }
109
+ export interface PlannerRouteOptions {
110
+ config: PlannerConfig;
111
+ /**
112
+ * Function to get a system-level DB client (for public routes, no auth context).
113
+ * Required for addPlannerPublicRoutes().
114
+ */
115
+ getSystemDB?: () => Promise<SupabaseClient>;
116
+ }
117
+ export interface AvailabilitySlotRecord {
118
+ id: string;
119
+ organizationId: string;
120
+ ownerId: string;
121
+ dayOfWeek: number;
122
+ startTime: string;
123
+ endTime: string;
124
+ isAvailable: boolean;
125
+ createdAt: string;
126
+ updatedAt: string;
127
+ }
128
+ export interface AppointmentRecord {
129
+ id: string;
130
+ organizationId: string;
131
+ parentId: string | null;
132
+ organizerId: string;
133
+ title: string;
134
+ description: string | null;
135
+ startTime: string;
136
+ endTime: string;
137
+ location: string | null;
138
+ type: string;
139
+ status: string;
140
+ attendeeIds: string[];
141
+ googleCalendarEventId: string | null;
142
+ outlookEventId: string | null;
143
+ reminderSentAt: string | null;
144
+ createdAt: string;
145
+ updatedAt: string;
146
+ organizer?: {
147
+ id: string;
148
+ name: string;
149
+ email: string;
150
+ } | null;
151
+ parent?: {
152
+ id: string;
153
+ title: string;
154
+ } | null;
155
+ }
156
+ export interface SchedulerSettingsRecord {
157
+ id: string;
158
+ organizationId: string;
159
+ ownerId: string;
160
+ eventName: string;
161
+ zoomLink: string | null;
162
+ description: string | null;
163
+ sessionDurationMinutes: number;
164
+ maxDaysAhead: number;
165
+ minLeadTimeHours: number;
166
+ timeIncrementMinutes: number;
167
+ createdAt: string;
168
+ updatedAt: string;
169
+ }
170
+ export interface VacationRecord {
171
+ id: string;
172
+ organizationId: string;
173
+ ownerId: string;
174
+ startDate: string;
175
+ endDate: string;
176
+ description: string | null;
177
+ createdAt: string;
178
+ updatedAt: string;
179
+ }
180
+ export interface CalendarTokenRecord {
181
+ id: string;
182
+ userId: string;
183
+ organizationId: string;
184
+ accessToken: string;
185
+ refreshToken: string;
186
+ tokenExpiry: string;
187
+ calendarId: string;
188
+ isActive: boolean;
189
+ createdAt: string;
190
+ updatedAt: string;
191
+ }
192
+ export interface AvailabilitySlotInput {
193
+ dayOfWeek: number;
194
+ startTime: string;
195
+ endTime: string;
196
+ isAvailable?: boolean;
197
+ }
198
+ export interface AppointmentInput {
199
+ title: string;
200
+ parentId?: string;
201
+ description?: string;
202
+ startTime: string;
203
+ endTime: string;
204
+ location?: string;
205
+ type?: string;
206
+ attendeeIds?: string[];
207
+ }
208
+ export interface PublicBookingInput {
209
+ name: string;
210
+ email: string;
211
+ date: string;
212
+ startTime: string;
213
+ endTime: string;
214
+ notes?: string;
215
+ }
216
+ export interface PublicBookingVisitor {
217
+ name: string;
218
+ email: string;
219
+ notes?: string;
220
+ }
221
+ export interface TimeSlot {
222
+ startTime: string;
223
+ endTime: string;
224
+ }
225
+ export interface DayAvailability {
226
+ date: string;
227
+ dayOfWeek: number;
228
+ ownerId: string;
229
+ slots: TimeSlot[];
230
+ sessionDurationMinutes: number;
231
+ }
232
+ export interface TeamAvailability {
233
+ date: string;
234
+ dayOfWeek: number;
235
+ owners: Array<{
236
+ id: string;
237
+ name: string | null;
238
+ avatarUrl: string | null;
239
+ slots: TimeSlot[];
240
+ vacationDay: boolean;
241
+ }>;
242
+ }
243
+ export interface PublicSchedulerData {
244
+ owner: {
245
+ id: string;
246
+ name: string | null;
247
+ avatarUrl: string | null;
248
+ };
249
+ organization: {
250
+ name: string | null;
251
+ };
252
+ settings: {
253
+ eventName: string;
254
+ description: string | null;
255
+ sessionDurationMinutes: number;
256
+ maxDaysAhead: number;
257
+ minLeadTimeHours: number;
258
+ timeIncrementMinutes: number;
259
+ };
260
+ availableDays: number[];
261
+ }
262
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/planner/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Planner Module — Types
3
+ *
4
+ * Configuration and data types for the Tetra Planner module.
5
+ * Handles: availability, appointments, vacations, scheduler settings,
6
+ * Google Calendar integration, and public booking.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/planner/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soulbatical/tetra-core",
3
- "version": "0.1.39",
3
+ "version": "0.1.41",
4
4
  "publishConfig": {
5
5
  "access": "restricted"
6
6
  },
@@ -0,0 +1,15 @@
1
+ -- ============================================
2
+ -- Email Logs — add tracking & categorization columns
3
+ -- Part of @soulbatical/tetra-core email module
4
+ -- ============================================
5
+ -- Adds: email_type, metadata, delivered_at, opened_at, clicked_at
6
+ -- These support Mailgun webhook tracking and email categorization.
7
+
8
+ ALTER TABLE email_logs ADD COLUMN IF NOT EXISTS email_type VARCHAR(100);
9
+ ALTER TABLE email_logs ADD COLUMN IF NOT EXISTS metadata JSONB DEFAULT '{}';
10
+ ALTER TABLE email_logs ADD COLUMN IF NOT EXISTS delivered_at TIMESTAMPTZ;
11
+ ALTER TABLE email_logs ADD COLUMN IF NOT EXISTS opened_at TIMESTAMPTZ;
12
+ ALTER TABLE email_logs ADD COLUMN IF NOT EXISTS clicked_at TIMESTAMPTZ;
13
+
14
+ CREATE INDEX IF NOT EXISTS idx_email_logs_email_type ON email_logs(email_type);
15
+ CREATE INDEX IF NOT EXISTS idx_email_logs_to_email ON email_logs(to_email);