diff --git a/apps/api/src/controllers/misc.controller.ts b/apps/api/src/controllers/misc.controller.ts index a79c8d7a..e623f34f 100644 --- a/apps/api/src/controllers/misc.controller.ts +++ b/apps/api/src/controllers/misc.controller.ts @@ -5,8 +5,8 @@ import icoToPng from 'ico-to-png'; import sharp from 'sharp'; import { createHash } from '@openpanel/common/server'; -import { TABLE_NAMES, ch, formatClickhouseDate } from '@openpanel/db'; -import { getRedisCache } from '@openpanel/redis'; +import { TABLE_NAMES, ch, chQuery, formatClickhouseDate } from '@openpanel/db'; +import { cacheable, getCache, getRedisCache } from '@openpanel/redis'; interface GetFaviconParams { url: string; @@ -152,3 +152,21 @@ export async function ping( }); } } + +export async function stats(request: FastifyRequest, reply: FastifyReply) { + const res = await getCache('api:stats', 60 * 60, async () => { + const projects = await chQuery<{ project_id: string; count: number }>( + `SELECT project_id, count(*) as count from ${TABLE_NAMES.events} GROUP by project_id order by count()`, + ); + const last24h = await chQuery<{ count: number }>( + `SELECT count(*) as count from ${TABLE_NAMES.events} WHERE created_at > now() - interval '24 hours'`, + ); + return { projects, last24hCount: last24h[0]?.count || 0 }; + }); + + reply.status(200).send({ + projectsCount: res.projects.length, + eventsCount: res.projects.reduce((acc, { count }) => acc + count, 0), + eventsLast24hCount: res.last24hCount, + }); +} diff --git a/apps/api/src/routes/misc.router.ts b/apps/api/src/routes/misc.router.ts index e03c9cb1..882f0d5b 100644 --- a/apps/api/src/routes/misc.router.ts +++ b/apps/api/src/routes/misc.router.ts @@ -8,6 +8,12 @@ const miscRouter: FastifyPluginCallback = (fastify, opts, done) => { handler: controller.ping, }); + fastify.route({ + method: 'GET', + url: '/stats', + handler: controller.stats, + }); + fastify.route({ method: 'GET', url: '/favicon', diff --git a/apps/public/app/page.tsx b/apps/public/app/page.tsx index 34728845..5fad38aa 100644 --- a/apps/public/app/page.tsx +++ b/apps/public/app/page.tsx @@ -14,7 +14,7 @@ export const metadata: Metadata = { title: 'OpenPanel | An open-source alternative to Mixpanel', }; -export const experimental_ppr = true; +// export const experimental_ppr = true; export default function HomePage() { return ( @@ -26,11 +26,7 @@ export default function HomePage() { + } > diff --git a/apps/public/components/github-button.tsx b/apps/public/components/github-button.tsx index 82fff4c8..923fefad 100644 --- a/apps/public/components/github-button.tsx +++ b/apps/public/components/github-button.tsx @@ -14,9 +14,13 @@ function formatStars(stars: number) { } export function GithubButton() { - const [stars, setStars] = useState(3_263); + const [stars, setStars] = useState(3_700); useEffect(() => { - getGithubRepoInfo().then((res) => setStars(res.stargazers_count)); + getGithubRepoInfo().then((res) => { + if (res?.stargazers_count) { + setStars(res.stargazers_count); + } + }); }, []); return (