Skip to content

Latest commit

 

History

History
121 lines (72 loc) · 6.46 KB

code.md

File metadata and controls

121 lines (72 loc) · 6.46 KB

Гайд по стилю разработки


Наименования файлов

Для файлов различных типов в проекте предусмотрены соответствующие им постфиксы, которые следует использовать при создании новых файлов с содержанием, относящимся к конкретному типу.

Среди основных типов файлов:

  1. Модули

    a. Базовые модули - *.module.ts

    b. GraphQL модули - *.graphql-module.ts

  2. GraphQL резолверы

    a. Резолверы типов - *.resolver.ts

    • @ResolveField декораторы для полей, относящихся к типу

    b. Резолверы квери - *.query-resolver.ts

    • @Query декораторы для запросов, относящихся к типу

    с. Резолверы мутаций - *.mutation-resolver.ts

    • @Mutation декораторы для мутаций, относящихся к типу
  3. GraphQL типы

    a. Object типы - *.type.ts

    b. Input типы - *.input-type.ts

  4. 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-шаблоны для нужд приложения