No tienes acceso a esta clase

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

Custom Scalars

21/24
Recursos

Link de interés:

GraphQL Scalars

Aportes 4

Preguntas 0

Ordenar por:

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

o inicia sesión.

Genial curso!, la verdad muy util las herramientas que brinda el profe a lo largo del curso.

Excelente, esto hace mucho mas maleable el trabajo con grphql.

Scalars Personalizados

add resolver and typedef of library

const {ApolloServer}= require('apollo-server-express');
const {ApolloServerPluginLandingPageLocalDefault} = require('apollo-server-core');
const {loadFiles} = require('@graphql-tools/load-files')
const {typeDefs: typeDefsScalars,resolvers:resolversScalars}= require('graphql-scalars');
const {buildContext}= require('graphql-passport')
const resolversApp = require('./resolvers')
// el ! significa un campo obligatorio

const  useGraphql= async (app)=>{
  const resolvers = [ resolversApp , resolversScalars];

  const typeDefs = [ ...await loadFiles('./src/**/*.graphql')/*typesDefs Locals*/ ,typeDefsScalars]

  const server = new ApolloServer({
    typeDefs,
    resolvers,
    context:({req,res})=> buildContext({req,res}),
    plugins: [ApolloServerPluginLandingPageLocalDefault]
  });
  await server.start();
  server.applyMiddleware({app})
}

module.exports = useGraphql;

Crear scalar personalizado con Expresiones regulares

const { login } = require("./auth/auth.resolver")
const { allCategories, categoryById , addCategory} = require("./categories.resolver")
const { product, products ,createProduct,deleteProduct,updateProduct} = require("./product.resolver")
const { getPersons , findPerson, createPerson} = require("./resolver.person")

const {RegularExpression} = require('graphql-scalars')
// creamos el type con una nueva instancia de RegularExpression 

const CategoryNameType= new RegularExpression('CategoryNameType', /^[a-zA-Z0-9]{3,8}$/);

const resolvers= {
  Query:{
    saludo: ()=> 'hola mundillo de internet',
    persons:getPersons,
    findPerson,
    allCategories,
    categoryById,
    product,
    products
  },
  Mutation:{
    createPerson,
    createProduct,
    deleteProduct,
    updateProduct,
    addCategory,
    login
  },
  CategoryNameType // add new type
}

module.exports = resolvers

utilizamos nuestro scalars en nuestros typeDefs


scalar CategoryNameType
input CreateCategory {
  name: CategoryNameType!,
  image: URL!,
  # products:[Product]
 }

el type URL retorna es un objecto con la url desustrurada, por lo tanto se debe sacar la url del objeto en la propiedad href

const addCategory = async (root, {dto},context)=>{
  const user = await checkJwtGql(context) //validate jtw
  checkRoleGql(user,'admin') ; // validate Role
  // console.log(dto)
  const newCategory = await service.create({
    ...dto,
    image:dto.image.href// url Image
  });
  return newCategory;
}

hay que tener en cuenta que también debemos cambiar el schema para actualizar una categoría
src/graphql/schema.graphql:

input UpdateCategoryDto {
  name: String
  image: URL
}

y su resolver
src/graphql/category.resolvers.js:

const updateCategory = (_, { id, dto })=> {
  return service.update(id, {
    ...dto,
    image: dto.image.href
  })
}

esto debido a que si no lo hacemos, podríamos modificar la categoría pasándole un String cualquiera y seria permitido