From 36be410d381d6192ca78430fafa495b21bf716d2 Mon Sep 17 00:00:00 2001 From: Mike Conrad Date: Thu, 22 May 2025 17:03:35 -0400 Subject: [PATCH] Minor tweaks and get started on docs --- README.md | 32 ++++++++++++++++++++++++++ app/controllers/replays_controller.ts | 6 ++--- docs/assets/homepage.jpg | Bin 0 -> 26289 bytes resources/views/inertia_layout.edge | 2 +- start/routes.ts | 2 +- 5 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 README.md create mode 100644 docs/assets/homepage.jpg diff --git a/README.md b/README.md new file mode 100644 index 0000000..ce115a9 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Sentry Toolkit +This project was born out of a simple marketing request. Basically along the lines of "how can we track user engagement in our CRM?", to which I answered "We already use Sentry for Session recording, we can pull that data from the API, aggregate it and push it to the CRM." Hence this project. It is currently pretty simple and includes an API as well as basic web ui. + + +## Tech Stack +- [AdonisJS](https://adonisjs.com): I decided to use the wonderful AdonisJS framework for this project. Overkill? probably but it has a lot of nicecities built in and I didn't want to reinvent the wheel for this simple project. I also wanted to play around with InertiaJS which comes included. +- [Docker](https://docker.com) - All services have been containerized for convience of developing, testing and deploying. A `compose.yml` and `compose.override.yml` are included for testing and developing locally. +- Redis - Some basic caching because why not? +- Postgresql - Useful for storing historical session data. +- Traefik - Reverse Proxy/Ingress controller Provided for convienent development and local testing. +- Grafana - (Optional) For building pretty dashboards. + + +## Getting started +```shell +$ cp .env.example .env.develop +# Add/edit values in .env.develop as needed +# The WEBHOOK_URL is not strictly necessary for basic functionality. + +# Tested on Linux, I have not had the pleasure of setting up Traefik on Windows/Mac +# recently so suggestions welcome. Also you may need `sudo` depending on how your +# Docker environment is set up. +$ docker compose up -d +``` + +Once all of the containers come up, you should be able to access the UI/API on [http://sentry.docker.localhost]() (Docker compose magic.) The database migrations should automatically run when you start with `docker compose` but if you are running the backend with node instead you will need to run `node ace migration:run` after starting the app for the first time. + +The main page will list any Replay sessions stored in the database. +![](./docs/assets/homepage.jpg) + + +[http://sentry.docker.localhost/replays]() will fetch session data from Sentry and store it in the database. It will also return the results as JSON. diff --git a/app/controllers/replays_controller.ts b/app/controllers/replays_controller.ts index 8ee73c2..205ccd6 100644 --- a/app/controllers/replays_controller.ts +++ b/app/controllers/replays_controller.ts @@ -34,7 +34,7 @@ export default class ReplaysController { return response.json(responseData) } - public async list({ request, inertia }: HttpContext) { + public async home({ request, inertia }: HttpContext) { const page = request.input('page', 1) const perPage = 20 const cacheKey = `replays:page:${page}` @@ -46,7 +46,7 @@ export default class ReplaysController { ;({ paginated, meta, replays } = JSON.parse(data)) } else { paginated = await Replay.query().paginate(page, perPage) - paginated.baseUrl('/list') + paginated.baseUrl('/') const json = paginated.toJSON() @@ -101,7 +101,7 @@ function buildPaginationLinks(meta: { for (let page = 1; page <= meta.lastPage; page++) { links.push({ - url: `/list?page=${page}`, + url: `/?page=${page}`, label: page.toString(), active: page === meta.currentPage, }) diff --git a/docs/assets/homepage.jpg b/docs/assets/homepage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73a16016e07bb06580e49c1b7c2e5dfca73bc1fa GIT binary patch literal 26289 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 B>FWRh literal 0 HcmV?d00001 diff --git a/resources/views/inertia_layout.edge b/resources/views/inertia_layout.edge index 04cf565..ab3d302 100644 --- a/resources/views/inertia_layout.edge +++ b/resources/views/inertia_layout.edge @@ -6,7 +6,7 @@ - AdonisJS x Inertia x VueJS + Sentry Toolkit diff --git a/start/routes.ts b/start/routes.ts index a24fec2..35e0e19 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -9,7 +9,7 @@ import ReplaysController from '#controllers/replays_controller' import router from '@adonisjs/core/services/router' -router.on('/').renderInertia('home') +router.get('/', [ReplaysController, 'home']) router.get('/replays', [ReplaysController, 'index']) router.get('/list', [ReplaysController, 'list']) router.get('/stats', [ReplaysController, 'stats'])