# 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 guard i hvert led, der fejler ved drift.

2025

**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. Måden, man som regel opdager det på, er et 422 i browseren — efter uoverensstemmelsen allerede er udgivet, hvilket er det dyreste tidspunkt at få det at vide på. At skrive de to sider i hånden ud fra det samme dokument løser det ikke; det flytter bare driften over på den, der glemte at læse dokumentet igen.

**Opgave.** De to sider skulle genereres fra én kilde frem for aftales mellem to, med hvert trin i genereringen tjekket i stedet for taget for givet.

**Handling.** Kæden starter ved databasen og løber udad. Skemaet og dets funktioner definerer formerne; Go‑typerne definerer API'et; Huma udsender OpenAPI‑beskrivelsen ud fra dem; en typet TypeScript‑klient — 44.076 linjer af den — genereres ud fra den beskrivelse; 61 mock‑handlere genereres ved siden af den, så frontendens egne tests kører mod den rigtige kontrakt frem for en håndskrevet fixture; og de grænser, UI'et håndhæver på en formular, kommer fra det samme sted i stedet for at blive tastet ind i en validator igen. Hvert hop har et værn. Et kontrakt‑tjek i CI sammenligner det, frontenden sender, med det, API'et forventer, og får buildet til at fejle ved afvigelse, med en schema‑probe under det, som tjekker de rigtige former frem for en beskrivelse af dem. Det dækker bevidst, hvor drift kan lide at gemme sig: valgfrie body‑felter, hvor "mangler" og "null" bliver forvekslet, og query‑parameter‑enums, hvor de to sider stille og roligt kan være uenige om de tilladte værdier.

**Resultat.** Et felt kan ikke ændre sig på kun den ene side — det fejler ved det første hop, der bemærker det, i et build, minutter efter ændringen. Det tog en tilbagevendende og oprigtigt irriterende klasse af fejl af bordet — den slags, der er usynlig i code review og først dukker op 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 hop fik et.

---

- Rolle: Backend‑udvikler
- Kategorier: [Backend‑udvikling](https://software.engineer.company/da/categories/backend/), [API'er & integration](https://software.engineer.company/da/categories/api/), [DevOps](https://software.engineer.company/da/categories/devops/), [Automatisering & CI/CD](https://software.engineer.company/da/categories/automation/), [Drift & backup](https://software.engineer.company/da/categories/reliability/), [Test & QA](https://software.engineer.company/da/categories/testing/)
- Ydelser: [Backend- & API‑udvikling](https://software.engineer.company/da/services/backend-development/), [DevOps & CI/CD‑automatisering](https://software.engineer.company/da/services/devops-cicd/)

<https://software.engineer.company/da/portfolio/built-a-request-schema-validation-contract-with-automated-61/>
