Skip to content

Commit

Permalink
feat: add streaksList endpoint (#3255)
Browse files Browse the repository at this point in the history
  • Loading branch information
bigint committed Jul 17, 2023
1 parent d18aa34 commit f7776e4
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
57 changes: 57 additions & 0 deletions packages/workers/achievements/src/handlers/streaksList.ts
Original file line number Diff line number Diff line change
@@ -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!' })
);
}
};
10 changes: 8 additions & 2 deletions packages/workers/achievements/src/index.ts
Original file line number Diff line number Diff line change
@@ -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({
Expand All @@ -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);
Expand Down

1 comment on commit f7776e4

@vercel
Copy link

@vercel vercel bot commented on f7776e4 Jul 17, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

prerender – ./apps/prerender

prerender-git-main-lenster.vercel.app
prerender-lenster.vercel.app
prerender.lenster.xyz

Please sign in to comment.