typescript - TypeGraphQL bruker TypeORMs findAndCount-metode


Jeg ønsker å bruke TypeORMs findAndCount-funksjon som returnerer Promise<[Entity[], number]> for paginering. Så jeg har en resolver:

offers(@Arg('page', { defaultValue: 1 }) page: number): Promise<[Offer[], number]> {
    const COUNT = 10
    return this.offerRepository.findAndCount({ take: COUNT, skip: (page - 1) * COUNT })
}

Jeg bruker også type-graphql og vil annotere denne resolveren med Query-annotasjon slik:

@Query(returns => ???)

Men jeg kan ikke finne ut returtypen, jeg prøvde dette (som selvfølgelig ikke fungerte, på grunn av hva findAndCount returnerer):

@ObjectType()
class TestType {
    @Field(type => [Offer])
    offers: Offer[]

    @Field()
    count: number
}

Og prøvde å bruke det slik: @Query(returns => [TestType]) og slik @Query(returns => TestType).

Svar #1

GraphQL støtter ikke tupler, så du må lage en responsobjekttype:

@ObjectType()
class OffersResponse {
  @Field(type => [Offer])
  items: Offer[]

  @Field(type => Int)
  totalCount: number
}

Og deretter manuelt mappe tuplen til objektet:

@Query(returns => OffersResponse)
offers(@Arg('page', { defaultValue: 1 }) page: number): Promise<OffersResponse> {
    const COUNT = 10
    const [items, totalCount] = await this.offerRepository.findAndCount(
      { take: COUNT, skip: (page - 1) * COUNT }
    )
    return { items, totalCount }

}