@nativesquare/soma 0.3.0 → 0.5.0

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.
Files changed (101) hide show
  1. package/dist/client/index.d.ts +283 -0
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +328 -0
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/component/_generated/api.d.ts +2 -0
  6. package/dist/component/_generated/api.d.ts.map +1 -1
  7. package/dist/component/_generated/api.js.map +1 -1
  8. package/dist/component/_generated/component.d.ts +77 -0
  9. package/dist/component/_generated/component.d.ts.map +1 -1
  10. package/dist/component/garmin.d.ts +164 -0
  11. package/dist/component/garmin.d.ts.map +1 -0
  12. package/dist/component/garmin.js +609 -0
  13. package/dist/component/garmin.js.map +1 -0
  14. package/dist/component/public.d.ts +761 -761
  15. package/dist/component/schema.d.ts +405 -388
  16. package/dist/component/schema.d.ts.map +1 -1
  17. package/dist/component/schema.js +14 -2
  18. package/dist/component/schema.js.map +1 -1
  19. package/dist/component/strava.d.ts +5 -4
  20. package/dist/component/strava.d.ts.map +1 -1
  21. package/dist/component/strava.js +18 -1
  22. package/dist/component/strava.js.map +1 -1
  23. package/dist/component/validators/activity.d.ts +42 -42
  24. package/dist/component/validators/body.d.ts +47 -47
  25. package/dist/component/validators/daily.d.ts +17 -17
  26. package/dist/component/validators/plannedWorkout.d.ts +5 -5
  27. package/dist/component/validators/samples.d.ts +2 -2
  28. package/dist/component/validators/shared.d.ts +17 -17
  29. package/dist/component/validators/sleep.d.ts +17 -17
  30. package/dist/garmin/activity.d.ts +101 -0
  31. package/dist/garmin/activity.d.ts.map +1 -0
  32. package/dist/garmin/activity.js +207 -0
  33. package/dist/garmin/activity.js.map +1 -0
  34. package/dist/garmin/auth.d.ts +65 -0
  35. package/dist/garmin/auth.d.ts.map +1 -0
  36. package/dist/garmin/auth.js +155 -0
  37. package/dist/garmin/auth.js.map +1 -0
  38. package/dist/garmin/body.d.ts +26 -0
  39. package/dist/garmin/body.d.ts.map +1 -0
  40. package/dist/garmin/body.js +44 -0
  41. package/dist/garmin/body.js.map +1 -0
  42. package/dist/garmin/client.d.ts +99 -0
  43. package/dist/garmin/client.d.ts.map +1 -0
  44. package/dist/garmin/client.js +153 -0
  45. package/dist/garmin/client.js.map +1 -0
  46. package/dist/garmin/daily.d.ts +74 -0
  47. package/dist/garmin/daily.d.ts.map +1 -0
  48. package/dist/garmin/daily.js +143 -0
  49. package/dist/garmin/daily.js.map +1 -0
  50. package/dist/garmin/index.d.ts +20 -0
  51. package/dist/garmin/index.d.ts.map +1 -0
  52. package/dist/garmin/index.js +21 -0
  53. package/dist/garmin/index.js.map +1 -0
  54. package/dist/garmin/maps/activity-type.d.ts +7 -0
  55. package/dist/garmin/maps/activity-type.d.ts.map +1 -0
  56. package/dist/garmin/maps/activity-type.js +98 -0
  57. package/dist/garmin/maps/activity-type.js.map +1 -0
  58. package/dist/garmin/maps/sleep-level.d.ts +6 -0
  59. package/dist/garmin/maps/sleep-level.d.ts.map +1 -0
  60. package/dist/garmin/maps/sleep-level.js +21 -0
  61. package/dist/garmin/maps/sleep-level.js.map +1 -0
  62. package/dist/garmin/menstruation.d.ts +23 -0
  63. package/dist/garmin/menstruation.d.ts.map +1 -0
  64. package/dist/garmin/menstruation.js +34 -0
  65. package/dist/garmin/menstruation.js.map +1 -0
  66. package/dist/garmin/sleep.d.ts +62 -0
  67. package/dist/garmin/sleep.d.ts.map +1 -0
  68. package/dist/garmin/sleep.js +125 -0
  69. package/dist/garmin/sleep.js.map +1 -0
  70. package/dist/garmin/sync.d.ts +39 -0
  71. package/dist/garmin/sync.d.ts.map +1 -0
  72. package/dist/garmin/sync.js +175 -0
  73. package/dist/garmin/sync.js.map +1 -0
  74. package/dist/garmin/types.d.ts +212 -0
  75. package/dist/garmin/types.d.ts.map +1 -0
  76. package/dist/garmin/types.js +8 -0
  77. package/dist/garmin/types.js.map +1 -0
  78. package/dist/validators.d.ts +331 -331
  79. package/package.json +5 -1
  80. package/src/client/index.ts +446 -1
  81. package/src/component/_generated/api.ts +2 -0
  82. package/src/component/_generated/component.ts +89 -0
  83. package/src/component/garmin.ts +711 -0
  84. package/src/component/schema.ts +15 -2
  85. package/src/component/strava.ts +23 -1
  86. package/src/garmin/activity.test.ts +178 -0
  87. package/src/garmin/activity.ts +272 -0
  88. package/src/garmin/auth.test.ts +128 -0
  89. package/src/garmin/auth.ts +249 -0
  90. package/src/garmin/body.ts +59 -0
  91. package/src/garmin/client.ts +254 -0
  92. package/src/garmin/daily.ts +211 -0
  93. package/src/garmin/index.ts +76 -0
  94. package/src/garmin/maps/activity-type.test.ts +78 -0
  95. package/src/garmin/maps/activity-type.ts +116 -0
  96. package/src/garmin/maps/sleep-level.ts +22 -0
  97. package/src/garmin/menstruation.ts +42 -0
  98. package/src/garmin/sleep.test.ts +110 -0
  99. package/src/garmin/sleep.ts +170 -0
  100. package/src/garmin/sync.ts +223 -0
  101. package/src/garmin/types.ts +338 -0
