@clipin/convex-wearables 0.0.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.
Files changed (143) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +616 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +4 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/index.d.ts +244 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +555 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/types.d.ts +689 -0
  12. package/dist/client/types.d.ts.map +1 -0
  13. package/dist/client/types.js +112 -0
  14. package/dist/client/types.js.map +1 -0
  15. package/dist/component/_generated/_ignore.d.ts +1 -0
  16. package/dist/component/_generated/_ignore.d.ts.map +1 -0
  17. package/dist/component/_generated/_ignore.js +4 -0
  18. package/dist/component/_generated/_ignore.js.map +1 -0
  19. package/dist/component/_generated/api.d.ts +13 -0
  20. package/dist/component/_generated/api.d.ts.map +1 -0
  21. package/dist/component/_generated/api.js +14 -0
  22. package/dist/component/_generated/api.js.map +1 -0
  23. package/dist/component/_generated/dataModel.d.ts +28 -0
  24. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  25. package/dist/component/_generated/dataModel.js +11 -0
  26. package/dist/component/_generated/dataModel.js.map +1 -0
  27. package/dist/component/_generated/server.d.ts +23 -0
  28. package/dist/component/_generated/server.d.ts.map +1 -0
  29. package/dist/component/_generated/server.js +18 -0
  30. package/dist/component/_generated/server.js.map +1 -0
  31. package/dist/component/backfillJobs.d.ts +121 -0
  32. package/dist/component/backfillJobs.d.ts.map +1 -0
  33. package/dist/component/backfillJobs.js +233 -0
  34. package/dist/component/backfillJobs.js.map +1 -0
  35. package/dist/component/connections.d.ts +159 -0
  36. package/dist/component/connections.d.ts.map +1 -0
  37. package/dist/component/connections.js +288 -0
  38. package/dist/component/connections.js.map +1 -0
  39. package/dist/component/convex.config.d.ts +3 -0
  40. package/dist/component/convex.config.d.ts.map +1 -0
  41. package/dist/component/convex.config.js +6 -0
  42. package/dist/component/convex.config.js.map +1 -0
  43. package/dist/component/dataPoints.d.ts +81 -0
  44. package/dist/component/dataPoints.d.ts.map +1 -0
  45. package/dist/component/dataPoints.js +258 -0
  46. package/dist/component/dataPoints.js.map +1 -0
  47. package/dist/component/dataSources.d.ts +56 -0
  48. package/dist/component/dataSources.d.ts.map +1 -0
  49. package/dist/component/dataSources.js +95 -0
  50. package/dist/component/dataSources.js.map +1 -0
  51. package/dist/component/events.d.ts +203 -0
  52. package/dist/component/events.d.ts.map +1 -0
  53. package/dist/component/events.js +251 -0
  54. package/dist/component/events.js.map +1 -0
  55. package/dist/component/garminBackfill.d.ts +40 -0
  56. package/dist/component/garminBackfill.d.ts.map +1 -0
  57. package/dist/component/garminBackfill.js +296 -0
  58. package/dist/component/garminBackfill.js.map +1 -0
  59. package/dist/component/garminWebhooks.d.ts +17 -0
  60. package/dist/component/garminWebhooks.d.ts.map +1 -0
  61. package/dist/component/garminWebhooks.js +505 -0
  62. package/dist/component/garminWebhooks.js.map +1 -0
  63. package/dist/component/httpHandlers.d.ts +32 -0
  64. package/dist/component/httpHandlers.d.ts.map +1 -0
  65. package/dist/component/httpHandlers.js +131 -0
  66. package/dist/component/httpHandlers.js.map +1 -0
  67. package/dist/component/lifecycle.d.ts +12 -0
  68. package/dist/component/lifecycle.d.ts.map +1 -0
  69. package/dist/component/lifecycle.js +79 -0
  70. package/dist/component/lifecycle.js.map +1 -0
  71. package/dist/component/menstrualCycles.d.ts +98 -0
  72. package/dist/component/menstrualCycles.d.ts.map +1 -0
  73. package/dist/component/menstrualCycles.js +112 -0
  74. package/dist/component/menstrualCycles.js.map +1 -0
  75. package/dist/component/oauthActions.d.ts +52 -0
  76. package/dist/component/oauthActions.d.ts.map +1 -0
  77. package/dist/component/oauthActions.js +208 -0
  78. package/dist/component/oauthActions.js.map +1 -0
  79. package/dist/component/oauthStates.d.ts +47 -0
  80. package/dist/component/oauthStates.d.ts.map +1 -0
  81. package/dist/component/oauthStates.js +77 -0
  82. package/dist/component/oauthStates.js.map +1 -0
  83. package/dist/component/providerSettings.d.ts +15 -0
  84. package/dist/component/providerSettings.d.ts.map +1 -0
  85. package/dist/component/providerSettings.js +57 -0
  86. package/dist/component/providerSettings.js.map +1 -0
  87. package/dist/component/providers/garmin.d.ts +306 -0
  88. package/dist/component/providers/garmin.d.ts.map +1 -0
  89. package/dist/component/providers/garmin.js +675 -0
  90. package/dist/component/providers/garmin.js.map +1 -0
  91. package/dist/component/providers/oauth.d.ts +42 -0
  92. package/dist/component/providers/oauth.d.ts.map +1 -0
  93. package/dist/component/providers/oauth.js +181 -0
  94. package/dist/component/providers/oauth.js.map +1 -0
  95. package/dist/component/providers/polar.d.ts +6 -0
  96. package/dist/component/providers/polar.d.ts.map +1 -0
  97. package/dist/component/providers/polar.js +175 -0
  98. package/dist/component/providers/polar.js.map +1 -0
  99. package/dist/component/providers/registry.d.ts +14 -0
  100. package/dist/component/providers/registry.d.ts.map +1 -0
  101. package/dist/component/providers/registry.js +32 -0
  102. package/dist/component/providers/registry.js.map +1 -0
  103. package/dist/component/providers/strava.d.ts +45 -0
  104. package/dist/component/providers/strava.d.ts.map +1 -0
  105. package/dist/component/providers/strava.js +182 -0
  106. package/dist/component/providers/strava.js.map +1 -0
  107. package/dist/component/providers/suunto.d.ts +5 -0
  108. package/dist/component/providers/suunto.d.ts.map +1 -0
  109. package/dist/component/providers/suunto.js +502 -0
  110. package/dist/component/providers/suunto.js.map +1 -0
  111. package/dist/component/providers/types.d.ts +139 -0
  112. package/dist/component/providers/types.d.ts.map +1 -0
  113. package/dist/component/providers/types.js +5 -0
  114. package/dist/component/providers/types.js.map +1 -0
  115. package/dist/component/providers/whoop.d.ts +4 -0
  116. package/dist/component/providers/whoop.d.ts.map +1 -0
  117. package/dist/component/providers/whoop.js +439 -0
  118. package/dist/component/providers/whoop.js.map +1 -0
  119. package/dist/component/schema.d.ts +429 -0
  120. package/dist/component/schema.d.ts.map +1 -0
  121. package/dist/component/schema.js +282 -0
  122. package/dist/component/schema.js.map +1 -0
  123. package/dist/component/sdkPush.d.ts +143 -0
  124. package/dist/component/sdkPush.d.ts.map +1 -0
  125. package/dist/component/sdkPush.js +338 -0
  126. package/dist/component/sdkPush.js.map +1 -0
  127. package/dist/component/summaries.d.ts +129 -0
  128. package/dist/component/summaries.d.ts.map +1 -0
  129. package/dist/component/summaries.js +129 -0
  130. package/dist/component/summaries.js.map +1 -0
  131. package/dist/component/syncJobs.d.ts +142 -0
  132. package/dist/component/syncJobs.d.ts.map +1 -0
  133. package/dist/component/syncJobs.js +136 -0
  134. package/dist/component/syncJobs.js.map +1 -0
  135. package/dist/component/syncWorkflow.d.ts +99 -0
  136. package/dist/component/syncWorkflow.d.ts.map +1 -0
  137. package/dist/component/syncWorkflow.js +579 -0
  138. package/dist/component/syncWorkflow.js.map +1 -0
  139. package/dist/component/workflowManager.d.ts +3 -0
  140. package/dist/component/workflowManager.d.ts.map +1 -0
  141. package/dist/component/workflowManager.js +17 -0
  142. package/dist/component/workflowManager.js.map +1 -0
  143. package/package.json +84 -0
