Git Product home page Git Product logo

Comments (4)

vladinator1000 avatar vladinator1000 commented on April 20, 2024 29

Thanks @helfer, it took me a while to figure out how to deal with my connectors, but it worked. The app is more complex than what's shown, but I hope my solution will aid anyone who might be struggling with this:

Schema:

type Artist {
    id: Int,
    name: String,
}

type Venue {
    id: Int,
    name: String,
}

union Owner = Artist | Venue

type Event {
    id: Int!,
    owner: Owner,
}

type RootQuery {
  event(id: Int): Event,
  venue(id: Int): Venue,
}

Resolvers:

    RootQuery: {
        event(_, args) {
            return eventModel.getEventById(args.id);
        },
        venue(_, args) {
            return venueModel.getVenueById(args.id);
        },
    },
    Event: {
        owner(event) {
            return eventModel.getOwner(event.id)
        },
    },
    Venue: {
        id(venue) {
            return venue.id;
        },
        name(venue) {
            return venue.name;
        },
    },
    Artist: {
        id(artist) {
            return artist.id;
        },
        name(artist) {
            return artist.name;
        },
    },
    Owner: { // this needs to receive an object with a type property for it to work, check your connectors!
        __resolveType(owner, ctx, info) {
            if(owner.type == 'artist') {
                return info.schema.getType('Artist');
            } else return info.schema.getType('Venue');
        },
    }

The query:

{
  event(id: 3) {
    owner {
      ... on Artist {
        name
      }
    }
  }
}

If anyone's using Knex, here's my connector:

export class Event {
    getOwner(eventId) {
        return knex('event')
            // Check the owner type
            .where('event.id', eventId)
            .then(result => {
                // Customise result for each owner type
                if(result[0].owner_type === 'artist') {
                    return knex('event')
                        .join('artist', 'artist.id', 'event.owner_id')
                        .select('artist.id', 'artist.name')
                        .where('event.id', eventId)
                        .limit(1)
                        .first()
                        .then(response => {
                            response.type = 'artist';
                            return response;
                        })
                } else if(result[0].owner_type === 'venue') {
                    return knex('event')
                        .join('venue', 'venue.id', 'event.venue_id')
                        .select('venue.id', 'venue.name')
                        .where('event.id', eventId)
                        .limit(1)
                        .first()
                        .then(response => {
                            response.type = 'venue';
                            return response;
                        })

                }
            });
    }
}

from apollo-server.

helfer avatar helfer commented on April 20, 2024 19

You can use a union:

union ArtistOrVenue = Artist | Venue

from apollo-server.

DxCx avatar DxCx commented on April 20, 2024 2

Hi @twonmulti

It will return the GraphQLObjectType defined for them.
Then this is what resolveType will return to resolve the abstract type..

from apollo-server.

townmulti avatar townmulti commented on April 20, 2024

@savovs In you Resolvers section, what does info.schema.getType('Artist') return?

    Owner: { // this needs to receive an object with a type property for it to work, check your connectors!
        __resolveType(owner, ctx, info) {
            if(owner.type == 'artist') {
                return info.schema.getType('Artist');
            } else return info.schema.getType('Venue');
        },
    }

I'm trying to figure out exactly what I should be returning here. I have a type field on my unioned objects. Is it a string, object, or something else?

from apollo-server.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.