@nativesquare/soma 0.9.4 → 0.10.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 (197) hide show
  1. package/dist/client/index.d.ts +91 -33
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +79 -35
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/component/_generated/api.d.ts +18 -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 +43 -9
  9. package/dist/component/_generated/component.d.ts.map +1 -1
  10. package/dist/component/garmin/auth.d.ts +0 -4
  11. package/dist/component/garmin/auth.d.ts.map +1 -1
  12. package/dist/component/garmin/auth.js +0 -8
  13. package/dist/component/garmin/auth.js.map +1 -1
  14. package/dist/component/garmin/private.d.ts +1 -1
  15. package/dist/component/garmin/private.d.ts.map +1 -1
  16. package/dist/component/garmin/private.js +0 -9
  17. package/dist/component/garmin/private.js.map +1 -1
  18. package/dist/component/garmin/public.d.ts.map +1 -1
  19. package/dist/component/garmin/public.js +6 -1
  20. package/dist/component/garmin/public.js.map +1 -1
  21. package/dist/component/schema.d.ts +2 -2
  22. package/dist/component/schema.d.ts.map +1 -1
  23. package/dist/component/schema.js +5 -3
  24. package/dist/component/schema.js.map +1 -1
  25. package/dist/{strava → component/strava}/auth.d.ts +15 -48
  26. package/dist/component/strava/auth.d.ts.map +1 -0
  27. package/dist/{strava → component/strava}/auth.js +4 -39
  28. package/dist/component/strava/auth.js.map +1 -0
  29. package/dist/component/strava/client.d.ts +8 -0
  30. package/dist/component/strava/client.d.ts.map +1 -0
  31. package/dist/component/strava/client.js +18 -0
  32. package/dist/component/strava/client.js.map +1 -0
  33. package/dist/component/strava/private.d.ts +19 -0
  34. package/dist/component/strava/private.d.ts.map +1 -1
  35. package/dist/component/strava/private.js +52 -2
  36. package/dist/component/strava/private.js.map +1 -1
  37. package/dist/component/strava/public.d.ts +87 -12
  38. package/dist/component/strava/public.d.ts.map +1 -1
  39. package/dist/component/strava/public.js +218 -92
  40. package/dist/component/strava/public.js.map +1 -1
  41. package/dist/component/strava/transform/activity.d.ts +19 -0
  42. package/dist/component/strava/transform/activity.d.ts.map +1 -0
  43. package/dist/{strava → component/strava/transform}/activity.js +21 -41
  44. package/dist/component/strava/transform/activity.js.map +1 -0
  45. package/dist/{strava → component/strava/transform}/athlete.d.ts +4 -10
  46. package/dist/component/strava/transform/athlete.d.ts.map +1 -0
  47. package/dist/{strava → component/strava/transform}/athlete.js +2 -8
  48. package/dist/component/strava/transform/athlete.js.map +1 -0
  49. package/dist/component/strava/transform/maps/sportType.d.ts +7 -0
  50. package/dist/component/strava/transform/maps/sportType.d.ts.map +1 -0
  51. package/dist/{strava/maps/sport-type.js → component/strava/transform/maps/sportType.js} +4 -2
  52. package/dist/component/strava/transform/maps/sportType.js.map +1 -0
  53. package/dist/component/strava/types/stravaApi/client/client.gen.d.ts +3 -0
  54. package/dist/component/strava/types/stravaApi/client/client.gen.d.ts.map +1 -0
  55. package/dist/component/strava/types/stravaApi/client/client.gen.js +236 -0
  56. package/dist/component/strava/types/stravaApi/client/client.gen.js.map +1 -0
  57. package/dist/component/strava/types/stravaApi/client/index.d.ts +9 -0
  58. package/dist/component/strava/types/stravaApi/client/index.d.ts.map +1 -0
  59. package/dist/component/strava/types/stravaApi/client/index.js +7 -0
  60. package/dist/component/strava/types/stravaApi/client/index.js.map +1 -0
  61. package/dist/component/strava/types/stravaApi/client/types.gen.d.ts +118 -0
  62. package/dist/component/strava/types/stravaApi/client/types.gen.d.ts.map +1 -0
  63. package/dist/component/strava/types/stravaApi/client/types.gen.js +3 -0
  64. package/dist/component/strava/types/stravaApi/client/types.gen.js.map +1 -0
  65. package/dist/component/strava/types/stravaApi/client/utils.gen.d.ts +34 -0
  66. package/dist/component/strava/types/stravaApi/client/utils.gen.d.ts.map +1 -0
  67. package/dist/component/strava/types/stravaApi/client/utils.gen.js +229 -0
  68. package/dist/component/strava/types/stravaApi/client/utils.gen.js.map +1 -0
  69. package/dist/component/strava/types/stravaApi/client.gen.d.ts +13 -0
  70. package/dist/component/strava/types/stravaApi/client.gen.d.ts.map +1 -0
  71. package/dist/component/strava/types/stravaApi/client.gen.js +4 -0
  72. package/dist/component/strava/types/stravaApi/client.gen.js.map +1 -0
  73. package/dist/component/strava/types/stravaApi/core/auth.gen.d.ts +19 -0
  74. package/dist/component/strava/types/stravaApi/core/auth.gen.d.ts.map +1 -0
  75. package/dist/component/strava/types/stravaApi/core/auth.gen.js +15 -0
  76. package/dist/component/strava/types/stravaApi/core/auth.gen.js.map +1 -0
  77. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.d.ts +26 -0
  78. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.d.ts.map +1 -0
  79. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.js +58 -0
  80. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.js.map +1 -0
  81. package/dist/component/strava/types/stravaApi/core/params.gen.d.ts +44 -0
  82. package/dist/component/strava/types/stravaApi/core/params.gen.d.ts.map +1 -0
  83. package/dist/component/strava/types/stravaApi/core/params.gen.js +101 -0
  84. package/dist/component/strava/types/stravaApi/core/params.gen.js.map +1 -0
  85. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.d.ts +34 -0
  86. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.d.ts.map +1 -0
  87. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.js +107 -0
  88. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.js.map +1 -0
  89. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.d.ts +19 -0
  90. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.d.ts.map +1 -0
  91. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.js +93 -0
  92. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.js.map +1 -0
  93. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.d.ts +72 -0
  94. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.d.ts.map +1 -0
  95. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.js +134 -0
  96. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.js.map +1 -0
  97. package/dist/component/strava/types/stravaApi/core/types.gen.d.ts +79 -0
  98. package/dist/component/strava/types/stravaApi/core/types.gen.d.ts.map +1 -0
  99. package/dist/component/strava/types/stravaApi/core/types.gen.js +3 -0
  100. package/dist/component/strava/types/stravaApi/core/types.gen.js.map +1 -0
  101. package/dist/component/strava/types/stravaApi/core/utils.gen.d.ts +20 -0
  102. package/dist/component/strava/types/stravaApi/core/utils.gen.d.ts.map +1 -0
  103. package/dist/component/strava/types/stravaApi/core/utils.gen.js +88 -0
  104. package/dist/component/strava/types/stravaApi/core/utils.gen.js.map +1 -0
  105. package/dist/component/strava/types/stravaApi/index.d.ts +3 -0
  106. package/dist/component/strava/types/stravaApi/index.d.ts.map +1 -0
  107. package/dist/component/strava/types/stravaApi/index.js +3 -0
  108. package/dist/component/strava/types/stravaApi/index.js.map +1 -0
  109. package/dist/component/strava/types/stravaApi/sdk.gen.d.ts +224 -0
  110. package/dist/component/strava/types/stravaApi/sdk.gen.d.ts.map +1 -0
  111. package/dist/component/strava/types/stravaApi/sdk.gen.js +361 -0
  112. package/dist/component/strava/types/stravaApi/sdk.gen.js.map +1 -0
  113. package/dist/component/strava/types/stravaApi/types.gen.d.ts +2209 -0
  114. package/dist/component/strava/types/stravaApi/types.gen.d.ts.map +1 -0
  115. package/dist/component/strava/types/stravaApi/types.gen.js +3 -0
  116. package/dist/component/strava/types/stravaApi/types.gen.js.map +1 -0
  117. package/dist/component/strava/types/stravaApi/zod.gen.d.ts +5332 -0
  118. package/dist/component/strava/types/stravaApi/zod.gen.d.ts.map +1 -0
  119. package/dist/component/strava/types/stravaApi/zod.gen.js +1009 -0
  120. package/dist/component/strava/types/stravaApi/zod.gen.js.map +1 -0
  121. package/dist/component/strava/utils.d.ts +15 -0
  122. package/dist/component/strava/utils.d.ts.map +1 -0
  123. package/dist/component/strava/utils.js +36 -0
  124. package/dist/component/strava/utils.js.map +1 -0
  125. package/dist/component/utils.d.ts +5 -0
  126. package/dist/component/utils.d.ts.map +1 -0
  127. package/dist/component/utils.js +11 -0
  128. package/dist/component/utils.js.map +1 -0
  129. package/package.json +131 -130
  130. package/src/client/index.ts +121 -52
  131. package/src/component/_generated/api.ts +18 -0
  132. package/src/component/_generated/component.ts +44 -11
  133. package/src/component/garmin/auth.ts +0 -9
  134. package/src/component/garmin/private.ts +0 -12
  135. package/src/component/garmin/public.ts +8 -1
  136. package/src/component/schema.ts +5 -3
  137. package/src/{strava → component/strava}/auth.ts +143 -185
  138. package/src/component/strava/client.ts +20 -0
  139. package/src/component/strava/private.ts +147 -89
  140. package/src/component/strava/public.ts +268 -110
  141. package/src/{strava → component/strava/transform}/activity.ts +256 -276
  142. package/src/{strava → component/strava/transform}/athlete.ts +41 -47
  143. package/src/{strava/maps/sport-type.ts → component/strava/transform/maps/sportType.ts} +100 -99
  144. package/src/component/strava/types/specs/strava-api.json +4796 -0
  145. package/src/component/strava/types/stravaApi/client/client.gen.ts +290 -0
  146. package/src/component/strava/types/stravaApi/client/index.ts +25 -0
  147. package/src/component/strava/types/stravaApi/client/types.gen.ts +214 -0
  148. package/src/component/strava/types/stravaApi/client/utils.gen.ts +316 -0
  149. package/src/component/strava/types/stravaApi/client.gen.ts +16 -0
  150. package/src/component/strava/types/stravaApi/core/auth.gen.ts +41 -0
  151. package/src/component/strava/types/stravaApi/core/bodySerializer.gen.ts +82 -0
  152. package/src/component/strava/types/stravaApi/core/params.gen.ts +169 -0
  153. package/src/component/strava/types/stravaApi/core/pathSerializer.gen.ts +171 -0
  154. package/src/component/strava/types/stravaApi/core/queryKeySerializer.gen.ts +117 -0
  155. package/src/component/strava/types/stravaApi/core/serverSentEvents.gen.ts +243 -0
  156. package/src/component/strava/types/stravaApi/core/types.gen.ts +104 -0
  157. package/src/component/strava/types/stravaApi/core/utils.gen.ts +140 -0
  158. package/src/component/strava/types/stravaApi/index.ts +4 -0
  159. package/src/component/strava/types/stravaApi/sdk.gen.ts +410 -0
  160. package/src/component/strava/types/stravaApi/types.gen.ts +2435 -0
  161. package/src/component/strava/types/stravaApi/zod.gen.ts +1132 -0
  162. package/src/component/strava/utils.ts +52 -0
  163. package/src/component/utils.ts +11 -0
  164. package/dist/strava/activity.d.ts +0 -121
  165. package/dist/strava/activity.d.ts.map +0 -1
  166. package/dist/strava/activity.js.map +0 -1
  167. package/dist/strava/athlete.d.ts.map +0 -1
  168. package/dist/strava/athlete.js.map +0 -1
  169. package/dist/strava/auth.d.ts.map +0 -1
  170. package/dist/strava/auth.js.map +0 -1
  171. package/dist/strava/client.d.ts +0 -93
  172. package/dist/strava/client.d.ts.map +0 -1
  173. package/dist/strava/client.js +0 -158
  174. package/dist/strava/client.js.map +0 -1
  175. package/dist/strava/index.d.ts +0 -13
  176. package/dist/strava/index.d.ts.map +0 -1
  177. package/dist/strava/index.js +0 -17
  178. package/dist/strava/index.js.map +0 -1
  179. package/dist/strava/maps/sport-type.d.ts +0 -7
  180. package/dist/strava/maps/sport-type.d.ts.map +0 -1
  181. package/dist/strava/maps/sport-type.js.map +0 -1
  182. package/dist/strava/sync.d.ts +0 -104
  183. package/dist/strava/sync.d.ts.map +0 -1
  184. package/dist/strava/sync.js +0 -87
  185. package/dist/strava/sync.js.map +0 -1
  186. package/dist/strava/types.d.ts +0 -266
  187. package/dist/strava/types.d.ts.map +0 -1
  188. package/dist/strava/types.js +0 -8
  189. package/dist/strava/types.js.map +0 -1
  190. package/src/strava/activity.test.ts +0 -415
  191. package/src/strava/athlete.test.ts +0 -139
  192. package/src/strava/auth.test.ts +0 -78
  193. package/src/strava/client.ts +0 -212
  194. package/src/strava/index.ts +0 -54
  195. package/src/strava/maps/sport-type.test.ts +0 -69
  196. package/src/strava/sync.ts +0 -168
  197. package/src/strava/types.ts +0 -361
