Manan Vaghasiya
Manan Vaghasiya

Reputation: 922

how to reuse resolvers in graphql

I am new to graphql, I was creating following schema with graphql

// promotion type

const PromoType = new GraphQLObjectType({
  name: 'Promo',
  description: 'Promo object',
  fields: () => ({
    id: {
      type: GraphQLID,
      description: 'id of the promo'
    },
    title: {
      type: GraphQLString,
      description: 'this is just a test'
    },
    departments: {
      type: new GraphQLList(DepartmentType),
      description: 'departments associated with the promo'
    }
  })
})

and department type

// department type

const DepartmentType = new GraphQLObjectType({
  name: 'Department',
  description: 'Department object',
  fields: () => ({
    id: {
      type: GraphQLID,
      description: 'id of the department'
    },
    name: {
      type: GraphQLString,
      description: 'name of the department'
    },
    createdAt: {
      type: GraphQLDate,
      description: 'date the promo is created'
    },
    updatedAt: {
      type: GraphQLDate,
      description: 'date the promo is last updated'
    }
  })
});

and the following are the resolvers

// Promos resolver

const promos = {
  type: new GraphQLList(PromoType),
  resolve: (_, args, context) => {

    let promos = getPromos()
    let departments = getDepartmentsById(promos.promoId)
    return merge(promos, departments)
  }
};


//Departments resolver
const departments = {
  type: new GraphQLList(DepartmentType),
  args: {
      promoId: {
      type: GraphQLID
    }
  },
  resolve: (_, args, context) => {

    return getDepartmentsById(args.promoId)
  }
};

the problem is I want to use the resolver of the departments into the resolver of the promos to get the departments.

I might be missing something obvious but is there any way to do this?

Upvotes: 3

Views: 1638

Answers (1)

wednesdaymiko
wednesdaymiko

Reputation: 283

This is the way to do it. You want to think of it as graphs, rather than just a single rest endpoint.

To get data for Promo, you need to do it similarly to how I did it here, but for the parent node, if that makes sense. So, in e.g. viewer's resolve you add the query for Promo.

const PromoType = new GraphQLObjectType({
  name: 'Promo',
  description: 'Promo object',
  fields: () => ({
    id: {
      type: GraphQLID,
      description: 'id of the promo',
    },
    title: {
      type: GraphQLString,
      description: 'this is just a test',
    },
    departments: {
      type: new GraphQLList(DepartmentType),
      description: 'departments associated with the promo',
      resolve: (rootValue) => {
        return getDepartmentsById(rootValue.promoId);
      }
    }
  })
});

Upvotes: 1

Related Questions