@@ -0,0 +1,609 @@
1
+ // ─── Garmin Component Actions ────────────────────────────────────────────────
2
+ // Public actions that handle the full Garmin OAuth + sync lifecycle.
3
+ // The host app calls these through the Soma class, which threads the
4
+ // credentials automatically from env vars or constructor config.
5
+ //
6
+ // Internal mutations manage the providerTokens table (token CRUD).
7
+ import { v } from "convex/values";
8
+ import { anyApi } from "convex/server";
9
+ import { action, internalMutation, internalQuery, } from "./_generated/server.js";
10
+ import { getRequestToken, getAccessToken } from "../garmin/auth.js";
11
+ import { GarminClient } from "../garmin/client.js";
12
+ import { transformActivity } from "../garmin/activity.js";
13
+ import { transformDaily } from "../garmin/daily.js";
14
+ import { transformSleep } from "../garmin/sleep.js";
15
+ import { transformBody } from "../garmin/body.js";
16
+ import { transformMenstruation } from "../garmin/menstruation.js";
17
+ // Use anyApi to avoid circular type references between this file and _generated/api.ts.
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ const publicApi = anyApi;
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const internalApi = anyApi;
22
+ // Default sync window: last 30 days
23
+ const DEFAULT_SYNC_DAYS = 30;
24
+ // ─── Internal Pending OAuth CRUD ─────────────────────────────────────────────
25
+ // Temporary storage for in-progress Garmin OAuth 1.0a flows.
26
+ // Bridges Step 1 (getGarminRequestToken) and Step 3 (completeGarminOAuth).
27
+ export const storePendingOAuth = internalMutation({
28
+ args: {
29
+ provider: v.string(),
30
+ oauthToken: v.string(),
31
+ tokenSecret: v.string(),
32
+ userId: v.string(),
33
+ },
34
+ returns: v.null(),
35
+ handler: async (ctx, args) => {
36
+ await ctx.db.insert("pendingOAuth", {
37
+ ...args,
38
+ createdAt: Date.now(),
39
+ });
40
+ return null;
41
+ },
42
+ });
43
+ export const getPendingOAuth = internalQuery({
44
+ args: { oauthToken: v.string() },
45
+ returns: v.union(v.object({
46
+ _id: v.id("pendingOAuth"),
47
+ _creationTime: v.number(),
48
+ provider: v.string(),
49
+ oauthToken: v.string(),
50
+ tokenSecret: v.string(),
51
+ userId: v.string(),
52
+ createdAt: v.number(),
53
+ }), v.null()),
54
+ handler: async (ctx, args) => {
55
+ return await ctx.db
56
+ .query("pendingOAuth")
57
+ .withIndex("by_oauthToken", (q) => q.eq("oauthToken", args.oauthToken))
58
+ .first();
59
+ },
60
+ });
61
+ export const deletePendingOAuth = internalMutation({
62
+ args: { oauthToken: v.string() },
63
+ returns: v.null(),
64
+ handler: async (ctx, args) => {
65
+ const pending = await ctx.db
66
+ .query("pendingOAuth")
67
+ .withIndex("by_oauthToken", (q) => q.eq("oauthToken", args.oauthToken))
68
+ .first();
69
+ if (pending) {
70
+ await ctx.db.delete(pending._id);
71
+ }
72
+ return null;
73
+ },
74
+ });
75
+ // ─── Internal Token CRUD ─────────────────────────────────────────────────────
76
+ /**
77
+ * Store OAuth 1.0a tokens for a Garmin connection.
78
+ * Upserts by connectionId — one token record per connection.
79
+ */
80
+ export const storeTokens = internalMutation({
81
+ args: {
82
+ connectionId: v.id("connections"),
83
+ accessToken: v.string(),
84
+ tokenSecret: v.string(),
85
+ },
86
+ returns: v.null(),
87
+ handler: async (ctx, args) => {
88
+ const existing = await ctx.db
89
+ .query("providerTokens")
90
+ .withIndex("by_connectionId", (q) => q.eq("connectionId", args.connectionId))
91
+ .first();
92
+ if (existing) {
93
+ await ctx.db.patch(existing._id, {
94
+ accessToken: args.accessToken,
95
+ tokenSecret: args.tokenSecret,
96
+ });
97
+ return null;
98
+ }
99
+ await ctx.db.insert("providerTokens", {
100
+ connectionId: args.connectionId,
101
+ accessToken: args.accessToken,
102
+ tokenSecret: args.tokenSecret,
103
+ });
104
+ return null;
105
+ },
106
+ });
107
+ /**
108
+ * Get stored tokens for a connection.
109
+ */
110
+ export const getTokens = internalQuery({
111
+ args: { connectionId: v.id("connections") },
112
+ returns: v.union(v.object({
113
+ _id: v.id("providerTokens"),
114
+ _creationTime: v.number(),
115
+ connectionId: v.id("connections"),
116
+ accessToken: v.string(),
117
+ refreshToken: v.optional(v.string()),
118
+ tokenSecret: v.optional(v.string()),
119
+ expiresAt: v.optional(v.number()),
120
+ }), v.null()),
121
+ handler: async (ctx, args) => {
122
+ return await ctx.db
123
+ .query("providerTokens")
124
+ .withIndex("by_connectionId", (q) => q.eq("connectionId", args.connectionId))
125
+ .first();
126
+ },
127
+ });
128
+ /**
129
+ * Delete stored tokens for a connection.
130
+ */
131
+ export const deleteTokens = internalMutation({
132
+ args: { connectionId: v.id("connections") },
133
+ returns: v.null(),
134
+ handler: async (ctx, args) => {
135
+ const existing = await ctx.db
136
+ .query("providerTokens")
137
+ .withIndex("by_connectionId", (q) => q.eq("connectionId", args.connectionId))
138
+ .first();
139
+ if (existing) {
140
+ await ctx.db.delete(existing._id);
141
+ }
142
+ return null;
143
+ },
144
+ });
145
+ // ─── Public Actions ──────────────────────────────────────────────────────────
146
+ /**
147
+ * Step 1 of OAuth: obtain a request token and return the authorization URL.
148
+ *
149
+ * If `userId` is provided, the request token and secret are stored in the
150
+ * component's `pendingOAuth` table so that `completeGarminOAuth` can look
151
+ * them up automatically when the callback fires. This is the recommended
152
+ * flow when using `registerRoutes`.
153
+ *
154
+ * If `userId` is omitted, the host app must store the returned `token`
155
+ * and `tokenSecret` itself and pass them to `connectGarmin` manually.
156
+ */
157
+ export const getGarminRequestToken = action({
158
+ args: {
159
+ consumerKey: v.string(),
160
+ consumerSecret: v.string(),
161
+ callbackUrl: v.optional(v.string()),
162
+ userId: v.optional(v.string()),
163
+ },
164
+ returns: v.object({
165
+ token: v.string(),
166
+ tokenSecret: v.string(),
167
+ authUrl: v.string(),
168
+ }),
169
+ handler: async (ctx, args) => {
170
+ const result = await getRequestToken({
171
+ consumerKey: args.consumerKey,
172
+ consumerSecret: args.consumerSecret,
173
+ callbackUrl: args.callbackUrl,
174
+ });
175
+ if (args.userId) {
176
+ await ctx.runMutation(internalApi.garmin.storePendingOAuth, {
177
+ provider: "GARMIN",
178
+ oauthToken: result.oauthToken,
179
+ tokenSecret: result.oauthTokenSecret,
180
+ userId: args.userId,
181
+ });
182
+ }
183
+ return {
184
+ token: result.oauthToken,
185
+ tokenSecret: result.oauthTokenSecret,
186
+ authUrl: result.authUrl,
187
+ };
188
+ },
189
+ });
190
+ /**
191
+ * Step 3 of OAuth + initial sync.
192
+ *
193
+ * Exchanges the request token + verifier for permanent access tokens,
194
+ * creates/reactivates the Soma connection, stores tokens, and syncs
195
+ * the last 30 days of all data types.
196
+ */
197
+ export const connectGarmin = action({
198
+ args: {
199
+ userId: v.string(),
200
+ consumerKey: v.string(),
201
+ consumerSecret: v.string(),
202
+ token: v.string(),
203
+ tokenSecret: v.string(),
204
+ verifier: v.string(),
205
+ },
206
+ returns: v.object({
207
+ connectionId: v.string(),
208
+ synced: v.object({
209
+ activities: v.number(),
210
+ dailies: v.number(),
211
+ sleep: v.number(),
212
+ body: v.number(),
213
+ menstruation: v.number(),
214
+ }),
215
+ errors: v.array(v.object({ type: v.string(), id: v.string(), error: v.string() })),
216
+ }),
217
+ handler: async (ctx, args) => {
218
+ // 1. Exchange request token for permanent access token
219
+ const accessTokenResult = await getAccessToken({
220
+ consumerKey: args.consumerKey,
221
+ consumerSecret: args.consumerSecret,
222
+ token: args.token,
223
+ tokenSecret: args.tokenSecret,
224
+ verifier: args.verifier,
225
+ });
226
+ // 2. Create/reactivate the Soma connection
227
+ const connectionId = await ctx.runMutation(publicApi.public.connect, {
228
+ userId: args.userId,
229
+ provider: "GARMIN",
230
+ });
231
+ // 3. Store permanent OAuth tokens
232
+ await ctx.runMutation(internalApi.garmin.storeTokens, {
233
+ connectionId,
234
+ accessToken: accessTokenResult.oauthToken,
235
+ tokenSecret: accessTokenResult.oauthTokenSecret,
236
+ });
237
+ // 4. Sync last 30 days of all data types
238
+ const client = new GarminClient({
239
+ consumerKey: args.consumerKey,
240
+ consumerSecret: args.consumerSecret,
241
+ accessToken: accessTokenResult.oauthToken,
242
+ tokenSecret: accessTokenResult.oauthTokenSecret,
243
+ });
244
+ const now = Math.floor(Date.now() / 1000);
245
+ const thirtyDaysAgo = now - DEFAULT_SYNC_DAYS * 86400;
246
+ const timeRange = {
247
+ uploadStartTimeInSeconds: thirtyDaysAgo,
248
+ uploadEndTimeInSeconds: now,
249
+ };
250
+ const result = await syncAllTypes(ctx, client, {
251
+ connectionId,
252
+ userId: args.userId,
253
+ consumerKey: args.consumerKey,
254
+ consumerSecret: args.consumerSecret,
255
+ timeRange,
256
+ });
257
+ // 5. Update lastDataUpdate timestamp
258
+ await ctx.runMutation(publicApi.public.updateConnection, {
259
+ connectionId,
260
+ lastDataUpdate: new Date().toISOString(),
261
+ });
262
+ return {
263
+ connectionId,
264
+ synced: result.synced,
265
+ errors: result.errors,
266
+ };
267
+ },
268
+ });
269
+ /**
270
+ * Complete a Garmin OAuth flow using stored pending state.
271
+ *
272
+ * Used by `registerRoutes` — the callback handler calls this with the
273
+ * `oauth_token` and `oauth_verifier` from the redirect. The action looks
274
+ * up the pending state (tokenSecret, userId) stored during Step 1,
275
+ * exchanges for permanent tokens, creates the connection, syncs data,
276
+ * and cleans up the pending entry.
277
+ */
278
+ export const completeGarminOAuth = action({
279
+ args: {
280
+ oauthToken: v.string(),
281
+ oauthVerifier: v.string(),
282
+ consumerKey: v.string(),
283
+ consumerSecret: v.string(),
284
+ },
285
+ returns: v.object({
286
+ connectionId: v.string(),
287
+ synced: v.object({
288
+ activities: v.number(),
289
+ dailies: v.number(),
290
+ sleep: v.number(),
291
+ body: v.number(),
292
+ menstruation: v.number(),
293
+ }),
294
+ errors: v.array(v.object({ type: v.string(), id: v.string(), error: v.string() })),
295
+ }),
296
+ handler: async (ctx, args) => {
297
+ // 1. Look up pending state
298
+ const pending = await ctx.runQuery(internalApi.garmin.getPendingOAuth, {
299
+ oauthToken: args.oauthToken,
300
+ });
301
+ if (!pending) {
302
+ throw new Error("No pending Garmin OAuth state found for this token. " +
303
+ "The request token may have expired or was already used.");
304
+ }
305
+ // 2. Exchange request token for permanent access token
306
+ const accessTokenResult = await getAccessToken({
307
+ consumerKey: args.consumerKey,
308
+ consumerSecret: args.consumerSecret,
309
+ token: args.oauthToken,
310
+ tokenSecret: pending.tokenSecret,
311
+ verifier: args.oauthVerifier,
312
+ });
313
+ // 3. Delete pending state (no longer needed)
314
+ await ctx.runMutation(internalApi.garmin.deletePendingOAuth, {
315
+ oauthToken: args.oauthToken,
316
+ });
317
+ // 4. Create/reactivate the Soma connection
318
+ const connectionId = await ctx.runMutation(publicApi.public.connect, {
319
+ userId: pending.userId,
320
+ provider: "GARMIN",
321
+ });
322
+ // 5. Store permanent OAuth tokens
323
+ await ctx.runMutation(internalApi.garmin.storeTokens, {
324
+ connectionId,
325
+ accessToken: accessTokenResult.oauthToken,
326
+ tokenSecret: accessTokenResult.oauthTokenSecret,
327
+ });
328
+ // 6. Sync last 30 days of all data types
329
+ const client = new GarminClient({
330
+ consumerKey: args.consumerKey,
331
+ consumerSecret: args.consumerSecret,
332
+ accessToken: accessTokenResult.oauthToken,
333
+ tokenSecret: accessTokenResult.oauthTokenSecret,
334
+ });
335
+ const now = Math.floor(Date.now() / 1000);
336
+ const thirtyDaysAgo = now - DEFAULT_SYNC_DAYS * 86400;
337
+ const timeRange = {
338
+ uploadStartTimeInSeconds: thirtyDaysAgo,
339
+ uploadEndTimeInSeconds: now,
340
+ };
341
+ const result = await syncAllTypes(ctx, client, {
342
+ connectionId,
343
+ userId: pending.userId,
344
+ consumerKey: args.consumerKey,
345
+ consumerSecret: args.consumerSecret,
346
+ timeRange,
347
+ });
348
+ // 7. Update lastDataUpdate timestamp
349
+ await ctx.runMutation(publicApi.public.updateConnection, {
350
+ connectionId,
351
+ lastDataUpdate: new Date().toISOString(),
352
+ });
353
+ return {
354
+ connectionId,
355
+ synced: result.synced,
356
+ errors: result.errors,
357
+ };
358
+ },
359
+ });
360
+ /**
361
+ * Incremental Garmin sync for an already-connected user.
362
+ *
363
+ * Looks up the stored tokens and syncs all data types for the specified
364
+ * time range (defaults to last 30 days).
365
+ */
366
+ export const syncGarmin = action({
367
+ args: {
368
+ userId: v.string(),
369
+ consumerKey: v.string(),
370
+ consumerSecret: v.string(),
371
+ startTimeInSeconds: v.optional(v.number()),
372
+ endTimeInSeconds: v.optional(v.number()),
373
+ },
374
+ returns: v.object({
375
+ synced: v.object({
376
+ activities: v.number(),
377
+ dailies: v.number(),
378
+ sleep: v.number(),
379
+ body: v.number(),
380
+ menstruation: v.number(),
381
+ }),
382
+ errors: v.array(v.object({ type: v.string(), id: v.string(), error: v.string() })),
383
+ }),
384
+ handler: async (ctx, args) => {
385
+ // 1. Look up connection
386
+ const connection = await ctx.runQuery(internalApi.private.getConnectionByProvider, { userId: args.userId, provider: "GARMIN" });
387
+ if (!connection) {
388
+ throw new Error(`No Garmin connection found for user "${args.userId}". ` +
389
+ "Call connectGarmin first.");
390
+ }
391
+ if (!connection.active) {
392
+ throw new Error(`Garmin connection for user "${args.userId}" is inactive. Reconnect first.`);
393
+ }
394
+ const connectionId = connection._id;
395
+ // 2. Get stored tokens
396
+ const tokenDoc = await ctx.runQuery(internalApi.garmin.getTokens, {
397
+ connectionId,
398
+ });
399
+ if (!tokenDoc || !tokenDoc.tokenSecret) {
400
+ throw new Error("No Garmin tokens found for this connection. " +
401
+ "The connection may have been created before token storage was available.");
402
+ }
403
+ // 3. Create client and sync
404
+ const client = new GarminClient({
405
+ consumerKey: args.consumerKey,
406
+ consumerSecret: args.consumerSecret,
407
+ accessToken: tokenDoc.accessToken,
408
+ tokenSecret: tokenDoc.tokenSecret,
409
+ });
410
+ const now = Math.floor(Date.now() / 1000);
411
+ const timeRange = {
412
+ uploadStartTimeInSeconds: args.startTimeInSeconds ?? now - DEFAULT_SYNC_DAYS * 86400,
413
+ uploadEndTimeInSeconds: args.endTimeInSeconds ?? now,
414
+ };
415
+ const result = await syncAllTypes(ctx, client, {
416
+ connectionId,
417
+ userId: args.userId,
418
+ consumerKey: args.consumerKey,
419
+ consumerSecret: args.consumerSecret,
420
+ timeRange,
421
+ });
422
+ // 4. Update lastDataUpdate timestamp
423
+ await ctx.runMutation(publicApi.public.updateConnection, {
424
+ connectionId,
425
+ lastDataUpdate: new Date().toISOString(),
426
+ });
427
+ return result;
428
+ },
429
+ });
430
+ /**
431
+ * Disconnect a user from Garmin.
432
+ *
433
+ * Deletes stored tokens and sets the connection to inactive.
434
+ * Garmin OAuth 1.0a tokens can't be revoked via API, so we just clean up locally.
435
+ */
436
+ export const disconnectGarmin = action({
437
+ args: {
438
+ userId: v.string(),
439
+ },
440
+ returns: v.null(),
441
+ handler: async (ctx, args) => {
442
+ // 1. Look up connection
443
+ const connection = await ctx.runQuery(internalApi.private.getConnectionByProvider, { userId: args.userId, provider: "GARMIN" });
444
+ if (!connection) {
445
+ throw new Error(`No Garmin connection found for user "${args.userId}".`);
446
+ }
447
+ const connectionId = connection._id;
448
+ // 2. Delete stored tokens
449
+ await ctx.runMutation(internalApi.garmin.deleteTokens, { connectionId });
450
+ // 3. Set connection inactive
451
+ await ctx.runMutation(publicApi.public.disconnect, {
452
+ userId: args.userId,
453
+ provider: "GARMIN",
454
+ });
455
+ return null;
456
+ },
457
+ });
458
+ async function syncAllTypes(ctx, client, config) {
459
+ const { connectionId, userId, timeRange } = config;
460
+ const synced = { activities: 0, dailies: 0, sleep: 0, body: 0, menstruation: 0 };
461
+ const errors = [];
462
+ // ── Activities ──────────────────────────────────────────────────────────
463
+ try {
464
+ const activities = await client.getActivities(timeRange);
465
+ for (const activity of activities) {
466
+ try {
467
+ const data = transformActivity(activity);
468
+ await ctx.runMutation(publicApi.public.ingestActivity, {
469
+ connectionId,
470
+ userId,
471
+ ...data,
472
+ });
473
+ synced.activities++;
474
+ }
475
+ catch (err) {
476
+ errors.push({
477
+ type: "activity",
478
+ id: activity.summaryId ?? String(activity.activityId),
479
+ error: err instanceof Error ? err.message : String(err),
480
+ });
481
+ }
482
+ }
483
+ }
484
+ catch (err) {
485
+ errors.push({
486
+ type: "activity",
487
+ id: "fetch",
488
+ error: err instanceof Error ? err.message : String(err),
489
+ });
490
+ }
491
+ // ── Dailies ─────────────────────────────────────────────────────────────
492
+ try {
493
+ const dailies = await client.getDailies(timeRange);
494
+ for (const daily of dailies) {
495
+ try {
496
+ const data = transformDaily(daily);
497
+ await ctx.runMutation(publicApi.public.ingestDaily, {
498
+ connectionId,
499
+ userId,
500
+ ...data,
501
+ });
502
+ synced.dailies++;
503
+ }
504
+ catch (err) {
505
+ errors.push({
506
+ type: "daily",
507
+ id: daily.summaryId ?? daily.calendarDate,
508
+ error: err instanceof Error ? err.message : String(err),
509
+ });
510
+ }
511
+ }
512
+ }
513
+ catch (err) {
514
+ errors.push({
515
+ type: "daily",
516
+ id: "fetch",
517
+ error: err instanceof Error ? err.message : String(err),
518
+ });
519
+ }
520
+ // ── Sleep ───────────────────────────────────────────────────────────────
521
+ try {
522
+ const sleeps = await client.getSleeps(timeRange);
523
+ for (const sleep of sleeps) {
524
+ try {
525
+ const data = transformSleep(sleep);
526
+ await ctx.runMutation(publicApi.public.ingestSleep, {
527
+ connectionId,
528
+ userId,
529
+ ...data,
530
+ });
531
+ synced.sleep++;
532
+ }
533
+ catch (err) {
534
+ errors.push({
535
+ type: "sleep",
536
+ id: sleep.summaryId ?? sleep.calendarDate,
537
+ error: err instanceof Error ? err.message : String(err),
538
+ });
539
+ }
540
+ }
541
+ }
542
+ catch (err) {
543
+ errors.push({
544
+ type: "sleep",
545
+ id: "fetch",
546
+ error: err instanceof Error ? err.message : String(err),
547
+ });
548
+ }
549
+ // ── Body ────────────────────────────────────────────────────────────────
550
+ try {
551
+ const bodyComps = await client.getBodyCompositions(timeRange);
552
+ for (const body of bodyComps) {
553
+ try {
554
+ const data = transformBody(body);
555
+ await ctx.runMutation(publicApi.public.ingestBody, {
556
+ connectionId,
557
+ userId,
558
+ ...data,
559
+ });
560
+ synced.body++;
561
+ }
562
+ catch (err) {
563
+ errors.push({
564
+ type: "body",
565
+ id: body.summaryId ?? String(body.measurementTimeInSeconds),
566
+ error: err instanceof Error ? err.message : String(err),
567
+ });
568
+ }
569
+ }
570
+ }
571
+ catch (err) {
572
+ errors.push({
573
+ type: "body",
574
+ id: "fetch",
575
+ error: err instanceof Error ? err.message : String(err),
576
+ });
577
+ }
578
+ // ── Menstruation ────────────────────────────────────────────────────────
579
+ try {
580
+ const records = await client.getMenstrualCycleData(timeRange);
581
+ for (const record of records) {
582
+ try {
583
+ const data = transformMenstruation(record);
584
+ await ctx.runMutation(publicApi.public.ingestMenstruation, {
585
+ connectionId,
586
+ userId,
587
+ ...data,
588
+ });
589
+ synced.menstruation++;
590
+ }
591
+ catch (err) {
592
+ errors.push({
593
+ type: "menstruation",
594
+ id: record.summaryId ?? record.calendarDate,
595
+ error: err instanceof Error ? err.message : String(err),
596
+ });
597
+ }
598
+ }
599
+ }
600
+ catch (err) {
601
+ errors.push({
602
+ type: "menstruation",
603
+ id: "fetch",
604
+ error: err instanceof Error ? err.message : String(err),
605
+ });
606
+ }
607
+ return { synced, errors };
608
+ }
609
+ //# sourceMappingURL=garmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"garmin.js","sourceRoot":"","sources":["../../src/component/garmin.ts"],"names":[],"mappings":"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"}