Для файлов различных типов в проекте предусмотрены соответствующие им постфиксы, которые следует использовать при создании новых файлов с содержанием, относящимся к конкретному типу.
Среди основных типов файлов:
-
Модули
a. Базовые модули -
*.module.ts
b. GraphQL модули -
*.graphql-module.ts
-
GraphQL резолверы
a. Резолверы типов -
*.resolver.ts
@ResolveField
декораторы для полей, относящихся к типу
b. Резолверы квери -
*.query-resolver.ts
@Query
декораторы для запросов, относящихся к типу
с. Резолверы мутаций -
*.mutation-resolver.ts
@Mutation
декораторы для мутаций, относящихся к типу
-
GraphQL типы
a. Object типы -
*.type.ts
b. Input типы -
*.input-type.ts
-
ORM сущности
Часто GraphQL типы сильно похожи на описание сущности в базе данных. Чтобы избежать дублирования между сущностями и GraphQL типами, мы разбиваем определение сущности на три файла.
a. Сами сущности -
*.entity.ts
@Entity
декоратор
b. Описание полей сущностей, доступных для чтения в GraphQL -
*.readable-fields.ts
@ObjectType
декоратор с параметромisAbstract: true
- abstract класс
с. Описание полей сущностей, доступных для редактирования в GraphQL -
*.editable-fields.ts
@ObjectType
и/или@InputType
декораторы с параметромisAbstract: true
- abstract класс
Обратите внимание на гайдлайны по именованию абстракций в Nestjs.
Возьмем в пример сущность User:
-
Общие для Entity, ObjectType и InputType поля сущности должны быть расположены в
user.editable-fields.ts
файле -
Общие для Entity и ObjectType поля должны быть расположены в
user.readable-fields.ts
-
Поля, недоступные в GraphQL типах, но необходимые в ORM сущности, должны быть в
user.entity.ts
-
Типы
UserCreateInput
,UserUpdateInput
иUserType
могут содержать дополнительные GraphQL-специфичные поля
@InputType
@Entity @ObjectType @ObjectType
User <---- UserReadableFields <--- UserEditableFields
^ ^ ^
@ObjectType @InputType @InputType
UserType UserCreateInput UserUpdateInput
Описание основных директорий:
-
_migrations
- файлы миграций базы данных, сгенерированные TypeORM CLI -
api
- бинарникapi.ts
и ApiModule, реализующие веб-сервис с GraphQL и REST API -
app
- модули приложения, реализующие бизнес-логику, а также адаптеры (для работы с БД и реализации API)-
Структура модуля приложения:
common
- общие сервисы модуляgraphql
- типы и резолверы для GraphQL API этого модуляrest
- типы и обработчики для REST API этого модуля- другие папки в соответствии с потребностями модуля
-
Стандартные модули:
auth
- реализует аутентификацию пользователей в API с помощью refresh и access токеновoauth
- реализует OAuth 2.0 клиент, позволяя пользователям авторизоваться через соцсетиott
- реализует одноразовые токеныuser
- реализует модель пользователя, CRUD операции работы с ней, а также бизнес-логику паролейuserSocial
- реализует модель соцсети пользователяuserTokens
- реализует модели аутентификационного токена пользователя
-
-
cli
- бинарникcli.ts
и CliModule, реализующие консольный интерфейс взаимодействия с приложением -
common
- CommonModule и импортированные в него модули. Содержит код не связанный с конкретным бизнес-доменом, который обычно нужен проекту вне зависимости от режима работы.exceptions
- настройка обработки исключенийqueues
- определения очередей задач
-
config
- директория с typescript файлами описывающими параметры разных модулей системы -
scheduler
- бинарникscheduler.ts
и SchedulerModule, реализующий выполнение задач по расписанию -
utils
- директория (не модуль), содержащая чистые утилитарные функции и классы, которые не используют модульность NestJS либо не привязаны конкретно к этому приложению -
worker
- бинарникworker.ts
и WorkerModule, реализующий обработчик очереди задач -
views
-ejs
-шаблоны для нужд приложения