# Genererade API‑kontraktet utåt från databasen — OpenAPI, en typad TypeScript‑klient på 44 076 rader, 61 mock‑hanterare och de gränser som gränssnittet upprätthåller — med en spärr i varje led som fäller vid avvikelse.

2025

**Situation.** Frontend och backend rör sig i var sin takt, och deras antaganden om nyttolasten i ett anrop kan glida isär utan att någon märker det. Oftast upptäcker man det genom en 422 i webbläsaren — när avvikelsen redan har släppts, vilket är det dyraste tillfället att få veta det. Att skriva båda sidorna för hand utifrån samma dokument löser inte problemet; det flyttar bara isärglidningen till den som glömde att läsa om dokumentet.

**Uppgift.** De två sidorna behövde genereras från en enda källa i stället för att stämmas av mellan två, och varje steg i genereringen skulle kontrolleras i stället för att tas på tro.

**Handling.** Kedjan börjar i databasen och går utåt. Schemat och dess funktioner definierar datastrukturerna; Go‑typerna definierar API:et; Huma genererar OpenAPI‑beskrivningen utifrån dem; en typad TypeScript‑klient — hela 44 076 rader — genereras från den beskrivningen; 61 mock‑hanterare genereras vid sidan av den så att frontendens egna tester körs mot det verkliga kontraktet i stället för mot en handskriven fixture; och de gränser som gränssnittet upprätthåller i ett formulär kommer från samma ställe i stället för att skrivas in på nytt i en validerare. Varje steg har ett skydd. En kontraktskontroll i CI jämför vad frontenden skickar med vad API:et förväntar sig och stoppar bygget vid avvikelser, med en schemasond under som kontrollerar de verkliga strukturerna i stället för en beskrivning av dem. Den täcker medvetet de ställen där isärglidning gärna gömmer sig: valfria fält i anropets body, där ”saknas” och ”null” blandas ihop, och enum‑värden i query‑parametrar, där de två sidorna i det tysta kan vara oense om vilka värden som är tillåtna.

**Resultat.** Ett fält kan inte ändras på bara den ena sidan — det fallerar vid det första steg som märker det, i ett bygge, minuter efter ändringen. Det tog bort en återkommande och genuint irriterande klass av buggar, den sorten som är osynlig vid kodgranskning och bara dyker upp vid körning. Priset är ett genereringssteg mitt i allt: att generera om är ett tråkigt måste, och kedjan är bara så pålitlig som sin sämst skyddade länk, vilket är skälet till att varje steg fick ett skydd.

---

- Roll: Backendingenjör
- Kategorier: [Backendutveckling](https://engineer.company/sv/categories/backend/), [API:er och integration](https://engineer.company/sv/categories/api/), [DevOps](https://engineer.company/sv/categories/devops/), [Automatisering och CI/CD](https://engineer.company/sv/categories/automation/), [Tillförlitlighet och säkerhetskopiering](https://engineer.company/sv/categories/reliability/), [Test och kvalitetssäkring](https://engineer.company/sv/categories/testing/)
- Tjänster: [Backend- och API‑utveckling](https://engineer.company/sv/services/backend-development/), [DevOps och CI/CD‑automatisering](https://engineer.company/sv/services/devops-cicd/)

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