17. Реальный проект: API
В этом финальном уроке мы рассмотрим построение полноценного production-ready API на tRPC. Мы создадим API с несколькими роутерами: аутентификация, пользователи, посты и комментарии — всё с правильной архитектурой, валидацией и обработкой ошибок.
Архитектура проекта
Заголовок раздела «Архитектура проекта»Хорошо организованный tRPC-проект имеет чёткую структуру: server/routers/ содержит отдельные роутеры для каждой сущности, server/trpc.ts — инициализацию tRPC и типы процедур, server/context.ts — создание контекста запроса.
Разделение по доменам
Заголовок раздела «Разделение по доменам»Разбивайте API на домены: auth (аутентификация), user (пользователи), post (посты), comment (комментарии). Каждый роутер инкапсулирует логику своего домена и экспортирует только необходимые типы.
Защищённые процедуры
Заголовок раздела «Защищённые процедуры»Создайте protectedProcedure и adminProcedure один раз и используйте их в роутерах. Это гарантирует единообразную проверку аутентификации без дублирования кода.
Вложенные ресурсы
Заголовок раздела «Вложенные ресурсы»Для вложенных ресурсов (комментарии к посту) используйте понятные имена процедур: comment.getByPost, comment.create. Это сохраняет API плоским и предотвращает глубокую вложенность.
Обработка ошибок
Заголовок раздела «Обработка ошибок»В каждой процедуре явно обрабатывайте ошибки: проверяйте существование ресурса и выбрасывайте NOT_FOUND, проверяйте права доступа и выбрасывайте FORBIDDEN, оборачивайте операции с БД в try-catch.
Лучшие практики
Заголовок раздела «Лучшие практики»Используйте Zod для всех входных данных; возвращайте минимально необходимый набор полей; документируйте процедуры через TypeScript JSDoc-комментарии; пишите тесты для каждой процедуры с mock-контекстом.