engineering-hub

Knowledge index of IT engineering

View project on GitHub

Using unions

const DATA = [
  { username : 'catherine' },
  { director : 'catherine hardwicke' },
  { author : 'catherine cookson' }
];

const UserType = new GraphQLObjectType({
  name : 'User',
  fields : {
    username : { type : GraphQLString }
  }
});

const MovieType = new GraphQLObjectType({
  name : 'Movie',
  fields : {
    director : { type : GraphQLString }
  }
});

const BookType = new GraphQLObjectType({
  name : 'Book',
  fields : {
    author : { type : GraphQLString }
  }
});

const resolveType = (data) => {
  if (data.username) {
    return UserType;
  }
  if (data.director) {
    return MovieType;
  }
  if (data.author) {
    return BookType;
  }
};

const SearchableType = new GraphQLUnionType({
  name: 'SearchableType',
  types: [ UserType, MovieType, BookType ],
  resolveType: resolveType
});

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'RootQueryType',
    fields: {
      search: {
        type: new GraphQLList(SearchableType),
        args:  {
          text: { type : new GraphQLNonNull(GraphQLString) }
        },
        resolve(root, args) {
          const text = args.text;
          return DATA.filter((d) => {
            const searchableProperty = d.username || d.director || d.author;
            return searchableProperty.indexOf(text) !== -1;
          });
        }
      }
    }
  })
});

const query = `
  {
    search(text: "cat") {
      ... on User {
        username
      }
      ... on Movie {
        director
      }
      ... on Book {
        author
      }
    }
  }
`;

Using interfaces

const DATA = [
  { username : 'catherine' },
  { director : 'catherine hardwicke' },
  { author : 'catherine cookson' }
];

const UserType = new GraphQLObjectType({
  name : 'User',
  interfaces: [SearchableType],
  fields : {
    username : {
      type : GraphQLString
    },
    searchPreviewText : {
      type : GraphQLString,
      resolve(data) {
        return `(user) ${data.username}`;
      }
    }
  }
  // isTypeOf: data => !!data.username;
});

const MovieType = new GraphQLObjectType({
  name : 'Movie',
  fields : {
    director : { type : GraphQLString }
  }
});

const BookType = new GraphQLObjectType({
  name : 'Book',
  fields : {
    author : { type : GraphQLString }
  }
});

// can also add isTypeOf on every type instead of resolve type
const resolveType = (data) => {
  if (data.username) {
    return UserType;
  }
  if (data.director) {
    return MovieType;
  }
  if (data.author) {
    return BookType;
  }
};

const SearchableType = new GraphQLInterfaceType({
  name: 'Searchable',
  fields: {
    searchPreviewText: { type: GraphQLString }
  },
  resolveType: resolveType
});

const schema = new GraphQLSchema({
  types: [MovieType, BookType, UserType, SearchableType],
  query: new GraphQLObjectType({
    name: 'RootQueryType',
    fields: {
      search: {
        type: new GraphQLList(SearchableType),
        args:  {
          text: { type : new GraphQLNonNull(GraphQLString) }
        },
        resolve(root, args) {
          const text = args.text;
          return DATA.filter((d) => {
            const searchableProperty = d.username || d.director || d.author;
            return searchableProperty.indexOf(text) !== -1;
          });
        }
      }
    }
  })
});

const query = `
  {
    search(text: "cat") {
      ... on User {
        username
      }
      ... on Movie {
        director
      }
      ... on Book {
        author
      }
    }
  }
`;

Resources