Crea una cuenta o inicia sesi贸n

隆Contin煤a aprendiendo sin ning煤n costo! 脷nete y comienza a potenciar tu carrera

Resolvers para mutaciones y filtros

7/23
Recursos

Aportes 7

Preguntas 2

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Es imposible aprender, en cada clase hay codigo y archivos nuevos, porque no te pones a programar todo de cero, la idea es aprender a estructurar y saber como funcionan estas tecnologias

驴Estas obteniendo un error en GraphQL por alguno de los atributos?

.
Aunque en una clase posterior los agregamos, tal vez puedas necesitarlo ahora dependiendo si t煤 query solicita atributos.

.
Se le pide a Prisma que incluya atributos: https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#include
.
Ej:

export async function createAvo(...) {
  // ...
  const avo = await orm.avocado.create({
    data: {
      // ...
    },
    include: { attributes: true }, // <--- 馃憟
  })
  // ...
}

La verdad que la forma de explicar es bastante desordenada. No hay estructura, no se explica muchas veces de d贸nde y por qu茅 vienen los conceptos. Es muy dif铆cil de seguirlo.

Las variables del profesor:

{
  "data": {
    "name": "Lamb Hass Avocado",
    "price": 1.34,
    "image": "/images/lamb.jpg",
    "description": "The Lamb Hass Avocado",
    "shape": "Obovate",
    "hardiness": "-2 潞C",
    "taste": "Great, is an avocado"
  }
}

馃憠 El c贸digo con la versi贸n finalizada de esta clase lo puedes encontrar en la etiqueta 2-queries

Para chequearlo crea un nuevo branch usando:
git checkout -b filtros-queries 2-queries

filtros-queries es el nombre del branch. Puedes usar cualquier otro nombre

Clean Architecture

.

<h5>馃摎 Repositorio</h5>

.
Para esta secci贸n, en vez de utilizar los Data sources, desarrollo una abstracci贸n mediante el patr贸n MVC (Model-View-Controller). Para ello defino la siguiente estructura de trabajo:

src
  鈹斺攢猥 controllers
  鈹	   鈹斺攢猥 Account.controller.ts
  鈹斺攢猥 graphql
  鈹	  鈹斺攢猥 schemas
  鈹	  	  鈹斺攢猥 Account.schema.ts
  鈹斺攢猥 models
  	  鈹斺攢猥 Account
	  	  鈹斺攢猥 Account.entity.ts
	  	  鈹斺攢猥 Account.model.ts

Partiendo de la capa del modelo tenemos que:

Un modelo define la capa de definici贸n y abstracci贸n a la informaci贸n.

.

export interface Account {
    id: number
    email: string
    password: string
}

export type Query = Pick<Account, 'id'>
export type Payload = Pick<Account, 'email' | 'password'>
export default class AccountModel extends Model<Account, Query, Payload> {
    /**
     * @private
     * @description Prisma ORM definition handler library. */
    private client = new Prisma('account')
    /**
     * @description Find an account by id.
     * @param {Query} query
     * @returns Account */
    async findUnique(query: Query): Promise<Account> {
        return await this.client.findUnique({
            where: query,
        })
    }
	
   // More code ...
}

Para el controlador tenemos que:

Un controlador gestiona y administra el acceso a los datos, as铆 como la secuencia necesaria para su manipulaci贸n basadas en las reglas de negocio.

.

import Error from '@controllers/Error.controller'

import Account from '@models/Account/Account.model'
import { Query, Payload } from '@models/Account/Account.entity'

export default class AccountController {
    private model = new Account()
    /**
     * @description Find an account by id.
     * @param {Query} query
     * @returns Account */
    async findAccount(query: Query) {
        const account = await this.model.findUnique({
            id: Number(query.id),
        })
        if (!account) throw new Error('NOT_FOUND')
        return account
    }

   // More code ...
}

Por 煤ltimo, el esquema la defino como su puente o l铆mite mediante prototipos:

import { gql } from 'apollo-server'

import { Query, Payload } from '@models/Account/Account.entity'
import AccountController from '@controllers/Account.contoller'

const accountController = new AccountController()

export default {
    Schema: gql`
        type Account {
            id: ID!
            email: String!
            password: String!
        }

        input CreateAccount {
            email: String!
            password: String!
        }

        extend type Query {
            account(id: ID!): Account!
            accounts: [Account!]!
        }
    `,
    Query: {
        account: async (_: any, query: Query) => {
            return await accountController.findAccount(query)
        },
        accounts: async () => {
            return await accountController.findAccounts()
        },
    },
    Mutation: {
        createAccount: async (_: any, { account }: { account: Payload }) => {
            validate(account)
            return await accountController.createAccount(account)
        },
    },
}

Si alguno tiene problemas al levantar querer consultar los 鈥榓vos鈥 con un error similar a este 馃憞馃徎 es un problema con el monorepo, si saca la api a un repositorio normal con la configuraci贸n del monorepo + config del Repo Api ya la consulta correr谩 correctamente.
Ahora si alguno lo pudo solucionar utilizando el monorepo y quiere postear la soluci贸n se agradecer谩.

"\nInvalid `context.orm.avocado.findMany()` invocation in\n/Users/.../proyectos/nextjs/nextjs-graphql-fullstack/api/src/modules/avocado/avocado.resolver.ts:14:30\n\n  11   args: unknown,\n  12   context: ResolverContext\n  13 ): Promise<Avocado[]> {\n鈫 14   return context.orm.avocado.findMany(\n  The table `main.Avocado` does not exist in the current database.",