From 3bd06b610ee25a1175910b0d655fdbff95ff583d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Tue, 12 Dec 2023 15:54:10 +0100 Subject: [PATCH] api: improve get events sql and setup simple caching --- README.md | 13 +++++++++++-- apps/web/src/pages/api/cron/cache/update.tsx | 18 ++++++++++++++++++ apps/web/src/server/api/routers/chart.ts | 12 +++--------- apps/web/src/server/services/event.service.ts | 12 ++++++++++++ 4 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 apps/web/src/pages/api/cron/cache/update.tsx create mode 100644 apps/web/src/server/services/event.service.ts diff --git a/README.md b/README.md index 3627884a..6ef2f650 100644 --- a/README.md +++ b/README.md @@ -125,9 +125,18 @@ mixan.screenView('Profile', { mixan.clear(); ``` -## @mixan/backend +## @mixan/web -Self hosted service for collecting all events. Dockerfile and GUI will be added soon. +A nextjs web app. Collects all events and your gui to analyze your data. + +### Setup cronjobs (optional) + +Use of cronjobs is optional. Everything will work without them but they will enhance the events with more data. We also use cronjobs to warm up the cache to make the user experiance a bit better. + +We use https://cron-job.org (free) to handle our cronjobs, you can use any provider you want. + +- **https://domain.com/api/cron/cache/update** Will update the memory cache +- **https://domain.com/api/cron/events/enrich** Enrich events (adds duration etc) ## Screenshots diff --git a/apps/web/src/pages/api/cron/cache/update.tsx b/apps/web/src/pages/api/cron/cache/update.tsx new file mode 100644 index 00000000..96f872e9 --- /dev/null +++ b/apps/web/src/pages/api/cron/cache/update.tsx @@ -0,0 +1,18 @@ +import * as cache from '@/server/cache'; +import { db } from '@/server/db'; +import { getUniqueEvents } from '@/server/services/event.service'; +import type { NextApiRequest, NextApiResponse } from 'next'; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + const projects = await db.project.findMany(); + + for (const project of projects) { + const events = await getUniqueEvents({ projectId: project.id }); + cache.set(`events_${project.id}`, 1000 * 60 * 60 * 24, events); + } + + res.status(200).json({ ok: true }); +} diff --git a/apps/web/src/server/api/routers/chart.ts b/apps/web/src/server/api/routers/chart.ts index d73cc0c2..e157ec83 100644 --- a/apps/web/src/server/api/routers/chart.ts +++ b/apps/web/src/server/api/routers/chart.ts @@ -1,6 +1,7 @@ import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; import * as cache from '@/server/cache'; import { db } from '@/server/db'; +import { getUniqueEvents } from '@/server/services/event.service'; import { getProjectBySlug } from '@/server/services/project.service'; import type { IChartEvent, @@ -27,15 +28,8 @@ export const chartRouter = createTRPCRouter({ const project = await getProjectBySlug(projectSlug); const events = await cache.getOr( `events_${project.id}`, - 1000 * 60 * 60, - () => - db.event.findMany({ - take: 500, - distinct: ['name'], - where: { - project_id: project.id, - }, - }) + 1000 * 60 * 60 * 24, + () => getUniqueEvents({ projectId: project.id }) ); return events; diff --git a/apps/web/src/server/services/event.service.ts b/apps/web/src/server/services/event.service.ts new file mode 100644 index 00000000..b7d12b63 --- /dev/null +++ b/apps/web/src/server/services/event.service.ts @@ -0,0 +1,12 @@ +import { db } from '../db'; + +export function getUniqueEvents({ projectId }: { projectId: string }) { + return db.event.findMany({ + take: 500, + distinct: ['name'], + select: { name: true }, + where: { + project_id: projectId, + }, + }); +}