@@ -0,0 +1,505 @@
1
+ /**
2
+ * Garmin webhook processing.
3
+ *
4
+ * Garmin pushes data to registered webhook endpoints. This module
5
+ * provides actions that process the push payloads and store the data.
6
+ */
7
+ import { v } from "convex/values";
8
+ import { api, internal } from "./_generated/api";
9
+ import { action } from "./_generated/server";
10
+ import { normalizeActivity, normalizeBloodPressureDataPoints, normalizeBodyCompositionDataPoints, normalizeBodyCompositionSummary, normalizeDaily, normalizeDailyRecoverySummary, normalizeEpochDataPoints, normalizeHealthSnapshotDataPoints, normalizeHrvDataPoints, normalizeHrvSummary, normalizeMCT, normalizeMoveIQ, normalizePulseOxDataPoints, normalizePulseOxSummary, normalizeRespirationDataPoints, normalizeSkinTemperatureDataPoints, normalizeSleep, normalizeSleepSummary, normalizeStressDataPoints, normalizeUserMetricsDataPoints, } from "./providers/garmin";
11
+ const DATA_POINT_BATCH_SIZE = 100;
12
+ function decodePushPayload(args) {
13
+ if (args.payloadJson !== undefined) {
14
+ return JSON.parse(args.payloadJson);
15
+ }
16
+ if (args.payload !== undefined) {
17
+ return args.payload;
18
+ }
19
+ throw new Error("Garmin push payload is required");
20
+ }
21
+ /**
22
+ * Process a Garmin push webhook payload.
23
+ *
24
+ * Handles activities, sleep, dailies, and extended wellness feeds.
25
+ */
26
+ export const processPushPayload = action({
27
+ args: {
28
+ payload: v.optional(v.any()),
29
+ payloadJson: v.optional(v.string()),
30
+ garminClientId: v.string(),
31
+ },
32
+ handler: async (ctx, args) => {
33
+ const payload = decodePushPayload(args);
34
+ const signalBuckets = new Map();
35
+ await processActivityEntries(ctx, payload.activities, "activities", signalBuckets);
36
+ await processActivityEntries(ctx, payload.activityDetails, "activityDetails", signalBuckets);
37
+ if (payload.sleeps?.length) {
38
+ for (const sleep of payload.sleeps) {
39
+ const connection = await resolveConnection(ctx, sleep.userId);
40
+ if (!connection)
41
+ continue;
42
+ const dataSourceId = await resolveDataSource(ctx, connection);
43
+ if (!dataSourceId)
44
+ continue;
45
+ const event = normalizeSleep(sleep);
46
+ await ctx.runMutation(internal.events.storeEvent, {
47
+ dataSourceId,
48
+ userId: connection.userId,
49
+ category: event.category,
50
+ type: event.type,
51
+ sourceName: event.sourceName,
52
+ durationSeconds: event.durationSeconds,
53
+ startDatetime: event.startDatetime,
54
+ endDatetime: event.endDatetime,
55
+ externalId: event.externalId,
56
+ heartRateAvg: event.heartRateAvg,
57
+ heartRateMin: event.heartRateMin,
58
+ sleepTotalDurationMinutes: event.sleepTotalDurationMinutes,
59
+ sleepDeepMinutes: event.sleepDeepMinutes,
60
+ sleepLightMinutes: event.sleepLightMinutes,
61
+ sleepRemMinutes: event.sleepRemMinutes,
62
+ sleepAwakeMinutes: event.sleepAwakeMinutes,
63
+ sleepEfficiencyScore: event.sleepEfficiencyScore,
64
+ sleepStages: event.sleepStages,
65
+ });
66
+ await upsertSummary(ctx, connection.userId, normalizeSleepSummary(sleep));
67
+ const supplementalPoints = [];
68
+ if (sleep.avgOxygenSaturation != null) {
69
+ supplementalPoints.push({
70
+ seriesType: "oxygen_saturation",
71
+ recordedAt: sleep.startTimeInSeconds * 1000,
72
+ value: sleep.avgOxygenSaturation,
73
+ externalId: `${sleep.summaryId}:sleep_spo2`,
74
+ });
75
+ await upsertSummary(ctx, connection.userId, {
76
+ date: isoDateFromTimestamp(sleep.startTimeInSeconds * 1000),
77
+ category: "recovery",
78
+ spo2Avg: sleep.avgOxygenSaturation,
79
+ });
80
+ }
81
+ if (sleep.respirationAvg != null) {
82
+ supplementalPoints.push({
83
+ seriesType: "respiratory_rate",
84
+ recordedAt: sleep.startTimeInSeconds * 1000,
85
+ value: sleep.respirationAvg,
86
+ externalId: `${sleep.summaryId}:sleep_respiration`,
87
+ });
88
+ }
89
+ await storeNormalizedDataPoints(ctx, dataSourceId, supplementalPoints);
90
+ addSignal(signalBuckets, "sleeps", connection._id);
91
+ }
92
+ }
93
+ if (payload.dailies?.length) {
94
+ for (const daily of payload.dailies) {
95
+ const connection = await resolveConnection(ctx, daily.userId);
96
+ if (!connection)
97
+ continue;
98
+ const dataSourceId = await resolveDataSource(ctx, connection);
99
+ if (!dataSourceId)
100
+ continue;
101
+ const normalized = normalizeDaily(daily);
102
+ await upsertSummary(ctx, connection.userId, {
103
+ date: normalized.date,
104
+ category: "activity",
105
+ totalSteps: normalized.totalSteps,
106
+ totalCalories: normalized.totalCalories,
107
+ activeCalories: normalized.activeCalories,
108
+ totalDistance: normalized.totalDistance,
109
+ floorsClimbed: normalized.floorsClimbed,
110
+ avgHeartRate: normalized.avgHeartRate,
111
+ maxHeartRate: normalized.maxHeartRate,
112
+ minHeartRate: normalized.minHeartRate,
113
+ activeMinutes: normalized.activeMinutes,
114
+ });
115
+ await upsertSummary(ctx, connection.userId, normalizeDailyRecoverySummary(daily));
116
+ const points = [];
117
+ if (normalized.restingHeartRate != null) {
118
+ points.push({
119
+ seriesType: "resting_heart_rate",
120
+ recordedAt: daily.startTimeInSeconds * 1000,
121
+ value: normalized.restingHeartRate,
122
+ externalId: daily.summaryId ? `${daily.summaryId}:resting_heart_rate` : undefined,
123
+ });
124
+ }
125
+ if (normalized.heartRateSamples?.length) {
126
+ points.push(...normalized.heartRateSamples.map((sample) => ({
127
+ seriesType: "heart_rate",
128
+ recordedAt: sample.timestamp,
129
+ value: sample.value,
130
+ })));
131
+ }
132
+ await storeNormalizedDataPoints(ctx, dataSourceId, points);
133
+ addSignal(signalBuckets, "dailies", connection._id);
134
+ }
135
+ }
136
+ if (payload.epochs?.length) {
137
+ for (const epoch of payload.epochs) {
138
+ const connection = await resolveConnection(ctx, epoch.userId);
139
+ if (!connection)
140
+ continue;
141
+ const dataSourceId = await resolveDataSource(ctx, connection);
142
+ if (!dataSourceId)
143
+ continue;
144
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeEpochDataPoints(epoch));
145
+ addSignal(signalBuckets, "epochs", connection._id);
146
+ }
147
+ }
148
+ if (payload.bodyComps?.length) {
149
+ for (const bodyComp of payload.bodyComps) {
150
+ const connection = await resolveConnection(ctx, bodyComp.userId);
151
+ if (!connection)
152
+ continue;
153
+ const dataSourceId = await resolveDataSource(ctx, connection);
154
+ if (!dataSourceId)
155
+ continue;
156
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeBodyCompositionDataPoints(bodyComp));
157
+ await upsertSummary(ctx, connection.userId, normalizeBodyCompositionSummary(bodyComp));
158
+ addSignal(signalBuckets, "bodyComps", connection._id);
159
+ }
160
+ }
161
+ if (payload.hrv?.length) {
162
+ for (const hrv of payload.hrv) {
163
+ const connection = await resolveConnection(ctx, hrv.userId);
164
+ if (!connection)
165
+ continue;
166
+ const dataSourceId = await resolveDataSource(ctx, connection);
167
+ if (!dataSourceId)
168
+ continue;
169
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeHrvDataPoints(hrv));
170
+ await upsertSummary(ctx, connection.userId, normalizeHrvSummary(hrv));
171
+ addSignal(signalBuckets, "hrv", connection._id);
172
+ }
173
+ }
174
+ if (payload.stressDetails?.length) {
175
+ for (const stress of payload.stressDetails) {
176
+ const connection = await resolveConnection(ctx, stress.userId);
177
+ if (!connection)
178
+ continue;
179
+ const dataSourceId = await resolveDataSource(ctx, connection);
180
+ if (!dataSourceId)
181
+ continue;
182
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeStressDataPoints(stress));
183
+ addSignal(signalBuckets, "stressDetails", connection._id);
184
+ }
185
+ }
186
+ if (payload.respiration?.length) {
187
+ for (const respiration of payload.respiration) {
188
+ const connection = await resolveConnection(ctx, respiration.userId);
189
+ if (!connection)
190
+ continue;
191
+ const dataSourceId = await resolveDataSource(ctx, connection);
192
+ if (!dataSourceId)
193
+ continue;
194
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeRespirationDataPoints(respiration));
195
+ addSignal(signalBuckets, "respiration", connection._id);
196
+ }
197
+ }
198
+ if (payload.pulseOx?.length) {
199
+ for (const pulseOx of payload.pulseOx) {
200
+ const connection = await resolveConnection(ctx, pulseOx.userId);
201
+ if (!connection)
202
+ continue;
203
+ const dataSourceId = await resolveDataSource(ctx, connection);
204
+ if (!dataSourceId)
205
+ continue;
206
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizePulseOxDataPoints(pulseOx));
207
+ await upsertSummary(ctx, connection.userId, normalizePulseOxSummary(pulseOx));
208
+ addSignal(signalBuckets, "pulseOx", connection._id);
209
+ }
210
+ }
211
+ if (payload.bloodPressures?.length) {
212
+ for (const bloodPressure of payload.bloodPressures) {
213
+ const connection = await resolveConnection(ctx, bloodPressure.userId);
214
+ if (!connection)
215
+ continue;
216
+ const dataSourceId = await resolveDataSource(ctx, connection);
217
+ if (!dataSourceId)
218
+ continue;
219
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeBloodPressureDataPoints(bloodPressure));
220
+ addSignal(signalBuckets, "bloodPressures", connection._id);
221
+ }
222
+ }
223
+ if (payload.userMetrics?.length) {
224
+ for (const userMetrics of payload.userMetrics) {
225
+ const connection = await resolveConnection(ctx, userMetrics.userId);
226
+ if (!connection)
227
+ continue;
228
+ const dataSourceId = await resolveDataSource(ctx, connection);
229
+ if (!dataSourceId)
230
+ continue;
231
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeUserMetricsDataPoints(userMetrics));
232
+ addSignal(signalBuckets, "userMetrics", connection._id);
233
+ }
234
+ }
235
+ if (payload.skinTemp?.length) {
236
+ for (const skinTemp of payload.skinTemp) {
237
+ const connection = await resolveConnection(ctx, skinTemp.userId);
238
+ if (!connection)
239
+ continue;
240
+ const dataSourceId = await resolveDataSource(ctx, connection);
241
+ if (!dataSourceId)
242
+ continue;
243
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeSkinTemperatureDataPoints(skinTemp));
244
+ addSignal(signalBuckets, "skinTemp", connection._id);
245
+ }
246
+ }
247
+ if (payload.healthSnapshot?.length) {
248
+ for (const snapshot of payload.healthSnapshot) {
249
+ const connection = await resolveConnection(ctx, snapshot.userId);
250
+ if (!connection)
251
+ continue;
252
+ const dataSourceId = await resolveDataSource(ctx, connection);
253
+ if (!dataSourceId)
254
+ continue;
255
+ await storeNormalizedDataPoints(ctx, dataSourceId, normalizeHealthSnapshotDataPoints(snapshot));
256
+ addSignal(signalBuckets, "healthSnapshot", connection._id);
257
+ }
258
+ }
259
+ if (payload.moveiq?.length) {
260
+ for (const moveIQ of payload.moveiq) {
261
+ const connection = await resolveConnection(ctx, moveIQ.userId);
262
+ if (!connection)
263
+ continue;
264
+ const dataSourceId = await resolveDataSource(ctx, connection);
265
+ if (!dataSourceId)
266
+ continue;
267
+ const event = normalizeMoveIQ(moveIQ);
268
+ await ctx.runMutation(internal.events.storeEvent, {
269
+ dataSourceId,
270
+ userId: connection.userId,
271
+ category: event.category,
272
+ type: event.type,
273
+ sourceName: event.sourceName,
274
+ durationSeconds: event.durationSeconds,
275
+ startDatetime: event.startDatetime,
276
+ endDatetime: event.endDatetime,
277
+ externalId: event.externalId,
278
+ });
279
+ addSignal(signalBuckets, "moveiq", connection._id);
280
+ }
281
+ }
282
+ const menstrualCycleTracking = payload.menstrualCycleTracking && payload.menstrualCycleTracking.length > 0
283
+ ? payload.menstrualCycleTracking
284
+ : payload.mct;
285
+ if (menstrualCycleTracking?.length) {
286
+ for (const mct of menstrualCycleTracking) {
287
+ const connection = await resolveConnection(ctx, mct.userId);
288
+ if (!connection)
289
+ continue;
290
+ const normalized = normalizeMCT(mct);
291
+ await ctx.runMutation(internal.menstrualCycles.upsert, {
292
+ userId: connection.userId,
293
+ provider: "garmin",
294
+ externalId: normalized.externalId,
295
+ periodStartDate: normalized.periodStartDate,
296
+ dayInCycle: normalized.dayInCycle,
297
+ cycleLength: normalized.cycleLength,
298
+ predictedCycleLength: normalized.predictedCycleLength,
299
+ periodLength: normalized.periodLength,
300
+ currentPhase: normalized.currentPhase,
301
+ currentPhaseType: normalized.currentPhaseType,
302
+ lengthOfCurrentPhase: normalized.lengthOfCurrentPhase,
303
+ daysUntilNextPhase: normalized.daysUntilNextPhase,
304
+ isPredictedCycle: normalized.isPredictedCycle,
305
+ fertileWindowStart: normalized.fertileWindowStart,
306
+ lengthOfFertileWindow: normalized.lengthOfFertileWindow,
307
+ lastUpdatedAt: normalized.lastUpdatedAt,
308
+ isPregnant: normalized.isPregnant,
309
+ pregnancyDueDate: normalized.pregnancyDueDate,
310
+ pregnancyOriginalDueDate: normalized.pregnancyOriginalDueDate,
311
+ pregnancyCycleStartDate: normalized.pregnancyCycleStartDate,
312
+ pregnancyTitle: normalized.pregnancyTitle,
313
+ numberOfBabies: normalized.numberOfBabies,
314
+ });
315
+ addSignal(signalBuckets, "mct", connection._id);
316
+ }
317
+ }
318
+ if (payload.userPermissionsChange?.length) {
319
+ for (const change of payload.userPermissionsChange) {
320
+ const connection = await resolveConnection(ctx, change.userId);
321
+ if (!connection)
322
+ continue;
323
+ await ctx.runMutation(internal.connections.updateScope, {
324
+ connectionId: connection._id,
325
+ scope: change.permissions.length > 0 ? [...change.permissions].sort().join(" ") : undefined,
326
+ });
327
+ }
328
+ }
329
+ if (payload.deregistrations?.length) {
330
+ for (const dereg of payload.deregistrations) {
331
+ const connection = await resolveConnection(ctx, dereg.userId);
332
+ if (!connection)
333
+ continue;
334
+ await ctx.runMutation(internal.connections.updateStatus, {
335
+ connectionId: connection._id,
336
+ status: "revoked",
337
+ });
338
+ }
339
+ }
340
+ for (const [dataType, connectionIds] of signalBuckets) {
341
+ const itemCount = getPayloadItemCount(payload, dataType);
342
+ for (const connectionId of connectionIds) {
343
+ await ctx.runMutation(internal.backfillJobs.signalWebhookData, {
344
+ connectionId: connectionId,
345
+ dataType,
346
+ itemCount,
347
+ });
348
+ }
349
+ }
350
+ },
351
+ });
352
+ async function processActivityEntries(ctx, activities, dataType, signalBuckets) {
353
+ if (!activities?.length) {
354
+ return;
355
+ }
356
+ for (const activity of activities) {
357
+ const connection = await resolveConnection(ctx, activity.userId);
358
+ if (!connection)
359
+ continue;
360
+ const dataSourceId = await resolveDataSource(ctx, connection, activity.deviceName);
361
+ if (!dataSourceId)
362
+ continue;
363
+ const event = normalizeActivity(activity);
364
+ await ctx.runMutation(internal.events.storeEvent, {
365
+ dataSourceId,
366
+ userId: connection.userId,
367
+ category: event.category,
368
+ type: event.type,
369
+ sourceName: event.sourceName,
370
+ durationSeconds: event.durationSeconds,
371
+ startDatetime: event.startDatetime,
372
+ endDatetime: event.endDatetime,
373
+ externalId: event.externalId,
374
+ heartRateAvg: event.heartRateAvg,
375
+ heartRateMax: event.heartRateMax,
376
+ energyBurned: event.energyBurned,
377
+ distance: event.distance,
378
+ stepsCount: event.stepsCount,
379
+ averageSpeed: event.averageSpeed,
380
+ maxSpeed: event.maxSpeed,
381
+ averageWatts: event.averageWatts,
382
+ maxWatts: event.maxWatts,
383
+ totalElevationGain: event.totalElevationGain,
384
+ movingTimeSeconds: event.movingTimeSeconds,
385
+ });
386
+ addSignal(signalBuckets, dataType, connection._id);
387
+ }
388
+ }
389
+ async function storeNormalizedDataPoints(ctx, dataSourceId, points) {
390
+ if (points.length === 0) {
391
+ return;
392
+ }
393
+ const grouped = new Map();
394
+ for (const point of points) {
395
+ const existing = grouped.get(point.seriesType) ?? [];
396
+ existing.push({
397
+ recordedAt: point.recordedAt,
398
+ value: point.value,
399
+ externalId: point.externalId,
400
+ });
401
+ grouped.set(point.seriesType, existing);
402
+ }
403
+ for (const [seriesType, seriesPoints] of grouped) {
404
+ for (let i = 0; i < seriesPoints.length; i += DATA_POINT_BATCH_SIZE) {
405
+ await ctx.runMutation(internal.dataPoints.storeBatch, {
406
+ dataSourceId,
407
+ seriesType,
408
+ points: seriesPoints.slice(i, i + DATA_POINT_BATCH_SIZE),
409
+ });
410
+ }
411
+ }
412
+ }
413
+ async function upsertSummary(ctx, userId, summary) {
414
+ if (!summary) {
415
+ return;
416
+ }
417
+ const { date, category, ...metrics } = summary;
418
+ if (typeof date !== "string" || typeof category !== "string") {
419
+ return;
420
+ }
421
+ const hasMetrics = Object.values(metrics).some((value) => value !== undefined && value !== null);
422
+ if (!hasMetrics) {
423
+ return;
424
+ }
425
+ await ctx.runMutation(internal.summaries.upsert, {
426
+ userId,
427
+ date,
428
+ category,
429
+ ...metrics,
430
+ });
431
+ }
432
+ function addSignal(signalBuckets, dataType, connectionId) {
433
+ const entries = signalBuckets.get(dataType) ?? new Set();
434
+ entries.add(connectionId);
435
+ signalBuckets.set(dataType, entries);
436
+ }
437
+ function getPayloadItemCount(payload, dataType) {
438
+ switch (dataType) {
439
+ case "activities":
440
+ return payload.activities?.length;
441
+ case "activityDetails":
442
+ return payload.activityDetails?.length;
443
+ case "sleeps":
444
+ return payload.sleeps?.length;
445
+ case "dailies":
446
+ return payload.dailies?.length;
447
+ case "epochs":
448
+ return payload.epochs?.length;
449
+ case "bodyComps":
450
+ return payload.bodyComps?.length;
451
+ case "hrv":
452
+ return payload.hrv?.length;
453
+ case "stressDetails":
454
+ return payload.stressDetails?.length;
455
+ case "respiration":
456
+ return payload.respiration?.length;
457
+ case "pulseOx":
458
+ return payload.pulseOx?.length;
459
+ case "bloodPressures":
460
+ return payload.bloodPressures?.length;
461
+ case "userMetrics":
462
+ return payload.userMetrics?.length;
463
+ case "skinTemp":
464
+ return payload.skinTemp?.length;
465
+ case "healthSnapshot":
466
+ return payload.healthSnapshot?.length;
467
+ case "moveiq":
468
+ return payload.moveiq?.length;
469
+ case "mct":
470
+ return payload.menstrualCycleTracking && payload.menstrualCycleTracking.length > 0
471
+ ? payload.menstrualCycleTracking.length
472
+ : payload.mct?.length;
473
+ default:
474
+ return undefined;
475
+ }
476
+ }
477
+ function isoDateFromTimestamp(timestampMs) {
478
+ return new Date(timestampMs).toISOString().split("T")[0] ?? "";
479
+ }
480
+ // ---------------------------------------------------------------------------
481
+ // Helpers
482
+ // ---------------------------------------------------------------------------
483
+ /**
484
+ * Resolve a Garmin userId to the internal userId via the connections table.
485
+ */
486
+ async function resolveConnection(ctx, garminUserId) {
487
+ const conn = await ctx.runQuery(internal.connections.getByProviderUser, {
488
+ provider: "garmin",
489
+ providerUserId: garminUserId,
490
+ });
491
+ return conn ?? null;
492
+ }
493
+ /**
494
+ * Resolve a Garmin userId to a dataSource ID, creating one if needed.
495
+ */
496
+ async function resolveDataSource(ctx, connection, deviceName) {
497
+ return await ctx.runMutation(api.dataSources.getOrCreate, {
498
+ userId: connection.userId,
499
+ provider: "garmin",
500
+ connectionId: connection._id,
501
+ deviceModel: deviceName,
502
+ source: "garmin",
503
+ });
504
+ }
505
+ //# sourceMappingURL=garminWebhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"garminWebhooks.js","sourceRoot":"","sources":["../../src/component/garminWebhooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * HTTP action handlers for OAuth callbacks and provider webhooks.
3
+ *
4
+ * These are Convex httpAction endpoints that handle:
5
+ * 1. OAuth callback redirects (GET /oauth/callback)
6
+ * 2. Provider webhook pushes (POST /webhooks/:provider)
7
+ */
8
+ /**
9
+ * Handles the OAuth redirect callback from a provider.
10
+ *
11
+ * Expected query params:
12
+ * - state: The OAuth state token
13
+ * - code: The authorization code
14
+ *
15
+ * The host app must mount this at a route and pass client credentials
16
+ * via the component configuration.
17
+ */
18
+ export declare const oauthCallback: import("convex/server").PublicHttpAction;
19
+ /**
20
+ * Strava webhook subscription verification.
21
+ * Strava sends a GET request with hub.challenge to verify the endpoint.
22
+ */
23
+ export declare const stravaWebhookVerify: import("convex/server").PublicHttpAction;
24
+ /**
25
+ * Handles incoming Strava webhook events.
26
+ *
27
+ * Strava pushes activity create/update/delete events here.
28
+ * We process activity creates/updates by fetching the full activity
29
+ * and storing it. Deletes are handled by removing the corresponding event.
30
+ */
31
+ export declare const stravaWebhookEvent: import("convex/server").PublicHttpAction;
32
+ //# sourceMappingURL=httpHandlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpHandlers.d.ts","sourceRoot":"","sources":["../../src/component/httpHandlers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,0CA2CxB,CAAC;AAMH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,0CAiB9B,CAAC;AAMH;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,0CA4C7B,CAAC"}