@nativesquare/soma 0.9.4 → 0.10.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 (203) hide show
  1. package/dist/client/index.d.ts +124 -144
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +157 -134
  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 +113 -22
  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 +10 -1
  15. package/dist/component/garmin/private.d.ts.map +1 -1
  16. package/dist/component/garmin/private.js +49 -9
  17. package/dist/component/garmin/private.js.map +1 -1
  18. package/dist/component/garmin/public.d.ts +237 -62
  19. package/dist/component/garmin/public.d.ts.map +1 -1
  20. package/dist/component/garmin/public.js +689 -254
  21. package/dist/component/garmin/public.js.map +1 -1
  22. package/dist/component/garmin/utils.d.ts +8 -0
  23. package/dist/component/garmin/utils.d.ts.map +1 -1
  24. package/dist/component/garmin/utils.js +9 -0
  25. package/dist/component/garmin/utils.js.map +1 -1
  26. package/dist/component/schema.d.ts +2 -2
  27. package/dist/component/schema.d.ts.map +1 -1
  28. package/dist/component/schema.js +5 -3
  29. package/dist/component/schema.js.map +1 -1
  30. package/dist/{strava → component/strava}/auth.d.ts +15 -48
  31. package/dist/component/strava/auth.d.ts.map +1 -0
  32. package/dist/{strava → component/strava}/auth.js +4 -39
  33. package/dist/component/strava/auth.js.map +1 -0
  34. package/dist/component/strava/client.d.ts +8 -0
  35. package/dist/component/strava/client.d.ts.map +1 -0
  36. package/dist/component/strava/client.js +18 -0
  37. package/dist/component/strava/client.js.map +1 -0
  38. package/dist/component/strava/private.d.ts +19 -0
  39. package/dist/component/strava/private.d.ts.map +1 -1
  40. package/dist/component/strava/private.js +52 -2
  41. package/dist/component/strava/private.js.map +1 -1
  42. package/dist/component/strava/public.d.ts +54 -19
  43. package/dist/component/strava/public.d.ts.map +1 -1
  44. package/dist/component/strava/public.js +159 -109
  45. package/dist/component/strava/public.js.map +1 -1
  46. package/dist/component/strava/transform/activity.d.ts +19 -0
  47. package/dist/component/strava/transform/activity.d.ts.map +1 -0
  48. package/dist/{strava → component/strava/transform}/activity.js +31 -45
  49. package/dist/component/strava/transform/activity.js.map +1 -0
  50. package/dist/{strava → component/strava/transform}/athlete.d.ts +4 -10
  51. package/dist/component/strava/transform/athlete.d.ts.map +1 -0
  52. package/dist/{strava → component/strava/transform}/athlete.js +2 -8
  53. package/dist/component/strava/transform/athlete.js.map +1 -0
  54. package/dist/component/strava/transform/maps/sportType.d.ts +7 -0
  55. package/dist/component/strava/transform/maps/sportType.d.ts.map +1 -0
  56. package/dist/{strava/maps/sport-type.js → component/strava/transform/maps/sportType.js} +4 -2
  57. package/dist/component/strava/transform/maps/sportType.js.map +1 -0
  58. package/dist/component/strava/types/stravaApi/client/client.gen.d.ts +3 -0
  59. package/dist/component/strava/types/stravaApi/client/client.gen.d.ts.map +1 -0
  60. package/dist/component/strava/types/stravaApi/client/client.gen.js +236 -0
  61. package/dist/component/strava/types/stravaApi/client/client.gen.js.map +1 -0
  62. package/dist/component/strava/types/stravaApi/client/index.d.ts +9 -0
  63. package/dist/component/strava/types/stravaApi/client/index.d.ts.map +1 -0
  64. package/dist/component/strava/types/stravaApi/client/index.js +7 -0
  65. package/dist/component/strava/types/stravaApi/client/index.js.map +1 -0
  66. package/dist/component/strava/types/stravaApi/client/types.gen.d.ts +118 -0
  67. package/dist/component/strava/types/stravaApi/client/types.gen.d.ts.map +1 -0
  68. package/dist/component/strava/types/stravaApi/client/types.gen.js +3 -0
  69. package/dist/component/strava/types/stravaApi/client/types.gen.js.map +1 -0
  70. package/dist/component/strava/types/stravaApi/client/utils.gen.d.ts +34 -0
  71. package/dist/component/strava/types/stravaApi/client/utils.gen.d.ts.map +1 -0
  72. package/dist/component/strava/types/stravaApi/client/utils.gen.js +229 -0
  73. package/dist/component/strava/types/stravaApi/client/utils.gen.js.map +1 -0
  74. package/dist/component/strava/types/stravaApi/client.gen.d.ts +13 -0
  75. package/dist/component/strava/types/stravaApi/client.gen.d.ts.map +1 -0
  76. package/dist/component/strava/types/stravaApi/client.gen.js +4 -0
  77. package/dist/component/strava/types/stravaApi/client.gen.js.map +1 -0
  78. package/dist/component/strava/types/stravaApi/core/auth.gen.d.ts +19 -0
  79. package/dist/component/strava/types/stravaApi/core/auth.gen.d.ts.map +1 -0
  80. package/dist/component/strava/types/stravaApi/core/auth.gen.js +15 -0
  81. package/dist/component/strava/types/stravaApi/core/auth.gen.js.map +1 -0
  82. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.d.ts +26 -0
  83. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.d.ts.map +1 -0
  84. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.js +58 -0
  85. package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.js.map +1 -0
  86. package/dist/component/strava/types/stravaApi/core/params.gen.d.ts +44 -0
  87. package/dist/component/strava/types/stravaApi/core/params.gen.d.ts.map +1 -0
  88. package/dist/component/strava/types/stravaApi/core/params.gen.js +101 -0
  89. package/dist/component/strava/types/stravaApi/core/params.gen.js.map +1 -0
  90. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.d.ts +34 -0
  91. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.d.ts.map +1 -0
  92. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.js +107 -0
  93. package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.js.map +1 -0
  94. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.d.ts +19 -0
  95. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.d.ts.map +1 -0
  96. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.js +93 -0
  97. package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.js.map +1 -0
  98. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.d.ts +72 -0
  99. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.d.ts.map +1 -0
  100. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.js +134 -0
  101. package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.js.map +1 -0
  102. package/dist/component/strava/types/stravaApi/core/types.gen.d.ts +79 -0
  103. package/dist/component/strava/types/stravaApi/core/types.gen.d.ts.map +1 -0
  104. package/dist/component/strava/types/stravaApi/core/types.gen.js +3 -0
  105. package/dist/component/strava/types/stravaApi/core/types.gen.js.map +1 -0
  106. package/dist/component/strava/types/stravaApi/core/utils.gen.d.ts +20 -0
  107. package/dist/component/strava/types/stravaApi/core/utils.gen.d.ts.map +1 -0
  108. package/dist/component/strava/types/stravaApi/core/utils.gen.js +88 -0
  109. package/dist/component/strava/types/stravaApi/core/utils.gen.js.map +1 -0
  110. package/dist/component/strava/types/stravaApi/index.d.ts +3 -0
  111. package/dist/component/strava/types/stravaApi/index.d.ts.map +1 -0
  112. package/dist/component/strava/types/stravaApi/index.js +3 -0
  113. package/dist/component/strava/types/stravaApi/index.js.map +1 -0
  114. package/dist/component/strava/types/stravaApi/sdk.gen.d.ts +224 -0
  115. package/dist/component/strava/types/stravaApi/sdk.gen.d.ts.map +1 -0
  116. package/dist/component/strava/types/stravaApi/sdk.gen.js +361 -0
  117. package/dist/component/strava/types/stravaApi/sdk.gen.js.map +1 -0
  118. package/dist/component/strava/types/stravaApi/types.gen.d.ts +2209 -0
  119. package/dist/component/strava/types/stravaApi/types.gen.d.ts.map +1 -0
  120. package/dist/component/strava/types/stravaApi/types.gen.js +3 -0
  121. package/dist/component/strava/types/stravaApi/types.gen.js.map +1 -0
  122. package/dist/component/strava/types/stravaApi/zod.gen.d.ts +5332 -0
  123. package/dist/component/strava/types/stravaApi/zod.gen.d.ts.map +1 -0
  124. package/dist/component/strava/types/stravaApi/zod.gen.js +1009 -0
  125. package/dist/component/strava/types/stravaApi/zod.gen.js.map +1 -0
  126. package/dist/component/strava/utils.d.ts +15 -0
  127. package/dist/component/strava/utils.d.ts.map +1 -0
  128. package/dist/component/strava/utils.js +36 -0
  129. package/dist/component/strava/utils.js.map +1 -0
  130. package/dist/component/utils.d.ts +5 -0
  131. package/dist/component/utils.d.ts.map +1 -0
  132. package/dist/component/utils.js +11 -0
  133. package/dist/component/utils.js.map +1 -0
  134. package/package.json +131 -130
  135. package/src/client/index.ts +285 -164
  136. package/src/component/_generated/api.ts +18 -0
  137. package/src/component/_generated/component.ts +191 -24
  138. package/src/component/garmin/auth.ts +0 -9
  139. package/src/component/garmin/private.ts +84 -12
  140. package/src/component/garmin/public.ts +812 -348
  141. package/src/component/garmin/utils.ts +17 -0
  142. package/src/component/schema.ts +5 -3
  143. package/src/{strava → component/strava}/auth.ts +143 -185
  144. package/src/component/strava/client.ts +20 -0
  145. package/src/component/strava/private.ts +147 -89
  146. package/src/component/strava/public.ts +191 -139
  147. package/src/{strava → component/strava/transform}/activity.ts +256 -276
  148. package/src/{strava → component/strava/transform}/athlete.ts +41 -47
  149. package/src/{strava/maps/sport-type.ts → component/strava/transform/maps/sportType.ts} +100 -99
  150. package/src/component/strava/types/specs/strava-api.json +4796 -0
  151. package/src/component/strava/types/stravaApi/client/client.gen.ts +290 -0
  152. package/src/component/strava/types/stravaApi/client/index.ts +25 -0
  153. package/src/component/strava/types/stravaApi/client/types.gen.ts +214 -0
  154. package/src/component/strava/types/stravaApi/client/utils.gen.ts +316 -0
  155. package/src/component/strava/types/stravaApi/client.gen.ts +16 -0
  156. package/src/component/strava/types/stravaApi/core/auth.gen.ts +41 -0
  157. package/src/component/strava/types/stravaApi/core/bodySerializer.gen.ts +82 -0
  158. package/src/component/strava/types/stravaApi/core/params.gen.ts +169 -0
  159. package/src/component/strava/types/stravaApi/core/pathSerializer.gen.ts +171 -0
  160. package/src/component/strava/types/stravaApi/core/queryKeySerializer.gen.ts +117 -0
  161. package/src/component/strava/types/stravaApi/core/serverSentEvents.gen.ts +243 -0
  162. package/src/component/strava/types/stravaApi/core/types.gen.ts +104 -0
  163. package/src/component/strava/types/stravaApi/core/utils.gen.ts +140 -0
  164. package/src/component/strava/types/stravaApi/index.ts +4 -0
  165. package/src/component/strava/types/stravaApi/sdk.gen.ts +410 -0
  166. package/src/component/strava/types/stravaApi/types.gen.ts +2435 -0
  167. package/src/component/strava/types/stravaApi/zod.gen.ts +1132 -0
  168. package/src/component/strava/utils.ts +52 -0
  169. package/src/component/utils.ts +11 -0
  170. package/dist/strava/activity.d.ts +0 -121
  171. package/dist/strava/activity.d.ts.map +0 -1
  172. package/dist/strava/activity.js.map +0 -1
  173. package/dist/strava/athlete.d.ts.map +0 -1
  174. package/dist/strava/athlete.js.map +0 -1
  175. package/dist/strava/auth.d.ts.map +0 -1
  176. package/dist/strava/auth.js.map +0 -1
  177. package/dist/strava/client.d.ts +0 -93
  178. package/dist/strava/client.d.ts.map +0 -1
  179. package/dist/strava/client.js +0 -158
  180. package/dist/strava/client.js.map +0 -1
  181. package/dist/strava/index.d.ts +0 -13
  182. package/dist/strava/index.d.ts.map +0 -1
  183. package/dist/strava/index.js +0 -17
  184. package/dist/strava/index.js.map +0 -1
  185. package/dist/strava/maps/sport-type.d.ts +0 -7
  186. package/dist/strava/maps/sport-type.d.ts.map +0 -1
  187. package/dist/strava/maps/sport-type.js.map +0 -1
  188. package/dist/strava/sync.d.ts +0 -104
  189. package/dist/strava/sync.d.ts.map +0 -1
  190. package/dist/strava/sync.js +0 -87
  191. package/dist/strava/sync.js.map +0 -1
  192. package/dist/strava/types.d.ts +0 -266
  193. package/dist/strava/types.d.ts.map +0 -1
  194. package/dist/strava/types.js +0 -8
  195. package/dist/strava/types.js.map +0 -1
  196. package/src/strava/activity.test.ts +0 -415
  197. package/src/strava/athlete.test.ts +0 -139
  198. package/src/strava/auth.test.ts +0 -78
  199. package/src/strava/client.ts +0 -212
  200. package/src/strava/index.ts +0 -54
  201. package/src/strava/maps/sport-type.test.ts +0 -69
  202. package/src/strava/sync.ts +0 -168
  203. package/src/strava/types.ts +0 -361
