TS Industry
CharityGraphQLPayments

Běh Adventáka

A set of three connected sites for Advent charity runs - taking over an in-progress project, unifying and fully typing it, GP WebPay payments and leaderboards from Strava data.

Role
Development · Refactoring · Integration
Type
Non-profit · Web
Status
In production

// Brief

Three sites, an inherited and half-finished codebase

I took over the project in progress with the design already done - a set of three connected sites (behadventaka.cz, adventnibehani.cz, adventaci.cz) for Advent charity runs. The code leaned on a lot of `any`, had minimal server logic and lacked a unified foundation.

The first job was to clean it up: unify the approach across all three sites, fully type everything and move as much logic as possible from the client to the server.

// Architecture

A typed foundation and GraphQL over the database

I built the data layer on GraphQL with custom resolvers over the database, so all three sites draw from the same typed API. Removing `any` and moving logic to the server brought predictability - fewer runtime errors and maintaining three sites from one place.

  • Unifying three sites on a shared typed foundation
  • GraphQL API with resolvers over the database
  • Moving logic from client to server, no more `any`

// Payments & data

GP WebPay in Node and Strava leaderboards

I implemented the GP WebPay payment gateway from the official PHP docs - signatures, callbacks and the whole transaction flow rewritten into Node.js. The sites have working donation and payment forms.

Runners' results are pulled via a Strava integration and aggregated into live leaderboards.

  • GP WebPay in Node.js from the PHP docs - signatures, callbacks, transactions
  • Donation and payment forms
  • Strava integration and aggregating data into leaderboards

// Backoffice & operations

Strapi for content and a tuned setup

The sites come with a large Strapi backoffice where all the content and articles are created. I designed the collections, models and their relations so editors just fill in content - without a developer.

Across all the sites I handled page caching, image optimization and observability via Sentry.

  • Strapi: designing collections, models and relations for self-service content
  • Page caching and image optimization for fast loads
  • Observability and error tracking via Sentry

// Stack

Next.jsTypeScriptGraphQLNode.jsStrapiGP WebPayPostgreSQLStrava APISentry
Message on WhatsApp