No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Paginación y filtros avanzados

9/23
Recursos

Aportes 3

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Si quieren dejar paginado por defecto, podrían usar este approach:

const getAllAvocados = async (
  parent: unknown,
  { skip, take }: { skip?: number; take?: number } = { skip: 0, take: 10 },
  { orm }: ResolverContext
): Promise<(Avocado & { attributes: Attributes | null })[]> => {
  try {
    return await orm.avocado.findMany({
      include: {
        attributes: true
      },
      skip,
      take
    })
  } catch (error) {
    console.error('Error getting all the avocados')
    console.error(error)
    throw error
  }
}

Con esto se aseguran de que siempre devolverán solo los 10 primeros, si es que no se especifican los atributos skip y take.

Les dejo los type definitions que usa el profesor

input AvoWhereInput{
  name: StringFilterInput
  price: Float

}

input StringFilterInput{

  equals:String
  in:[String]
  notIn:[String]
  lt:String
  lte:String
  gt:String
  gte:String
  contains:String
  startsWith:String
  endsWith:String
  not:String
}

Filtros

📚 Repositorio

🛠 Commit

.

Configuración

La generación de filtros en Prisma son bastante sencillos, permitiendo que su implementación sea bajo el patrón de diseño facade.

Al anexar una interfaz para su causa:

export interface Filters {
    skip: number
    take: number
    where: {
        AND?: Array<{
            [key: string]: any
        }>
        OR?: Array<{
            [key: string]: any
        }>
        [key: string]: any
    }
}

Nos permitirá utilizarla como definición de parámetros mediante su opcionalidad en el modelo:

// Account.entity.ts
import { Filters } from '@libs/Prisma'
// mode code ...
export type Filter = Partial<Filters>

Así mismo, permitiendo su abstracción al nivel del controlador para su definición:

// Account.controller.ts
export default class AccountController {
   // more code ...
    /**
     * @description Find all accounts.
     * @returns Account */
    async findAccounts(filter: Filter) {
        return await this.model.findMany({
            skip: Number(filter.skip) || 0,
            take: Number(filter.take) || 10,
        })
    }
   // more code ...
}

O mediante definición en esquema de GraphQL:

extend type Query {
   account(id: ID!): Account!
   accounts(skip: Int = 0, take: Int = 10, where: FilterAccount): [Account!]!
}