@@ -1,7 +1,57 @@
1
- // ─── Internal Token CRUD ─────────────────────────────────────────────────────
2
- // These are only callable from within the component (actions in this file).
1
+ // ─── Internal Token & Pending OAuth CRUD ─────────────────────────────────────
2
+ // Called only from strava/public.ts. Not exposed to the host app.
3
3
  import { v } from "convex/values";
4
4
  import { internalMutation, internalQuery, } from "../_generated/server";
5
+ // ─── Internal Pending OAuth CRUD ─────────────────────────────────────────────
6
+ // Temporary storage for in-progress Strava OAuth flows.
7
+ // Bridges getStravaAuthUrl and completeStravaOAuth.
8
+ export const storePendingOAuth = internalMutation({
9
+ args: {
10
+ provider: v.string(),
11
+ state: v.string(),
12
+ userId: v.string(),
13
+ },
14
+ returns: v.null(),
15
+ handler: async (ctx, args) => {
16
+ await ctx.db.insert("pendingOAuth", {
17
+ ...args,
18
+ createdAt: Date.now(),
19
+ });
20
+ return null;
21
+ },
22
+ });
23
+ export const getPendingOAuth = internalQuery({
24
+ args: { state: v.string() },
25
+ returns: v.union(v.object({
26
+ _id: v.id("pendingOAuth"),
27
+ _creationTime: v.number(),
28
+ provider: v.string(),
29
+ state: v.string(),
30
+ userId: v.string(),
31
+ createdAt: v.number(),
32
+ }), v.null()),
33
+ handler: async (ctx, args) => {
34
+ return await ctx.db
35
+ .query("pendingOAuth")
36
+ .withIndex("by_state", (q) => q.eq("state", args.state))
37
+ .first();
38
+ },
39
+ });
40
+ export const deletePendingOAuth = internalMutation({
41
+ args: { state: v.string() },
42
+ returns: v.null(),
43
+ handler: async (ctx, args) => {
44
+ const pending = await ctx.db
45
+ .query("pendingOAuth")
46
+ .withIndex("by_state", (q) => q.eq("state", args.state))
47
+ .first();
48
+ if (pending) {
49
+ await ctx.db.delete(pending._id);
50
+ }
51
+ return null;
52
+ },
53
+ });
54
+ // ─── Internal Token CRUD ─────────────────────────────────────────────────────
5
55
  /**
6
56
  * Store or update OAuth tokens for a connection.
7
57
  * Upserts by connectionId — one token record per connection.
@@ -1 +1 @@
1
- {"version":3,"file":"private.js","sourceRoot":"","sources":["../../../src/component/strava/private.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private.js","sourceRoot":"","sources":["../../../src/component/strava/private.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,39 @@
1
1
  import type { Id } from "../_generated/dataModel";
2
2
  /**
3
- * Full Strava OAuth callback handler.
3
+ * Generate a Strava OAuth authorization URL.
4
4
  *
5
- * Exchanges the authorization code for tokens, creates/reactivates the
6
- * Soma connection, stores tokens securely, syncs the athlete profile,
7
- * and syncs all activities.
8
- *
9
- * Returns `{ connectionId, synced, errors }`.
5
+ * The state parameter is stored in the component's `pendingOAuth` table
6
+ * so that `completeStravaOAuth` can look it up automatically when the
7
+ * callback fires via `registerRoutes`.
10
8
  */
