Попытка реализации принципов SOLID и слоеной (Layered) архитектуры на примере серверной части приложения. Мотивация создания приложения.
- Hapi
- TypeORM
- Inversify
src/main.ts
- точка входа в приложение. Отвечает за инициализацию IoC-контейнера запуск приложения.
src/ioc/
- конфигурация IoC-контейнера.
src/config/
- сервис конфигурации приложения. Отвечает за чтение .env-файла и получение конфигурационных переменных.
src/errors/api-error.ts
- обработчик ошибок API. Предназначен для унификации ответов API с сообщениями об ошибках.
src/database/
- сервис БД.
src/app.ts
- приложение сервиса. Выполняет следующие действия:
- подключаются модули логирования и ORM;
- регистрируются плагины Hapi уровня приложения;
- подключаются модули приложения, в том числе:
- регистрируются плагины Hapi уровня модуля. После регистрации плагинов вызывается функция модуля
onRegisterPlugins(app: Hapi.Server)
(при наличии); - подключаются маршруты модуля (для контроллеров);
- регистрируются плагины Hapi уровня модуля. После регистрации плагинов вызывается функция модуля
- запуск web-сервера.
tests/
- End-to-End тесты. Тесты выполняются с собственной конфигурацией Jest, в которую включен глобальный модуль инициализации <rootDir>/setup/setup.ts
Модуль - часть логики приложения для работы с определенной сущностью бизнес-домена или с элементом инфраструктуры. Могут быть сервисами или контроллерами (контроллер - это сервис, принимающий запросы к API). Состоят из:
*.controller.ts
- контроллер, отвечающий за обработку запросов клиентов к API. Передает нагрузку запроса в сервис и возвращает ответ клиенту;*.routes.ts
- маршруты запросов для контроллера, включающие настройки валидации, аутентификации, авторизации и другого. Маршруты могут быть определены в непосредственно в контроллере.*.schema.ts
- валидатор запросов к API (в проекте используется Joi);dto/*.*.dto.ts
- объекты передачи данных в запросах;
*.service.ts
- основная логика сервиса;*.repository.ts
- логика сервиса, отвечающая за работу с базой данных;*.entity.ts
- класс, содержащий представление сущности бизнес-домена.
Конфигурационные переменные задаются через переменные окружения или через файлы окружения:
.env
- используется по умолчанию и для окружения production.env.{NODE_ENV}
- для окружения отличного от production Окружение по умолчанию - development
npm start
- запуск приложения в продуктовом режимеnpm run dev
- запуск в режиме разработчикаnpm t
- запуск unit тестовnpm run test:e2e
- запуск end-to-end тестовnpm run typeorm
- запуск команд TypeOrm
POST /users/register
- регистрация пользователя. Нагрузка: {name: string, email: string, password: string}POST /users/login
- аутентификация пользователя. Нагрузка: {email: string, password: string}GET /users/:id
- информация о пользователе. Аутентификация - "Bearer accessToken" в заголовке запроса AuthorizationPOST /auth/token
- обновление токена. Нагрузка: {refreshToken: string}