NestJS + Typeorm + Graphql: правильный шаблон проектирования для DTO во вложенных отношениях - PullRequest
0 голосов
/ 07 июня 2019

Скажите, что у меня есть определение сущности Typeorm, например:

@Entity()
export class MyEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column('varchar', { length: 500 })
  name: string;

  ...

  @OneToOne(type => DocumentEntity)
  @JoinColumn()
  myDoc: DocumentEntity;

  @OneToMany(type => DocumentEntity, document => document.myEntity)
  @JoinColumn()
  otherDocs: DocumentEntity[];

  ...
}

, поэтому у него есть несколько отношений сущностей, OneToMany / OneToOne

Как мне подойти к этому при создании моих DTO?

Здесь у меня есть пример DTO:

export class CreateMyEntityInputDto {

  @IsString()
  name: string;

  ...

  @IsOptional()
  myDoc: DocumentEntity;

  @IsOptional()
  otherDocs: DocumentEntity[];

  ....
}

Мне неясно, какой подход лучше использовать через Graphql

Текущий интерфейс graphql:

####################
# @input
####################
input CreateDealInput {
  name: String
  ...
  myDoc: DocumentInput
  otherDocs: [DocumentInput]
} 

Если бы я проектировал «традиционный» сервис RESTful, я бы создавал свои документы в БД через отдельную конечную точку, ожидая успеха, который возвращает documentID(s):int

затем укажите эти идентификаторы как обычные целые числа в myEntity.myDoc / myEntity.otherDocs поля при создании нового myEntity (в отдельной конечной точке).

Использую ли я такой же подход здесь? т.е. Создать ли объекты документов в отдельном запросе в graphql, проанализировать созданные идентификаторы из успешного ответа, а затем указать эти значения int в определении DTO?

что-то вроде:

@IsOptional()
myDoc: int;

затем, при создании myEntity, загрузите эти (существующие) сущности документа по id: int перед окончательным сохранением через Typeorm?

Или я передаю все поля документа как вложенные сущности в один большой вложенный запрос POST graphql и использую каскад для их создания?

...