diff --git a/packages/workers/achievements/src/handlers/streaks.ts b/packages/workers/achievements/src/handlers/streaksCalendar.ts similarity index 100% rename from packages/workers/achievements/src/handlers/streaks.ts rename to packages/workers/achievements/src/handlers/streaksCalendar.ts diff --git a/packages/workers/achievements/src/handlers/streaksList.ts b/packages/workers/achievements/src/handlers/streaksList.ts new file mode 100644 index 000000000000..519a40f9ac2c --- /dev/null +++ b/packages/workers/achievements/src/handlers/streaksList.ts @@ -0,0 +1,57 @@ +import { error } from 'itty-router'; + +import filteredEvents from '../helpers/filteredNames'; +import type { Env } from '../types'; + +export default async (id: string, date: string, env: Env) => { + if (!id) { + return error(400, 'Bad request!'); + } + + try { + const streaksResponse = await fetch( + `${env.CLICKHOUSE_REST_ENDPOINT}&default_format=JSONCompact`, + { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + cf: { cacheTtl: 600, cacheEverything: true }, + body: ` + SELECT + name, + created + FROM events + WHERE actor = '${id}' AND created >= now() - INTERVAL 1 YEAR + AND name IN (${filteredEvents.map((name) => `'${name}'`).join(',')}) + AND DATE(created) = '${date}'; + ` + } + ); + + if (streaksResponse.status !== 200) { + return new Response( + JSON.stringify({ success: false, error: 'Status code is not 200!' }) + ); + } + + const json: { + data: [string, string][]; + } = await streaksResponse.json(); + + let response = new Response( + JSON.stringify({ + success: true, + data: json.data.map(([event, date]) => ({ event, date })) + }) + ); + + // Cache for 10 minutes + response.headers.set('Cache-Control', 'max-age=600'); + + return response; + } catch (error) { + console.error('Failed to get streaks', error); + return new Response( + JSON.stringify({ success: false, error: 'Something went wrong!' }) + ); + } +}; diff --git a/packages/workers/achievements/src/index.ts b/packages/workers/achievements/src/index.ts index d49e6649e844..3d5bdd76600a 100644 --- a/packages/workers/achievements/src/index.ts +++ b/packages/workers/achievements/src/index.ts @@ -1,6 +1,7 @@ import { createCors, error, json, Router } from 'itty-router'; -import streaks from './handlers/streaks'; +import streaksCalendar from './handlers/streaksCalendar'; +import streaksList from './handlers/streaksList'; import type { Env } from './types'; const { preflight, corsify } = createCors({ @@ -12,7 +13,12 @@ const router = Router(); router.all('*', preflight); router.get('/', () => new Response('gm, to achievements service 👋')); -router.get('/streaks/:id', ({ params }, env) => streaks(params.id, env)); +router.get('/streaks/:id', ({ params }, env) => + streaksCalendar(params.id, env) +); +router.get('/streaks/:id/:date', ({ params }, env) => + streaksList(params.id, params.date, env) +); const routerHandleStack = (request: Request, env: Env, ctx: ExecutionContext) => router.handle(request, env, ctx).then(json);