@@ -5,33 +5,73 @@
5
5
  import { v } from "convex/values";
6
6
  import { action } from "../_generated/server";
7
7
  import { api, internal } from "../_generated/api";
8
- import { StravaClient } from "../../strava/client";
9
- import { exchangeCode, refreshToken as refreshStravaToken, } from "../../strava/auth";
10
- import { transformActivity } from "../../strava/activity";
11
- import { transformAthlete } from "../../strava/athlete";
8
+ import { createStravaClient } from "./client.js";
9
+ import { listAllActivities } from "./utils.js";
10
+ import { getLoggedInAthlete, getActivityById, getActivityStreams, } from "./types/stravaApi/sdk.gen.js";
11
+ import { generateState } from "../utils.js";
12
+ import { buildAuthUrl, exchangeCode, refreshToken as refreshStravaToken, } from "./auth.js";
13
+ import { transformActivity } from "./transform/activity.js";
14
+ import { transformAthlete } from "./transform/athlete.js";
12
15
  // ─── Public Actions ──────────────────────────────────────────────────────────
13
16
  /**
14
- * Full Strava OAuth callback handler.
17
+ * Generate a Strava OAuth authorization URL.
18
+ *
19
+ * If `userId` is provided, the state parameter is stored in the component's
20
+ * `pendingOAuth` table so that `completeStravaOAuth` can look it up
21
+ * automatically when the callback fires. This is the recommended flow
22
+ * when using `registerRoutes`.
23
+ *
24
+ * If `userId` is omitted, the host app must store the returned `state`
25
+ * itself and pass the userId to `connectStrava` manually.
26
+ */
27
+ export const getStravaAuthUrl = action({
28
+ args: {
29
+ clientId: v.string(),
30
+ redirectUri: v.string(),
31
+ scope: v.optional(v.string()),
32
+ userId: v.optional(v.string()),
33
+ },
34
+ handler: async (ctx, args) => {
35
+ const state = generateState();
36
+ const authUrl = buildAuthUrl({
37
+ clientId: args.clientId,
38
+ redirectUri: args.redirectUri,
39
+ scope: args.scope,
40
+ state,
41
+ });
42
+ if (args.userId) {
43
+ await ctx.runMutation(internal.strava.private.storePendingOAuth, {
44
+ provider: "STRAVA",
45
+ state,
46
+ userId: args.userId,
47
+ });
48
+ }
49
+ return { authUrl, state };
50
+ },
51
+ });
52
+ /**
53
+ * Full Strava OAuth callback handler (manual flow).
15
54
  *
16
55
  * Exchanges the authorization code for tokens, creates/reactivates the
17
56
  * Soma connection, stores tokens securely, syncs the athlete profile,
18
57
  * and syncs all activities.
19
58
  *
59
+ * Used when the host app handles the callback itself and passes the
60
+ * userId directly (analogous to `connectGarmin`).
61
+ *
20
62
  * Returns `{ connectionId, synced, errors }`.
21
63
  */
