@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.
- package/dist/client/index.d.ts +124 -144
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +157 -134
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +18 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +113 -22
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/garmin/auth.d.ts +0 -4
- package/dist/component/garmin/auth.d.ts.map +1 -1
- package/dist/component/garmin/auth.js +0 -8
- package/dist/component/garmin/auth.js.map +1 -1
- package/dist/component/garmin/private.d.ts +10 -1
- package/dist/component/garmin/private.d.ts.map +1 -1
- package/dist/component/garmin/private.js +49 -9
- package/dist/component/garmin/private.js.map +1 -1
- package/dist/component/garmin/public.d.ts +237 -62
- package/dist/component/garmin/public.d.ts.map +1 -1
- package/dist/component/garmin/public.js +689 -254
- package/dist/component/garmin/public.js.map +1 -1
- package/dist/component/garmin/utils.d.ts +8 -0
- package/dist/component/garmin/utils.d.ts.map +1 -1
- package/dist/component/garmin/utils.js +9 -0
- package/dist/component/garmin/utils.js.map +1 -1
- package/dist/component/schema.d.ts +2 -2
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +5 -3
- package/dist/component/schema.js.map +1 -1
- package/dist/{strava → component/strava}/auth.d.ts +15 -48
- package/dist/component/strava/auth.d.ts.map +1 -0
- package/dist/{strava → component/strava}/auth.js +4 -39
- package/dist/component/strava/auth.js.map +1 -0
- package/dist/component/strava/client.d.ts +8 -0
- package/dist/component/strava/client.d.ts.map +1 -0
- package/dist/component/strava/client.js +18 -0
- package/dist/component/strava/client.js.map +1 -0
- package/dist/component/strava/private.d.ts +19 -0
- package/dist/component/strava/private.d.ts.map +1 -1
- package/dist/component/strava/private.js +52 -2
- package/dist/component/strava/private.js.map +1 -1
- package/dist/component/strava/public.d.ts +54 -19
- package/dist/component/strava/public.d.ts.map +1 -1
- package/dist/component/strava/public.js +159 -109
- package/dist/component/strava/public.js.map +1 -1
- package/dist/component/strava/transform/activity.d.ts +19 -0
- package/dist/component/strava/transform/activity.d.ts.map +1 -0
- package/dist/{strava → component/strava/transform}/activity.js +31 -45
- package/dist/component/strava/transform/activity.js.map +1 -0
- package/dist/{strava → component/strava/transform}/athlete.d.ts +4 -10
- package/dist/component/strava/transform/athlete.d.ts.map +1 -0
- package/dist/{strava → component/strava/transform}/athlete.js +2 -8
- package/dist/component/strava/transform/athlete.js.map +1 -0
- package/dist/component/strava/transform/maps/sportType.d.ts +7 -0
- package/dist/component/strava/transform/maps/sportType.d.ts.map +1 -0
- package/dist/{strava/maps/sport-type.js → component/strava/transform/maps/sportType.js} +4 -2
- package/dist/component/strava/transform/maps/sportType.js.map +1 -0
- package/dist/component/strava/types/stravaApi/client/client.gen.d.ts +3 -0
- package/dist/component/strava/types/stravaApi/client/client.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/client/client.gen.js +236 -0
- package/dist/component/strava/types/stravaApi/client/client.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/client/index.d.ts +9 -0
- package/dist/component/strava/types/stravaApi/client/index.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/client/index.js +7 -0
- package/dist/component/strava/types/stravaApi/client/index.js.map +1 -0
- package/dist/component/strava/types/stravaApi/client/types.gen.d.ts +118 -0
- package/dist/component/strava/types/stravaApi/client/types.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/client/types.gen.js +3 -0
- package/dist/component/strava/types/stravaApi/client/types.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/client/utils.gen.d.ts +34 -0
- package/dist/component/strava/types/stravaApi/client/utils.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/client/utils.gen.js +229 -0
- package/dist/component/strava/types/stravaApi/client/utils.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/client.gen.d.ts +13 -0
- package/dist/component/strava/types/stravaApi/client.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/client.gen.js +4 -0
- package/dist/component/strava/types/stravaApi/client.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/auth.gen.d.ts +19 -0
- package/dist/component/strava/types/stravaApi/core/auth.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/auth.gen.js +15 -0
- package/dist/component/strava/types/stravaApi/core/auth.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.d.ts +26 -0
- package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.js +58 -0
- package/dist/component/strava/types/stravaApi/core/bodySerializer.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/params.gen.d.ts +44 -0
- package/dist/component/strava/types/stravaApi/core/params.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/params.gen.js +101 -0
- package/dist/component/strava/types/stravaApi/core/params.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.d.ts +34 -0
- package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.js +107 -0
- package/dist/component/strava/types/stravaApi/core/pathSerializer.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.d.ts +19 -0
- package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.js +93 -0
- package/dist/component/strava/types/stravaApi/core/queryKeySerializer.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.d.ts +72 -0
- package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.js +134 -0
- package/dist/component/strava/types/stravaApi/core/serverSentEvents.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/types.gen.d.ts +79 -0
- package/dist/component/strava/types/stravaApi/core/types.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/types.gen.js +3 -0
- package/dist/component/strava/types/stravaApi/core/types.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/core/utils.gen.d.ts +20 -0
- package/dist/component/strava/types/stravaApi/core/utils.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/core/utils.gen.js +88 -0
- package/dist/component/strava/types/stravaApi/core/utils.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/index.d.ts +3 -0
- package/dist/component/strava/types/stravaApi/index.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/index.js +3 -0
- package/dist/component/strava/types/stravaApi/index.js.map +1 -0
- package/dist/component/strava/types/stravaApi/sdk.gen.d.ts +224 -0
- package/dist/component/strava/types/stravaApi/sdk.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/sdk.gen.js +361 -0
- package/dist/component/strava/types/stravaApi/sdk.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/types.gen.d.ts +2209 -0
- package/dist/component/strava/types/stravaApi/types.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/types.gen.js +3 -0
- package/dist/component/strava/types/stravaApi/types.gen.js.map +1 -0
- package/dist/component/strava/types/stravaApi/zod.gen.d.ts +5332 -0
- package/dist/component/strava/types/stravaApi/zod.gen.d.ts.map +1 -0
- package/dist/component/strava/types/stravaApi/zod.gen.js +1009 -0
- package/dist/component/strava/types/stravaApi/zod.gen.js.map +1 -0
- package/dist/component/strava/utils.d.ts +15 -0
- package/dist/component/strava/utils.d.ts.map +1 -0
- package/dist/component/strava/utils.js +36 -0
- package/dist/component/strava/utils.js.map +1 -0
- package/dist/component/utils.d.ts +5 -0
- package/dist/component/utils.d.ts.map +1 -0
- package/dist/component/utils.js +11 -0
- package/dist/component/utils.js.map +1 -0
- package/package.json +131 -130
- package/src/client/index.ts +285 -164
- package/src/component/_generated/api.ts +18 -0
- package/src/component/_generated/component.ts +191 -24
- package/src/component/garmin/auth.ts +0 -9
- package/src/component/garmin/private.ts +84 -12
- package/src/component/garmin/public.ts +812 -348
- package/src/component/garmin/utils.ts +17 -0
- package/src/component/schema.ts +5 -3
- package/src/{strava → component/strava}/auth.ts +143 -185
- package/src/component/strava/client.ts +20 -0
- package/src/component/strava/private.ts +147 -89
- package/src/component/strava/public.ts +191 -139
- package/src/{strava → component/strava/transform}/activity.ts +256 -276
- package/src/{strava → component/strava/transform}/athlete.ts +41 -47
- package/src/{strava/maps/sport-type.ts → component/strava/transform/maps/sportType.ts} +100 -99
- package/src/component/strava/types/specs/strava-api.json +4796 -0
- package/src/component/strava/types/stravaApi/client/client.gen.ts +290 -0
- package/src/component/strava/types/stravaApi/client/index.ts +25 -0
- package/src/component/strava/types/stravaApi/client/types.gen.ts +214 -0
- package/src/component/strava/types/stravaApi/client/utils.gen.ts +316 -0
- package/src/component/strava/types/stravaApi/client.gen.ts +16 -0
- package/src/component/strava/types/stravaApi/core/auth.gen.ts +41 -0
- package/src/component/strava/types/stravaApi/core/bodySerializer.gen.ts +82 -0
- package/src/component/strava/types/stravaApi/core/params.gen.ts +169 -0
- package/src/component/strava/types/stravaApi/core/pathSerializer.gen.ts +171 -0
- package/src/component/strava/types/stravaApi/core/queryKeySerializer.gen.ts +117 -0
- package/src/component/strava/types/stravaApi/core/serverSentEvents.gen.ts +243 -0
- package/src/component/strava/types/stravaApi/core/types.gen.ts +104 -0
- package/src/component/strava/types/stravaApi/core/utils.gen.ts +140 -0
- package/src/component/strava/types/stravaApi/index.ts +4 -0
- package/src/component/strava/types/stravaApi/sdk.gen.ts +410 -0
- package/src/component/strava/types/stravaApi/types.gen.ts +2435 -0
- package/src/component/strava/types/stravaApi/zod.gen.ts +1132 -0
- package/src/component/strava/utils.ts +52 -0
- package/src/component/utils.ts +11 -0
- package/dist/strava/activity.d.ts +0 -121
- package/dist/strava/activity.d.ts.map +0 -1
- package/dist/strava/activity.js.map +0 -1
- package/dist/strava/athlete.d.ts.map +0 -1
- package/dist/strava/athlete.js.map +0 -1
- package/dist/strava/auth.d.ts.map +0 -1
- package/dist/strava/auth.js.map +0 -1
- package/dist/strava/client.d.ts +0 -93
- package/dist/strava/client.d.ts.map +0 -1
- package/dist/strava/client.js +0 -158
- package/dist/strava/client.js.map +0 -1
- package/dist/strava/index.d.ts +0 -13
- package/dist/strava/index.d.ts.map +0 -1
- package/dist/strava/index.js +0 -17
- package/dist/strava/index.js.map +0 -1
- package/dist/strava/maps/sport-type.d.ts +0 -7
- package/dist/strava/maps/sport-type.d.ts.map +0 -1
- package/dist/strava/maps/sport-type.js.map +0 -1
- package/dist/strava/sync.d.ts +0 -104
- package/dist/strava/sync.d.ts.map +0 -1
- package/dist/strava/sync.js +0 -87
- package/dist/strava/sync.js.map +0 -1
- package/dist/strava/types.d.ts +0 -266
- package/dist/strava/types.d.ts.map +0 -1
- package/dist/strava/types.js +0 -8
- package/dist/strava/types.js.map +0 -1
- package/src/strava/activity.test.ts +0 -415
- package/src/strava/athlete.test.ts +0 -139
- package/src/strava/auth.test.ts +0 -78
- package/src/strava/client.ts +0 -212
- package/src/strava/index.ts +0 -54
- package/src/strava/maps/sport-type.test.ts +0 -69
- package/src/strava/sync.ts +0 -168
- package/src/strava/types.ts +0 -361
|
@@ -1,7 +1,57 @@
|
|
|
1
|
-
// ─── Internal Token CRUD
|
|
2
|
-
//
|
|
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":"AAAA,gFAAgF;AAChF,
|
|
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
|
-
*
|
|
3
|
+
* Generate a Strava OAuth authorization URL.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
12
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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;
|
|
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 {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
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
|
-
*
|
|
17
|
+
* Generate a Strava OAuth authorization URL.
|
|
15
18
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
//
|
|
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:
|
|
85
|
+
userId: pending.userId,
|
|
47
86
|
provider: "STRAVA",
|
|
48
87
|
});
|
|
49
|
-
//
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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({
|
|
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
|
-
"
|
|
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
|
-
|
|
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.
|
|
162
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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":"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,
|
|
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"}
|