Har genereret API‑kontrakten ud fra databasen
Har genereret API‑kontrakten udad fra databasen — OpenAPI, en typet TypeScript‑klient på 44.076 linjer, 61 mock handlers og de grænser, UI'et håndhæver — med en kontrol i hvert led, der fejler ved afvigelser.
Arbejdet udført: 2025

Foto: 422737 / Pixabay 
Foto: rkit / Pixabay
44,076 linjers typet klientkode, genereret fra databasen
Situation. Frontend og backend bevæger sig i deres eget tempo, og deres antagelser om en request‑payload kan glide fra hinanden, uden at nogen bemærker det. Som regel opdager man det ved et 422 i browseren — når uoverensstemmelsen allerede er sendt i produktion, hvilket er det dyreste tidspunkt at finde ud af det på. At skrive de to sider i hånden ud fra det samme dokument løser ikke problemet; det flytter bare afvigelsen over på den, der glemte at læse dokumentet igen.
Opgave. De to sider skulle genereres fra én kilde i stedet for at blive aftalt mellem to, og hvert trin i genereringen skulle kontrolleres i stedet for at blive taget for givet.
Handling. Kæden starter ved databasen og løber udad. Skemaet og dets funktioner definerer datastrukturerne; Go‑typerne definerer API’et; Huma genererer OpenAPI‑beskrivelsen ud fra dem; en typet TypeScript‑klient på 44.076 linjer genereres ud fra den beskrivelse; 61 mock‑handlere genereres sammen med den, så frontendens egne tests kører mod den rigtige kontrakt i stedet for mod en håndskrevet fixture; og de grænser, brugerfladen håndhæver i en formular, kommer fra samme sted i stedet for at blive tastet ind i en validator igen. Hvert led har sin kontrol. Et kontrakttjek i CI sammenligner det, frontenden sender, med det, API’et forventer, og får buildet til at fejle ved afvigelser, og under det ligger en skemaprobe, der tjekker de faktiske strukturer og ikke en beskrivelse af dem. Kontrollen dækker bevidst de steder, hvor afvigelser gerne gemmer sig: valgfrie body‑felter, hvor “mangler” og “null” bliver forvekslet, og query‑parameter‑enums, hvor de to sider i al stilhed kan være uenige om de tilladte værdier.
Resultat. Et felt kan ikke ændre sig på kun den ene side — ændringen fejler ved det første led, der opdager den, i et build, minutter efter ændringen. Det fjernede en tilbagevendende og virkelig irriterende fejlkategori, den slags, der er usynlig i code review og først viser sig i runtime. Prisen er et genereringstrin midt i det hele: at regenerere er en sur pligt, og kæden er kun så troværdig som sit dårligst bevogtede led, hvilket er grunden til, at hvert led fik sin kontrol.
Se tilbage på Har migreret API'et til Huma v2 med 100 % paritet. Læs videre: Har bygget e‑mail med failover og leveringslog. Eller tag et kig på hele porteføljen.
Ét stykke af en længere fortegnelse — og det hele ligger her på sitet.
Hver post er skrevet på samme måde: situationen, opgaven, hvad vi gjorde, og hvad der ændrede sig.