11
- export declare const connectStrava: import("convex/server").RegisteredAction<"public", {
12
- baseUrl?: string | undefined;
13
- includeStreams?: boolean | undefined;
9
+ export declare const getStravaAuthUrl: import("convex/server").RegisteredAction<"public", {
10
+ scope?: string | undefined;
14
11
  userId: string;
15
12
  clientId: string;
13
+ redirectUri: string;
14
+ }, Promise<{
15
+ authUrl: string;
16
+ state: string;
17
+ }>>;
18
+ /**
19
+ * Complete a Strava OAuth flow using stored pending state.
20
+ *
21
+ * Called internally by `registerRoutes` — the callback handler calls
22
+ * this with the `code` and `state` from the redirect. The action looks
23
+ * up the pending state (userId) stored during `getStravaAuthUrl`,
24
+ * exchanges for tokens, creates the connection, stores tokens, and
25
+ * cleans up the pending entry.
26
+ *
27
+ * The host app is responsible for calling `syncStrava` afterwards.
28
+ */
29
+ export declare const completeStravaOAuth: import("convex/server").RegisteredAction<"public", {
30
+ state: string;
31
+ clientId: string;
16
32
  clientSecret: string;
17
33
  code: string;
18
34
  }, Promise<{
19
35
  connectionId: Id<"connections">;
20
- synced: number;
21
- errors: {
22
- activityId: number;
23
- error: string;
24
- }[];
36
+ userId: string;
25
37
  }>>;
26
38
  /**
27
39
  * Incremental Strava sync for an already-connected user.
@@ -32,16 +44,40 @@ export declare const connectStrava: import("convex/server").RegisteredAction<"pu
32
44
  * Returns `{ synced, errors }`.
33
45
  */
34
46
  export declare const syncStrava: import("convex/server").RegisteredAction<"public", {
35
- baseUrl?: string | undefined;
36
- includeStreams?: boolean | undefined;
37
47
  after?: number | undefined;
38
48
  userId: string;
39
49
  clientId: string;
40
50
  clientSecret: string;
41
51
  }, Promise<{
42
- synced: number;
52
+ synced: {
53
+ athletes: number;
54
+ activities: number;
55
+ };
56
+ errors: Array<{
57
+ type: string;
58
+ id: string;
59
+ error: string;
60
+ }>;
61
+ }>>;
62
+ /**
63
+ * Fetch and ingest all Strava data types for a connected user.
64
+ *
65
+ * Called by syncStrava after obtaining a valid access token.
66
+ */
67
+ export declare const syncAllTypes: import("convex/server").RegisteredAction<"public", {
68
+ after?: number | undefined;
69
+ before?: number | undefined;
70
+ connectionId: import("convex/values").GenericId<"connections">;
71
+ userId: string;
72
+ accessToken: string;
73
+ }, Promise<{
74
+ synced: {
75
+ athletes: number;
76
+ activities: number;
77
+ };
43
78
  errors: {
44
- activityId: number;
79
+ type: string;
80
+ id: string;
45
81
  error: string;
46
82
  }[];
47
83
  }>>;
@@ -52,7 +88,6 @@ export declare const syncStrava: import("convex/server").RegisteredAction<"publi
52
88
  * and sets the connection to inactive.
53
89
  */
54
90
  export declare const disconnectStrava: import("convex/server").RegisteredAction<"public", {
55
- baseUrl?: string | undefined;
56
91
  userId: string;
57
92
  clientId: string;
58
93
  clientSecret: string;
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/component/strava/public.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAO,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAWvD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;oBAiEY,MAAM;eAAS,MAAM;;GAqCzD,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;oBAkGe,MAAM;eAAS,MAAM;;GAqCzD,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;;;iBAyD3B,CAAC"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/component/strava/public.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAO,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAmBvD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;GAyB3B,CAAC;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB;;;;;;kBAYd,EAAE,CAAC,aAAa,CAAC;YACvB,MAAM;GAoDhB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;;;;;;YAcX;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;YACxC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;GA+E5D,CAAC;AAIH;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;cAaO,MAAM;YAAM,MAAM;eAAS,MAAM;;GAmE/D,CAAC;AAIH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;;iBAoD3B,CAAC"}
@@ -5,97 +5,97 @@
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.
15
18
  *
16
- * Exchanges the authorization code for tokens, creates/reactivates the
17
- * Soma connection, stores tokens securely, syncs the athlete profile,
18
- * and syncs all activities.
19
- *
20
- * Returns `{ connectionId, synced, errors }`.
19
+ * The state parameter is stored in the component's `pendingOAuth` table
20
+ * so that `completeStravaOAuth` can look it up automatically when the
21
+ * callback fires via `registerRoutes`.
21
22
  */
22
- export const connectStrava = action({
23
+ export const getStravaAuthUrl = action({
23
24
  args: {
25
+ clientId: v.string(),
26
+ redirectUri: v.string(),
27
+ scope: v.optional(v.string()),
24
28
  userId: v.string(),
29
+ },
30
+ handler: async (ctx, args) => {
31
+ const state = generateState();
32
+ const authUrl = buildAuthUrl({
33
+ clientId: args.clientId,
34
+ redirectUri: args.redirectUri,
35
+ scope: args.scope,
36
+ state,
37
+ });
38
+ await ctx.runMutation(internal.strava.private.storePendingOAuth, {
39
+ provider: "STRAVA",
40
+ state,
41
+ userId: args.userId,
42
+ });
43
+ return { authUrl, state };
44
+ },
45
+ });
46
+ /**
47
+ * Complete a Strava OAuth flow using stored pending state.
48
+ *
49
+ * Called internally by `registerRoutes` — the callback handler calls
50
+ * this with the `code` and `state` from the redirect. The action looks
51
+ * up the pending state (userId) stored during `getStravaAuthUrl`,
52
+ * exchanges for tokens, creates the connection, stores tokens, and
53
+ * cleans up the pending entry.
54
+ *
55
+ * The host app is responsible for calling `syncStrava` afterwards.
56
+ */
57
+ export const completeStravaOAuth = action({
58
+ args: {
25
59
  code: v.string(),
60
+ state: v.string(),
26
61
  clientId: v.string(),
27
62
  clientSecret: v.string(),
28
- baseUrl: v.optional(v.string()),
29
- includeStreams: v.optional(v.boolean()),
30
63
  },
31
64
  returns: v.object({
32
65
  connectionId: v.string(),
33
- synced: v.number(),
34
- errors: v.array(v.object({ activityId: v.number(), error: v.string() })),
66
+ userId: v.string(),
35
67
  }),
36
68
  handler: async (ctx, args) => {
37
- // 1. Exchange authorization code for tokens
69
+ // 1. Look up pending state
70
+ const pending = await ctx.runQuery(internal.strava.private.getPendingOAuth, { state: args.state });
71
+ if (!pending) {
72
+ throw new Error("No pending Strava OAuth state found for this state parameter. " +
73
+ "The authorization may have expired or was already used.");
74
+ }
75
+ // 2. Exchange authorization code for tokens
38
76
  const tokens = await exchangeCode({
39
77
  clientId: args.clientId,
40
78
  clientSecret: args.clientSecret,
41
79
  code: args.code,
42
- baseUrl: args.baseUrl,
43
80
  });
44
- // 2. Create/reactivate the Soma connection
81
+ // 3. Clean up pending entry
82
+ await ctx.runMutation(internal.strava.private.deletePendingOAuth, { state: args.state });
83
+ // 4. Create/reactivate the Soma connection
45
84
  const connectionId = await ctx.runMutation(api.public.connect, {
46
- userId: args.userId,
85
+ userId: pending.userId,
47
86
  provider: "STRAVA",
48
87
  });
49
- // 3. Store OAuth tokens in providerTokens table
50
- const _stored = await ctx.runMutation(internal.strava.private.storeTokens, {
88
+ // 5. Store OAuth tokens
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({
58
- 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
- connectionId,
65
- userId: args.userId,
66
- ...athleteData,
67
- });
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
- }
92
- }
93
- // 6. Update lastDataUpdate timestamp
94
- const _updated = await ctx.runMutation(api.public.updateConnection, {
95
+ return {
95
96
  connectionId,
96
- lastDataUpdate: new Date().toISOString(),
97
- });
98
- return { connectionId, synced, errors };
97
+ userId: pending.userId,
98
+ };
99
99
  },
100
100
  });
101
101
  /**
@@ -111,20 +111,18 @@ export const syncStrava = action({
111
111
  userId: v.string(),
112
112
  clientId: v.string(),
113
113
  clientSecret: v.string(),
114
- baseUrl: v.optional(v.string()),
115
- includeStreams: v.optional(v.boolean()),
116
114
  after: v.optional(v.number()),
117
115
  },
118
116
  returns: v.object({
119
- synced: v.number(),
120
- errors: v.array(v.object({ activityId: v.number(), error: v.string() })),
117
+ synced: v.object({ athletes: v.number(), activities: v.number() }),
118
+ errors: v.array(v.object({ type: v.string(), id: v.string(), error: v.string() })),
121
119
  }),
122
120
  handler: async (ctx, args) => {
123
121
  // 1. Look up connection
124
122
  const connection = await ctx.runQuery(internal.private.getConnectionByProvider, { userId: args.userId, provider: "STRAVA" });
125
123
  if (!connection) {
126
124
  throw new Error(`No Strava connection found for user "${args.userId}". ` +
127
- "Call connectStrava first.");
125
+ "Connect to Strava first via getStravaAuthUrl.");
128
126
  }
129
127
  if (!connection.active) {
130
128
  throw new Error(`Strava connection for user "${args.userId}" is inactive. Reconnect first.`);
@@ -148,64 +146,118 @@ export const syncStrava = action({
148
146
  clientId: args.clientId,
149
147
  clientSecret: args.clientSecret,
150
148
  refreshToken: tokenDoc.refreshToken,
151
- baseUrl: args.baseUrl,
152
149
  });
153
150
  accessToken = refreshed.access_token;
154
- const _refreshed = await ctx.runMutation(internal.strava.private.storeTokens, {
151
+ await ctx.runMutation(internal.strava.private.storeTokens, {
155
152
  connectionId,
156
153
  accessToken: refreshed.access_token,
157
154
  refreshToken: refreshed.refresh_token,
158
155
  expiresAt: refreshed.expires_at,
159
156
  });
160
157
  }
161
- // 4. Create client and sync
162
- const client = new StravaClient({
158
+ // 4. Sync all data types
159
+ const result = await ctx.runAction(api.strava.public.syncAllTypes, {
163
160
  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
161
  connectionId,
171
162
  userId: args.userId,
172
- ...athleteData,
173
- });
174
- // Sync activities (optionally incremental via `after`)
175
- const summaries = await client.listAllActivities({
176
163
  after: args.after,
177
164
  });
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
165
  // 5. Update lastDataUpdate timestamp
202
- const _updated = await ctx.runMutation(api.public.updateConnection, {
166
+ await ctx.runMutation(api.public.updateConnection, {
203
167
  connectionId,
204
168
  lastDataUpdate: new Date().toISOString(),
205
169
  });
170
+ return { synced: result.synced, errors: result.errors };
171
+ },
172
+ });
173
+ // ─── Sync Engine ────────────────────────────────────────────────────────────
174
+ /**
175
+ * Fetch and ingest all Strava data types for a connected user.
176
+ *
177
+ * Called by syncStrava after obtaining a valid access token.
178
+ */
179
+ export const syncAllTypes = action({
180
+ args: {
181
+ accessToken: v.string(),
182
+ connectionId: v.id("connections"),
183
+ userId: v.string(),
184
+ after: v.optional(v.number()),
185
+ before: v.optional(v.number()),
186
+ },
187
+ handler: async (ctx, args) => {
188
+ const { accessToken, connectionId, userId } = args;
189
+ const client = createStravaClient(accessToken);
190
+ const synced = { athletes: 0, activities: 0 };
191
+ const errors = [];
192
+ // ── Athlete ──────────────────────────────────────────────────────────
193
+ try {
194
+ const { data: athlete, error } = await getLoggedInAthlete({ client });
195
+ if (error || !athlete)
196
+ throw new Error(error ? JSON.stringify(error) : "No athlete data");
197
+ const data = transformAthlete(athlete);
198
+ await ctx.runMutation(api.public.ingestAthlete, {
199
+ connectionId,
200
+ userId,
201
+ ...data,
202
+ });
203
+ synced.athletes++;
204
+ }
205
+ catch (err) {
206
+ errors.push({
207
+ type: "athlete",
208
+ id: "fetch",
209
+ error: err instanceof Error ? err.message : String(err),
210
+ });
211
+ }
212
+ // ── Activities ───────────────────────────────────────────────────────
213
+ try {
214
+ const summaries = await listAllActivities(client, {
215
+ after: args.after,
216
+ before: args.before,
217
+ });
218
+ for (const summary of summaries) {
219
+ if (summary.id == null)
220
+ continue;
221
+ try {
222
+ const { data: detailed, error: detailError } = await getActivityById({ client, path: { id: summary.id } });
223
+ if (detailError || !detailed)
224
+ throw new Error(detailError ? JSON.stringify(detailError) : "No activity data");
225
+ const { data: streams } = await getActivityStreams({
226
+ client,
227
+ path: { id: summary.id },
228
+ query: {
229
+ keys: ["time", "heartrate", "watts", "cadence", "latlng", "altitude", "velocity_smooth", "grade_smooth", "distance", "temp"],
230
+ key_by_type: true,
231
+ },
232
+ });
233
+ const data = transformActivity(detailed, { streams: streams ?? undefined });
234
+ await ctx.runMutation(api.public.ingestActivity, {
235
+ connectionId,
236
+ userId,
237
+ ...data,
238
+ });
239
+ synced.activities++;
240
+ }
241
+ catch (err) {
242
+ errors.push({
243
+ type: "activity",
244
+ id: String(summary.id),
245
+ error: err instanceof Error ? err.message : String(err),
246
+ });
247
+ }
248
+ }
249
+ }
250
+ catch (err) {
251
+ errors.push({
252
+ type: "activity",
253
+ id: "fetch",
254
+ error: err instanceof Error ? err.message : String(err),
255
+ });
256
+ }
206
257
  return { synced, errors };
207
258
  },
208
259
  });
260
+ // ─── Disconnect ─────────────────────────────────────────────────────────────
209
261
  /**
210
262
  * Disconnect a user from Strava.
211
263
  *
@@ -217,7 +269,6 @@ export const disconnectStrava = action({
217
269
  userId: v.string(),
218
270
  clientId: v.string(),
219
271
  clientSecret: v.string(),
220
- baseUrl: v.optional(v.string()),
221
272
  },
222
273
  returns: v.null(),
223
274
  handler: async (ctx, args) => {
@@ -231,8 +282,7 @@ export const disconnectStrava = action({
231
282
  const tokenDoc = await ctx.runQuery(internal.strava.private.getTokens, { connectionId });
232
283
  if (tokenDoc) {
233
284
  try {
234
- const base = (args.baseUrl ?? "https://www.strava.com").replace(/\/+$/, "");
235
- await fetch(`${base}/oauth/deauthorize`, {
285
+ await fetch("https://www.strava.com/oauth/deauthorize", {
236
286
  method: "POST",
237
287
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
238
288
  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":"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"}
@@ -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"}