From ce5d77d32f8a8d851df92f8edb1d2eb5e467d9bb Mon Sep 17 00:00:00 2001 From: Marios Antonoudiou Date: Mon, 12 May 2025 17:36:51 +0300 Subject: [PATCH] Add random length and some more house-keeping --- server/api/preferences.put.ts | 1 - server/auth.d.ts | 25 +++++++++++++++++++ server/routes/auth/strava.ts | 3 ++- .../webhooks/strava/activity-create.post.ts | 24 +++++------------- .../webhooks/strava/athlete-update.post.ts | 2 +- server/utils/create-content.ts | 15 +++++++---- server/utils/strava-client.ts | 16 ++++++------ 7 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 server/auth.d.ts diff --git a/server/api/preferences.put.ts b/server/api/preferences.put.ts index c101bba..d0577e9 100644 --- a/server/api/preferences.put.ts +++ b/server/api/preferences.put.ts @@ -9,7 +9,6 @@ export default defineEventHandler(async (event) => { data: { enabled: body.enabled, language: body.language, - tone: body.tone, units: body.units, }, }) diff --git a/server/auth.d.ts b/server/auth.d.ts new file mode 100644 index 0000000..d601edd --- /dev/null +++ b/server/auth.d.ts @@ -0,0 +1,25 @@ +declare module "#auth-utils" { + interface User { + id: number; + name: string; + country: string; + sex: string; + weight: number; + avatar: string; + } + + interface UserSession { + user: { + id: number; + name: string; + country: string; + sex: string; + weight: number; + avatar: string; + }; + } + + interface SecureSessionData { + // Add your own fields + } +} diff --git a/server/routes/auth/strava.ts b/server/routes/auth/strava.ts index 1737847..1f37204 100644 --- a/server/routes/auth/strava.ts +++ b/server/routes/auth/strava.ts @@ -1,4 +1,5 @@ import { get, omit } from "radash"; +import type { H3Event } from "h3"; const requiredScope = ["read", "activity:write", "activity:read_all"]; const hasEnoughScope = (scope: string) => { @@ -11,7 +12,7 @@ export default defineOAuthStravaEventHandler({ config: { scope: [requiredScope.join(",")], }, - onSuccess: async (event, auth) => { + onSuccess: async (event: H3Event, auth: any) => { const query = getQuery(event); const scope = get(query, "scope", ""); diff --git a/server/routes/webhooks/strava/activity-create.post.ts b/server/routes/webhooks/strava/activity-create.post.ts index 0c12507..0a9d039 100644 --- a/server/routes/webhooks/strava/activity-create.post.ts +++ b/server/routes/webhooks/strava/activity-create.post.ts @@ -1,10 +1,9 @@ -import { get, omit, draw } from "radash"; +import { get } from "radash"; import { createActivityContent } from "~~/server/utils/create-content"; export default defineEventHandler(async (event) => { const body = await readBody(event); const db = useDrizzle(); - const openai = useOpenAI(); const user = await db.query.users.findFirst({ where: (f, o) => o.eq(f.id, body.owner_id), @@ -17,18 +16,9 @@ export default defineEventHandler(async (event) => { return; } - const tone = draw([ - "casual", - "funny", - "epic", - "poetic", - "reflective", - "snarky", - ]); - const strava = await useStrava(body.owner_id); - const [, activity] = await strava!(`/activities/${body.object_id}`); + const activity = await strava!(`/activities/${body.object_id}`); const [aiError, aiResponse] = await createActivityContent(activity, user); if (aiError) { @@ -52,15 +42,13 @@ export default defineEventHandler(async (event) => { description: [responseObject.description, promo].join("\n"), }; - const [stravaError] = await strava!(`activities/${body.object_id}`, { + await strava!(`activities/${body.object_id}`, { method: "PUT", body: stravaRequestBody, - }); - - if (stravaError) { + }).catch((error) => { throw createError({ statusCode: 500, - message: `Strava API: ${stravaError.message}`, + message: `Strava API: ${error.message}`, }); - } + }); }); diff --git a/server/routes/webhooks/strava/athlete-update.post.ts b/server/routes/webhooks/strava/athlete-update.post.ts index 84c351d..3cfc201 100644 --- a/server/routes/webhooks/strava/athlete-update.post.ts +++ b/server/routes/webhooks/strava/athlete-update.post.ts @@ -1,4 +1,4 @@ -import { get, isEmpty } from "radash"; +import { get } from "radash"; import { eq } from "drizzle-orm"; export default defineEventHandler(async (event) => { diff --git a/server/utils/create-content.ts b/server/utils/create-content.ts index 6cbb06e..151ecf0 100644 --- a/server/utils/create-content.ts +++ b/server/utils/create-content.ts @@ -101,7 +101,10 @@ const stringifyActivity = chain<[Activity], Activity, string>( (activity) => JSON.stringify(activity), ); -export const createActivityContent = async (activity: Activity, user: User) => { +export const createActivityContent = async ( + activity: Activity, + user: User & { preferences: any }, +) => { const openai = useOpenAI(); const tone = draw([ @@ -113,12 +116,14 @@ export const createActivityContent = async (activity: Activity, user: User) => { "snarky", ]); - console.log(tone, activity.type); + const length = draw(["short", "short", "short", "medium", "long"]); + + console.log(tone, length); const prompt = ` - Generate a short title and description for my strava activity. Use my preferred language and unit system. + Generate a short title and a ${length}-lengthed description for my strava activity. Use my preferred language and unit system. Don't exaggerate. Try keeping it calm as I am using Strava often and I don't want to have boring feed. Keep things short. - Use a little bit of ${tone} to make things less boring. Highlight any PR if available. + Use a little bit of ${tone} to make things less boring. Highlight any PR only if available, do not mention them if no PRs. Language: ${user?.preferences.data.language} Unit system: ${user?.preferences.data.units} @@ -134,7 +139,7 @@ export const createActivityContent = async (activity: Activity, user: User) => { const [aiError, aiResponse] = await openai("/responses", { body: { - model: "gpt-4o", + model: "gpt-4.1", input: [ { role: "user", diff --git a/server/utils/strava-client.ts b/server/utils/strava-client.ts index ae2cf73..cc1468a 100644 --- a/server/utils/strava-client.ts +++ b/server/utils/strava-client.ts @@ -57,12 +57,12 @@ export const useStrava = async (userId: number) => { .where(eq(tables.tokens.userId, userId)); } - return tryit( - $fetch.create({ - baseURL: "https://www.strava.com/api/v3/", - onRequest({ options }) { - options.headers.set("Authorization", `Bearer ${tokens?.accessToken}`); - }, - }), - ); + const client = $fetch.create({ + baseURL: "https://www.strava.com/api/v3/", + onRequest({ options }) { + options.headers.set("Authorization", `Bearer ${tokens?.accessToken}`); + }, + }); + + return client; };