22
64
  export const connectStrava = action({
23
65
  args: {
24
66
  userId: v.string(),
25
- code: v.string(),
26
67
  clientId: v.string(),
27
68
  clientSecret: v.string(),
28
- baseUrl: v.optional(v.string()),
29
- includeStreams: v.optional(v.boolean()),
69
+ code: v.string(),
30
70
  },
31
71
  returns: v.object({
32
72
  connectionId: v.string(),
33
- synced: v.number(),
34
- errors: v.array(v.object({ activityId: v.number(), error: v.string() })),
73
+ synced: v.object({ athletes: v.number(), activities: v.number() }),
74
+ errors: v.array(v.object({ type: v.string(), id: v.string(), error: v.string() })),
35
75
  }),
36
76
  handler: async (ctx, args) => {
37
77
  // 1. Exchange authorization code for tokens
@@ -39,7 +79,6 @@ export const connectStrava = action({
39
79
  clientId: args.clientId,
40
80
  clientSecret: args.clientSecret,
41
81
  code: args.code,
42
- baseUrl: args.baseUrl,
43
82
  });
44
83
  // 2. Create/reactivate the Soma connection
45
84
  const connectionId = await ctx.runMutation(api.public.connect, {
@@ -47,55 +86,91 @@ export const connectStrava = action({
47
86
  provider: "STRAVA",
48
87
  });
49
88
  // 3. Store OAuth tokens in providerTokens table
50
- const _stored = await ctx.runMutation(internal.strava.private.storeTokens, {
89
+ await ctx.runMutation(internal.strava.private.storeTokens, {
51
90
  connectionId,
52
91
  accessToken: tokens.access_token,
53
92
  refreshToken: tokens.refresh_token,
54
93
  expiresAt: tokens.expires_at,
55
94
  });
56
- // 4. Sync athlete profile
57
- const client = new StravaClient({
95
+ // 4. Sync all data types
96
+ const result = await ctx.runAction(api.strava.public.syncAllTypes, {
58
97
  accessToken: tokens.access_token,
59
- baseUrl: args.baseUrl,
60
- });
61
- const athlete = await client.getAthlete();
62
- const athleteData = transformAthlete(athlete);
63
- const _athleteId = await ctx.runMutation(api.public.ingestAthlete, {
64
98
  connectionId,
65
99
  userId: args.userId,
66
- ...athleteData,
67
100
  });
68
- // 5. Sync all activities
69
- const summaries = await client.listAllActivities();
70
- let synced = 0;
71
- const errors = [];
72
- for (const summary of summaries) {
73
- try {
74
- const detailed = await client.getActivity(summary.id);
75
- const streams = args.includeStreams
76
- ? await client.getActivityStreams(summary.id)
77
- : undefined;
78
- const data = transformActivity(detailed, { streams });
79
- const _activityId = await ctx.runMutation(api.public.ingestActivity, {
80
- connectionId,
81
- userId: args.userId,
82
- ...data,
83
- });
84
- synced++;
85
- }
86
- catch (err) {
87
- errors.push({
88
- activityId: summary.id,
89
- error: err instanceof Error ? err.message : String(err),
90
- });
91
- }
101
+ // 5. Update lastDataUpdate timestamp
102
+ await ctx.runMutation(api.public.updateConnection, {
103
+ connectionId,
104
+ lastDataUpdate: new Date().toISOString(),
105
+ });
106
+ return { connectionId, synced: result.synced, errors: result.errors };
107
+ },
108
+ });
109
+ /**
110
+ * Complete a Strava OAuth flow using stored pending state.
111
+ *
112
+ * Used by `registerRoutes` — the callback handler calls this with the
113
+ * `code` and `state` from the redirect. The action looks up the pending
114
+ * state (userId) stored during `getStravaAuthUrl`, exchanges for tokens,
115
+ * creates the connection, syncs data, and cleans up the pending entry.
116
+ */
117
+ export const completeStravaOAuth = action({
118
+ args: {
119
+ code: v.string(),
120
+ state: v.string(),
121
+ clientId: v.string(),
122
+ clientSecret: v.string(),
123
+ },
124
+ returns: v.object({
125
+ connectionId: v.string(),
126
+ userId: v.string(),
127
+ synced: v.object({ athletes: v.number(), activities: v.number() }),
128
+ errors: v.array(v.object({ type: v.string(), id: v.string(), error: v.string() })),
129
+ }),
130
+ handler: async (ctx, args) => {
131
+ // 1. Look up pending state
132
+ const pending = await ctx.runQuery(internal.strava.private.getPendingOAuth, { state: args.state });
133
+ if (!pending) {
134
+ throw new Error("No pending Strava OAuth state found for this state parameter. " +
135
+ "The authorization may have expired or was already used.");
92
136
  }
93
- // 6. Update lastDataUpdate timestamp
94
- const _updated = await ctx.runMutation(api.public.updateConnection, {
137
+ // 2. Exchange authorization code for tokens
138
+ const tokens = await exchangeCode({
139
+ clientId: args.clientId,
140
+ clientSecret: args.clientSecret,
141
+ code: args.code,
142
+ });
143
+ // 3. Clean up pending entry
144
+ await ctx.runMutation(internal.strava.private.deletePendingOAuth, { state: args.state });
145
+ // 4. Create/reactivate the Soma connection
146
+ const connectionId = await ctx.runMutation(api.public.connect, {
147
+ userId: pending.userId,
148
+ provider: "STRAVA",
149
+ });
150
+ // 5. Store OAuth tokens
151
+ await ctx.runMutation(internal.strava.private.storeTokens, {
152
+ connectionId,
153
+ accessToken: tokens.access_token,
154
+ refreshToken: tokens.refresh_token,
155
+ expiresAt: tokens.expires_at,
156
+ });
157
+ // 6. Sync all data types
158
+ const result = await ctx.runAction(api.strava.public.syncAllTypes, {
159
+ accessToken: tokens.access_token,
160
+ connectionId,
161
+ userId: pending.userId,
162
+ });
163
+ // 7. Update lastDataUpdate timestamp
164
+ await ctx.runMutation(api.public.updateConnection, {
95
165
  connectionId,
96
166
  lastDataUpdate: new Date().toISOString(),
97
167
  });
98
- return { connectionId, synced, errors };
168
+ return {
169
+ connectionId,
170
+ userId: pending.userId,
171
+ synced: result.synced,
172
+ errors: result.errors,
173
+ };
99
174
  },
100
175
  });
101
176
  /**
@@ -111,13 +186,11 @@ export const syncStrava = action({
111
186
  userId: v.string(),
112
187
  clientId: v.string(),
113
188
  clientSecret: v.string(),
114
- baseUrl: v.optional(v.string()),
115
- includeStreams: v.optional(v.boolean()),
116
189
  after: v.optional(v.number()),
117
190
  },
118
191
  returns: v.object({
119
- synced: v.number(),
120
- errors: v.array(v.object({ activityId: v.number(), error: v.string() })),
192
+ synced: v.object({ athletes: v.number(), activities: v.number() }),
193
+ errors: v.array(v.object({ type: v.string(), id: v.string(), error: v.string() })),
121
194
  }),
122
195
  handler: async (ctx, args) => {
123
196
  // 1. Look up connection
@@ -148,64 +221,119 @@ export const syncStrava = action({
148
221
  clientId: args.clientId,
149
222
  clientSecret: args.clientSecret,
150
223
  refreshToken: tokenDoc.refreshToken,
151
- baseUrl: args.baseUrl,
152
224
  });
153
225
  accessToken = refreshed.access_token;
154
- const _refreshed = await ctx.runMutation(internal.strava.private.storeTokens, {
226
+ await ctx.runMutation(internal.strava.private.storeTokens, {
155
227
  connectionId,
156
228
  accessToken: refreshed.access_token,
157
229
  refreshToken: refreshed.refresh_token,
158
230
  expiresAt: refreshed.expires_at,
159
231
  });
160
232
  }
161
- // 4. Create client and sync
162
- const client = new StravaClient({
233
+ // 4. Sync all data types
234
+ const result = await ctx.runAction(api.strava.public.syncAllTypes, {
163
235
  accessToken,
164
- baseUrl: args.baseUrl,
165
- });
166
- // Sync athlete profile
167
- const athlete = await client.getAthlete();
168
- const athleteData = transformAthlete(athlete);
169
- const _athleteId = await ctx.runMutation(api.public.ingestAthlete, {
170
236
  connectionId,
171
237
  userId: args.userId,
172
- ...athleteData,
173
- });
174
- // Sync activities (optionally incremental via `after`)
175
- const summaries = await client.listAllActivities({
176
238
  after: args.after,
177
239
  });
178
- let synced = 0;
179
- const errors = [];
180
- for (const summary of summaries) {
181
- try {
182
- const detailed = await client.getActivity(summary.id);
183
- const streams = args.includeStreams
184
- ? await client.getActivityStreams(summary.id)
185
- : undefined;
186
- const data = transformActivity(detailed, { streams });
187
- const _activityId = await ctx.runMutation(api.public.ingestActivity, {
188
- connectionId,
189
- userId: args.userId,
190
- ...data,
191
- });
192
- synced++;
193
- }
194
- catch (err) {
195
- errors.push({
196
- activityId: summary.id,
197
- error: err instanceof Error ? err.message : String(err),
198
- });
199
- }
200
- }
201
240
  // 5. Update lastDataUpdate timestamp
202
- const _updated = await ctx.runMutation(api.public.updateConnection, {
241
+ await ctx.runMutation(api.public.updateConnection, {
203
242
  connectionId,
204
243
  lastDataUpdate: new Date().toISOString(),
205
244
  });
245
+ return { synced: result.synced, errors: result.errors };
246
+ },
247
+ });
248
+ // ─── Sync Engine ────────────────────────────────────────────────────────────
249
+ /**
250
+ * Fetch and ingest all Strava data types for a connected user.
251
+ *
252
+ * Called by the public actions (connectStrava, completeStravaOAuth, syncStrava)
253
+ * after obtaining a valid access token.
254
+ */
255
+ export const syncAllTypes = action({
256
+ args: {
257
+ accessToken: v.string(),
258
+ connectionId: v.id("connections"),
259
+ userId: v.string(),
260
+ after: v.optional(v.number()),
261
+ before: v.optional(v.number()),
262
+ },
263
+ handler: async (ctx, args) => {
264
+ const { accessToken, connectionId, userId } = args;
265
+ const client = createStravaClient(accessToken);
266
+ const synced = { athletes: 0, activities: 0 };
267
+ const errors = [];
268
+ // ── Athlete ──────────────────────────────────────────────────────────
269
+ try {
270
+ const { data: athlete, error } = await getLoggedInAthlete({ client });
271
+ if (error || !athlete)
272
+ throw new Error(error ? JSON.stringify(error) : "No athlete data");
273
+ const data = transformAthlete(athlete);
274
+ await ctx.runMutation(api.public.ingestAthlete, {
275
+ connectionId,
276
+ userId,
277
+ ...data,
278
+ });
279
+ synced.athletes++;
280
+ }
281
+ catch (err) {
282
+ errors.push({
283
+ type: "athlete",
284
+ id: "fetch",
285
+ error: err instanceof Error ? err.message : String(err),
286
+ });
287
+ }
288
+ // ── Activities ───────────────────────────────────────────────────────
289
+ try {
290
+ const summaries = await listAllActivities(client, {
291
+ after: args.after,
292
+ before: args.before,
293
+ });
294
+ for (const summary of summaries) {
295
+ if (summary.id == null)
296
+ continue;
297
+ try {
298
+ const { data: detailed, error: detailError } = await getActivityById({ client, path: { id: summary.id } });
299
+ if (detailError || !detailed)
300
+ throw new Error(detailError ? JSON.stringify(detailError) : "No activity data");
301
+ const { data: streams } = await getActivityStreams({
302
+ client,
303
+ path: { id: summary.id },
304
+ query: {
305
+ keys: ["time", "heartrate", "watts", "cadence", "latlng", "altitude", "velocity_smooth", "grade_smooth", "distance", "temp"],
306
+ key_by_type: true,
307
+ },
308
+ });
309
+ const data = transformActivity(detailed, { streams: streams ?? undefined });
310
+ await ctx.runMutation(api.public.ingestActivity, {
311
+ connectionId,
312
+ userId,
313
+ ...data,
314
+ });
315
+ synced.activities++;
316
+ }
317
+ catch (err) {
318
+ errors.push({
319
+ type: "activity",
320
+ id: String(summary.id),
321
+ error: err instanceof Error ? err.message : String(err),
322
+ });
323
+ }
324
+ }
325
+ }
326
+ catch (err) {
327
+ errors.push({
328
+ type: "activity",
329
+ id: "fetch",
330
+ error: err instanceof Error ? err.message : String(err),
331
+ });
332
+ }
206
333
  return { synced, errors };
207
334
  },
208
335
  });
336
+ // ─── Disconnect ─────────────────────────────────────────────────────────────
209
337
  /**
210
338
  * Disconnect a user from Strava.
211
339
  *
@@ -217,7 +345,6 @@ export const disconnectStrava = action({
217
345
  userId: v.string(),
218
346
  clientId: v.string(),
219
347
  clientSecret: v.string(),
220
- baseUrl: v.optional(v.string()),
221
348
  },
222
349
  returns: v.null(),
223
350
  handler: async (ctx, args) => {
@@ -231,8 +358,7 @@ export const disconnectStrava = action({
231
358
  const tokenDoc = await ctx.runQuery(internal.strava.private.getTokens, { connectionId });
232
359
  if (tokenDoc) {
233
360
  try {
234
- const base = (args.baseUrl ?? "https://www.strava.com").replace(/\/+$/, "");
235
- await fetch(`${base}/oauth/deauthorize`, {
361
+ await fetch("https://www.strava.com/oauth/deauthorize", {
236
362
  method: "POST",
237
363
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
238
364
  body: `access_token=${tokenDoc.accessToken}`,
@@ -1 +1 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/component/strava/public.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/component/strava/public.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qEAAqE;AACrE,qEAAqE;AACrE,iEAAiE;AAEjE,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,IAAI,kBAAkB,GACnC,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,gFAAgF;AAEhF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAG,YAAY,CAAC;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE;gBAC/D,QAAQ,EAAE,QAAQ;gBAClB,KAAK;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;IAClC,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAClE;KACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAItB,EAAE;QACH,4CAA4C;QAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,YAAY,GAAsB,MAAM,GAAG,CAAC,WAAW,CAC3D,GAAG,CAAC,MAAM,CAAC,OAAO,EAClB;YACE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,QAAQ;SACnB,CACF,CAAC;QAEF,gDAAgD;QAChD,MAAM,GAAG,CAAC,WAAW,CACnB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EACnC;YACE,YAAY;YACZ,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,YAAY,EAAE,MAAM,CAAC,aAAa;YAClC,SAAS,EAAE,MAAM,CAAC,UAAU;SAC7B,CACF,CAAC;QAEF,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YACjE,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,YAAY;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,GAAG,CAAC,WAAW,CACnB,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAC3B;YACE,YAAY;YACZ,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,CACF,CAAC;QAEF,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACxE,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAClE;KACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAKtB,EAAE;QACH,2BAA2B;QAC3B,MAAM,OAAO,GAA+B,MAAM,GAAG,CAAC,QAAQ,CAC5D,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EACvC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CACtB,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,gEAAgE;gBAChE,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QAEH,4BAA4B;QAC5B,MAAM,GAAG,CAAC,WAAW,CACnB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAC1C,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CACtB,CAAC;QAEF,2CAA2C;QAC3C,MAAM,YAAY,GAAsB,MAAM,GAAG,CAAC,WAAW,CAC3D,GAAG,CAAC,MAAM,CAAC,OAAO,EAClB;YACE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,QAAQ;SACnB,CACF,CAAC;QAEF,wBAAwB;QACxB,MAAM,GAAG,CAAC,WAAW,CACnB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EACnC;YACE,YAAY;YACZ,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,YAAY,EAAE,MAAM,CAAC,aAAa;YAClC,SAAS,EAAE,MAAM,CAAC,UAAU;SAC7B,CACF,CAAC;QAEF,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YACjE,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,YAAY;YACZ,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,GAAG,CAAC,WAAW,CACnB,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAC3B;YACE,YAAY;YACZ,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,CACF,CAAC;QAEF,OAAO;YACL,YAAY;YACZ,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAClE;KACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAGtB,EAAE;QACH,wBAAwB;QACxB,MAAM,UAAU,GAA8B,MAAM,GAAG,CAAC,QAAQ,CAC9D,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EACxC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAC5C,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,MAAM,KAAK;gBACxD,2BAA2B,CAC5B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,MAAM,iCAAiC,CAC5E,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC;QAEpC,uBAAuB;QACvB,MAAM,QAAQ,GAAiC,MAAM,GAAG,CAAC,QAAQ,CAC/D,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EACjC,EAAE,YAAY,EAAE,CACjB,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,yCAAyC;gBACzC,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,IAAI,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CACb,uDAAuD;gBACvD,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC;gBACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;aACpC,CAAC,CAAC;YACH,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC;YACrC,MAAM,GAAG,CAAC,WAAW,CACnB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EACnC;gBACE,YAAY;gBACZ,WAAW,EAAE,SAAS,CAAC,YAAY;gBACnC,YAAY,EAAE,SAAS,CAAC,aAAa;gBACrC,SAAS,EAAE,SAAS,CAAC,UAAU;aAChC,CACF,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YACjE,WAAW;YACX,YAAY;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,GAAG,CAAC,WAAW,CACnB,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAC3B;YACE,YAAY;YACZ,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,CACF,CAAC;QAEF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;IACjC,IAAI,EAAE;QACJ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACnD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAuD,EAAE,CAAC;QAEtE,wEAAwE;QACxE,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACtE,IAAI,KAAK,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE;gBAC9C,YAAY;gBACZ,MAAM;gBACN,GAAG,IAAI;aACC,CAAC,CAAC;YACZ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE;gBAChD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;gBAChC,IAAI,OAAO,CAAC,EAAE,IAAI,IAAI;oBAAE,SAAS;gBACjC,IAAI,CAAC;oBACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3G,IAAI,WAAW,IAAI,CAAC,QAAQ;wBAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;oBAE9G,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC;wBACjD,MAAM;wBACN,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;wBACxB,KAAK,EAAE;4BACL,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC;4BAC5H,WAAW,EAAE,IAAI;yBAClB;qBACF,CAAC,CAAC;oBAEH,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;oBAC5E,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE;wBAC/C,YAAY;wBACZ,MAAM;wBACN,GAAG,IAAI;qBACC,CAAC,CAAC;oBACZ,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;wBACtB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IACrC,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,wBAAwB;QACxB,MAAM,UAAU,GAA8B,MAAM,GAAG,CAAC,QAAQ,CAC9D,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EACxC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAC5C,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,MAAM,IAAI,CACxD,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC;QAEpC,mEAAmE;QACnE,MAAM,QAAQ,GAAiC,MAAM,GAAG,CAAC,QAAQ,CAC/D,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EACjC,EAAE,YAAY,EAAE,CACjB,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,0CAA0C,EAAE;oBACtD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;oBAChE,IAAI,EAAE,gBAAgB,QAAQ,CAAC,WAAW,EAAE;iBAC7C,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,+DAA+D;YACjE,CAAC;YAED,0BAA0B;YAC1B,MAAM,QAAQ,GAAS,MAAM,GAAG,CAAC,WAAW,CAC1C,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EACpC,EAAE,YAAY,EAAE,CACjB,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,aAAa,GAAS,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;YACvE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { DetailedActivity, SummaryActivity, StreamSet, Lap } from "../types/stravaApi/types.gen.js";
2
+ import type { SomaActivity } from "../../validators/activity.js";
3
+ /**
4
+ * Transform a Strava activity into a Soma Activity document shape.
5
+ *
6
+ * The returned object is ready to be spread into an `ingestActivity` call
7
+ * alongside `connectionId` and `userId`.
8
+ *
9
+ * Accepts either a DetailedActivity (from `GET /activities/{id}`) or a
10
+ * SummaryActivity (from `GET /athlete/activities`). When a DetailedActivity
11
+ * is provided, additional fields like `calories`, `segment_efforts`, and
12
+ * embedded `laps` are mapped. Optional streams and laps can also be supplied
13
+ * for time-series data (heart rate, power, position, etc.).
14
+ */
15
+ export declare function transformActivity(activity: DetailedActivity | SummaryActivity, opts?: {
16
+ streams?: StreamSet;
17
+ laps?: Lap[];
18
+ }): SomaActivity;
19
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../../src/component/strava/transform/activity.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACzG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,gBAAgB,GAAG,eAAe,EAC5C,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;CAAE,GAC3C,YAAY,CAsDd"}
@@ -1,7 +1,7 @@
1
1
  // ─── Activity Transformer ────────────────────────────────────────────────────
2
2
  // Transforms a Strava DetailedActivity (+ optional streams/laps) into the
3
3
  // Soma Activity schema shape.
4
- import { mapSportType } from "./maps/sport-type.js";
4
+ import { mapSportType } from "./maps/sportType.js";
5
5
  /**
6
6
  * Transform a Strava activity into a Soma Activity document shape.
7
7
  *
@@ -13,18 +13,11 @@ import { mapSportType } from "./maps/sport-type.js";
13
13
  * is provided, additional fields like `calories`, `segment_efforts`, and
14
14
  * embedded `laps` are mapped. Optional streams and laps can also be supplied
15
15
  * for time-series data (heart rate, power, position, etc.).
16
- *
17
- * @param activity - The Strava activity (summary or detailed)
18
- * @param opts - Optional streams and laps data
19
- * @returns Soma Activity fields (without connectionId/userId)
20
- *
21
- * @example
22
- * ```ts
23
- * const data = transformActivity(stravaActivity, { streams, laps });
24
- * await soma.ingestActivity(ctx, { connectionId, userId, ...data });
25
- * ```
26
16
  */
27
17
  export function transformActivity(activity, opts) {
18
+ if (activity.id == null || !activity.start_date || activity.elapsed_time == null) {
19
+ throw new Error(`Strava activity missing required fields (id=${activity.id}, start_date=${activity.start_date}, elapsed_time=${activity.elapsed_time})`);
20
+ }
28
21
  const streams = opts?.streams;
29
22
  const laps = opts?.laps ?? (isDetailed(activity) ? activity.laps : undefined);
30
23
  const timeStream = streams?.time?.data;
@@ -36,14 +29,11 @@ export function transformActivity(activity, opts) {
36
29
  end_time: computeEndTime(activity.start_date, activity.elapsed_time),
37
30
  type: mapSportType(activity.sport_type),
38
31
  upload_type: activity.manual ? 2 : 1, // 2=Manual, 1=Automatic
39
- name: activity.name,
40
- city: activity.location_city ?? undefined,
41
- state: activity.location_state ?? undefined,
42
- country: activity.location_country ?? undefined,
43
- },
44
- active_durations_data: {
45
- activity_seconds: activity.moving_time,
32
+ name: activity.name ?? undefined,
46
33
  },
34
+ active_durations_data: activity.moving_time != null
35
+ ? { activity_seconds: activity.moving_time }
36
+ : undefined,
47
37
  calories_data: isDetailed(activity) && activity.calories != null
48
38
  ? { total_burned_calories: activity.calories }
49
39
  : undefined,
@@ -54,7 +44,7 @@ export function transformActivity(activity, opts) {
54
44
  energy_data: activity.kilojoules != null
55
45
  ? { energy_kilojoules: activity.kilojoules }
56
46
  : undefined,
57
- heart_rate_data: buildHeartRateData(activity, streams, timeStream, startDate),
47
+ heart_rate_data: buildHeartRateData(streams, timeStream, startDate),
58
48
  lap_data: buildLapData(laps),
59
49
  movement_data: buildMovementData(activity, streams, timeStream, startDate),
60
50
  polyline_map_data: activity.map?.summary_polyline
@@ -66,7 +56,7 @@ export function transformActivity(activity, opts) {
66
56
  }
67
57
  // ─── Helpers ─────────────────────────────────────────────────────────────────
68
58
  function isDetailed(activity) {
69
- return activity.resource_state === 3;
59
+ return "description" in activity;
70
60
  }
71
61
  function computeEndTime(startDate, elapsedTimeSeconds) {
72
62
  const start = new Date(startDate);
@@ -84,34 +74,26 @@ function buildDistanceData(activity) {
84
74
  if (activity.distance == null && activity.total_elevation_gain == null) {
85
75
  return undefined;
86
76
  }
87
- const detailed = isDetailed(activity) ? activity : undefined;
88
77
  return {
89
78
  summary: {
90
79
  distance_meters: activity.distance ?? undefined,
91
80
  elevation: activity.total_elevation_gain != null
92
81
  ? {
93
82
  gain_actual_meters: activity.total_elevation_gain,
94
- max_meters: detailed?.elev_high ?? undefined,
95
- min_meters: detailed?.elev_low ?? undefined,
83
+ max_meters: activity.elev_high ?? undefined,
84
+ min_meters: activity.elev_low ?? undefined,
96
85
  }
97
86
  : undefined,
98
87
  },
99
88
  };
100
89
  }
101
- function buildHeartRateData(activity, streams, timeStream, startDate) {
102
- const hasHrSummary = activity.average_heartrate != null || activity.max_heartrate != null;
90
+ function buildHeartRateData(streams, timeStream, startDate) {
103
91
  const hrStream = streams?.heartrate?.data;
104
92
  const hasHrStream = hrStream && hrStream.length > 0 && timeStream;
105
- if (!hasHrSummary && !hasHrStream)
93
+ if (!hasHrStream)
106
94
  return undefined;
107
95
  return {
108
- summary: hasHrSummary
109
- ? {
110
- avg_hr_bpm: activity.average_heartrate,
111
- max_hr_bpm: activity.max_heartrate,
112
- }
113
- : undefined,
114
- detailed: hasHrStream && timeStream
96
+ detailed: timeStream
115
97
  ? {
116
98
  hr_samples: hrStream.map((bpm, i) => ({
117
99
  timestamp: streamTimestamp(startDate, timeStream[i]),
@@ -125,20 +107,19 @@ function buildLapData(laps) {
125
107
  if (!laps || laps.length === 0)
126
108
  return undefined;
127
109
  return {
128
- laps: laps.map((lap) => ({
110
+ laps: laps
111
+ .filter((lap) => lap.start_date && lap.elapsed_time != null)
112
+ .map((lap) => ({
129
113
  start_time: lap.start_date,
130
114
  end_time: computeEndTime(lap.start_date, lap.elapsed_time),
131
- distance_meters: lap.distance,
115
+ distance_meters: lap.distance ?? undefined,
132
116
  calories: undefined,
133
- avg_speed_meters_per_second: lap.average_speed,
134
- avg_hr_bpm: lap.average_heartrate,
117
+ avg_speed_meters_per_second: lap.average_speed ?? undefined,
135
118
  })),
136
119
  };
137
120
  }
138
121
  function buildMovementData(activity, streams, timeStream, startDate) {
139
- const hasMovement = activity.average_speed != null ||
140
- activity.max_speed != null ||
141
- activity.average_cadence != null;
122
+ const hasMovement = activity.average_speed != null || activity.max_speed != null;
142
123
  const speedStream = streams?.velocity_smooth?.data;
143
124
  const cadenceStream = streams?.cadence?.data;
144
125
  const hasStreams = ((speedStream && speedStream.length > 0) ||
@@ -149,7 +130,6 @@ function buildMovementData(activity, streams, timeStream, startDate) {
149
130
  return {
150
131
  avg_speed_meters_per_second: activity.average_speed ?? undefined,
151
132
  max_speed_meters_per_second: activity.max_speed ?? undefined,
152
- avg_cadence_rpm: activity.average_cadence ?? undefined,
153
133
  speed_samples: speedStream && timeStream
154
134
  ? speedStream.map((speed, i) => ({
155
135
  timestamp: streamTimestamp(startDate, timeStream[i]),
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../../src/component/strava/transform/activity.ts"],"names":[],"mappings":"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"}