REST API на Fastify, собранный «по-взрослому»: схема API описана отдельно от кода, база через ORM, валидация по схеме.
Пример того, как выглядит API-проект, когда он перерастает один файл с маршрутами. Отличия от учебной заглушки видны сразу:
- Контракт первичен. API описан на TypeSpec
в
main.tsp, из него генерируется OpenAPI, а из OpenAPI — типы для кода. Документация не расходится с реализацией, потому что порождена из одного источника. - Одна спека проверяет код дважды. Из OpenAPI генерируются типы
обработчиков и zod-схемы (hey-api): первое проверяет
tscстатически, второе — валидаторы в рантайме. Сами маршруты по этой же спеке регистрируетfastify-openapi-glue, поэтому таблица маршрутов и проверка запросов тоже не пишутся руками.make generate-checkв CI не даёт сгенерированному разойтись со спекой. - База через Drizzle: схема в
db/schema.ts, миграции генерируются по ней. - Валидация входа отдельным слоем в
validators/, а не внутри обработчика.
make install
make dev
make testПолезное:
make routes # список маршрутов
make migration-generate # миграция по изменённой схеме
make generate-types # OpenAPI и типы из TypeSpec
make generate-check # проверить, что сгенерированное закоммичено
make mock # поднять мок-сервер по OpenAPIThis repository is created and maintained by the team and the community of Hexlet, an educational project. Read more about Hexlet.
See most active contributors on hexlet-friends.
