Podaci
PostgreSQL preko Prisme. Model pokriva 50+ entiteta i drži cijeli sport u jednoj shemi - klub, tim, cheerleader, trener, natjecanje, prijava, plaćanje, kvalifikacija, certifikat, ulaznica. Promjene idu kroz verzionirane migracije.
Platforma koja vodi cijeli nacionalni sport - klubovi, treneri, cheerleaderi, natjecanja, suđenje, kvalifikacije, certifikati i naplata - na jednom modelu podataka. Od prijave kluba do dokumentacije natjecateljskog dana, bez tablica i papirnatih obrazaca.
Dizajn proizvoda · domenska arhitektura · full-stack izrada · migracija platforme
NestJS · Prisma · PostgreSQL · BullMQ · Stripe
2022 · u aktivnom razvoju
U produkciji · druga generacija u izradi

UK Cheerleading Association vodi cijeli sport: društvene klubove i školske programe, trenere i cheerleadere, natjecanja i suđenje, trenerske kvalifikacije, ispite i certifikate. Sve je to godinama živjelo u tablicama, e-mail nizovima i papirnatim obrascima koji međusobno nisu komunicirali.
Klubovi su se prijavljivali ručno. Prijave za natjecanja usklađivale su se ručno, a svaka izmjena sastava tima nakon roka značila je novi krug dopisivanja i novu verziju tablice. Redoslijed nastupa slagao se u Excelu, ocjenjivački listovi ispisivali su se prema tom istom Excelu, a sucima se dokumentacija dijelila po mapama. Trenerski certifikati izdavali su se i provjeravali na povjerenje. Plaćanja su stizala raznim metodama i rijetko se poklapala s time tko je što dužan.
A osjetljivi podaci o školskim cheerleaderima - djeci mlađoj od 18 godina - trebali su stvarnu zaštitu, ne dijeljenu mapu.
Trebala je platforma koja pravila sporta zna sama, koja nosi klub od prijave do fiskalno urednog računa i od redoslijeda nastupa do potpisanog ocjenjivačkog lista - pouzdano, ponovljivo i bez ičijeg ručnog prepisivanja.
Izgradili smo domenski vođenu platformu u kojoj pravila sporta žive u kodu, a ne u glavama nekolicine ljudi. Jedan model podataka, jedno mjesto istine, i tijek koji ide naprijed - od kluba, preko natjecanja, do certifikata.






Backend je NestJS aplikacija podijeljena po domenama - svaka domena ima svoj modul, kontroler i servis, a poslovna pravila žive u servisima. Kontroleri ostaju tanki: validiraj, pozovi, oblikuj odgovor.
PostgreSQL preko Prisme. Model pokriva 50+ entiteta i drži cijeli sport u jednoj shemi - klub, tim, cheerleader, trener, natjecanje, prijava, plaćanje, kvalifikacija, certifikat, ulaznica. Promjene idu kroz verzionirane migracije.
BullMQ na Redisu odvaja spor rad od HTTP zahtjeva. Slanje e-maila je posao, ne blokada - s ponovnim pokušajima i evidencijom neuspjelih poslova.
Google Cloud Storage s potpisanim URL-ovima. Datoteke se učitavaju izravno u pohranu i čitaju kroz vremenski ograničen potpisan link, pa privatni dokumenti nikad ne postaju javni.
JWT autentikacija (lokalna i Google), uloge i pravila na razini rute, te vlasništvo nad zapisom kao dodatni sloj - klub vidi svoj klub, a ne tuđi.
React i Vite, MUI s podatkovnim tablicama, Redux Toolkit za stanje, react-hook-form za obrasce, i18next za jezike, dnd-kit za slaganje redoslijeda nastupa povlačenjem, Stripe Terminal SDK za čitač kartica.
Prva generacija platforme radila je na Strapi headless CMS-u i pokrenula je sport. Kad je opseg prerastao ono što CMS može održati, umjesto prepisivanja od nule izgradili smo drugu generaciju na NestJS-u i Prismi - i selimo domenu po domenu, uz aplikaciju koja cijelo vrijeme radi.
Migracija se ne izvodi “na osjećaj”. Svaka domena ima vlastitu skriptu s tri načina rada: dry-run koji ništa ne mijenja, --save koji zapisuje izvještaj o tome što bi se dogodilo, i --apply koji izvodi seobu. Uz to ide revizijska skripta koja uspoređuje staro i novo stanje, izvještaj o paritetu ponašanja, i runbook za prelazak na novo - korak po korak, s povratkom unatrag ako zatreba.
Preseljeno je i ono što se ne vidi: medijske datoteke s Cloudinaryja na GCS, certifikati, povijesna plaćanja, prijave na natjecanja, korisnici i uloge.
Platforma je u produkciji i vodi sport iz dana u dan. Klubovi se sami prijavljuju i ulaze u natjecanja bez dopisivanja. Natjecateljski dan slaže se iz redoslijeda nastupa, a suci dobivaju dokumentaciju koja se generira sama. Treneri stječu kvalifikacije i odlaze s certifikatom koji svatko može provjeriti u registru. Škole se uredno fakturiraju, društveni klubovi plaćaju karticom, a ono što ostane rješava se čitačem kartica na samom natjecanju - sve u istoj knjizi plaćanja.
Usporedo, druga generacija backenda na NestJS-u i Prismi preuzima domenu po domenu, uz revizijske skripte i runbook za svaki korak.
“TherraCode je izgradio sustav kakav naš sport nikad nije imao. Klubovi, natjecanja i trenerske kvalifikacije napokon žive na jednom mjestu - i vjerujemo mu.”
Reci nam što gradiš. Javljamo se u roku od jednog radnog dana s jasnim planom, rokovima i pravom osobom za razgovor.