Search code examples
graphqlschemaresolver

Create GraphQL connection between User and Role Type via Role and query them


I want to create a GraphQL connection between User <> Role <> Role_Type and finally get the User Role Type back with a query. Here is brake it down to the only important lines of code:

type Query {
  getUsers: [User]
}
type User {
  _id: ID
  firstname: String
  roles: [Role]
}
type Role {
  _id: ID
  role_type_id: ID
  role_types: [Role_Type]
  user_id: ID
}
type Role_Type {
  _id: ID
  name: String
}

and in the User resolver I have:

Query: {
  getUser: async (root, { _id }) => {
    return prepare(await DBUsers.findOne(ObjectId(_id)))
  }
},
User: {
  roles: async ({_id}) => {
    return (await MongoDBRoles.find({user_id: _id}).toArray()).map(prepare)
  }
}

and for the Role resolver:

Role: {
  role_types: async ({_id}) => {
    return (await MongoDBRoleTypes.find({role_type_id: _id}).toArray()).map(prepare)
  },
},

When I query now with:

{
  getUser(_id: "5d555adcd2c22a242863f7a1") {
    firstname
    roles {
      _id
      role_type_id
      user_id
      role_types {
        name
      }
    }
  }
}

I get:

{
  "data": {
    "getUser": {
      "firstname": "Gregor",
      "roles": [
        {
          "_id": "5d90cf352f50882ab0ce3877",
          "role_type_id": "5d90ce48b7893d19bcc328f9",
          "user_id": "5d555adcd2c22a242863f7a1",
          "role_types": []
        }
      ]
    }
  }
}

But why is role_types empty. As you can see the role_type_id is filled. So why there is no connection.

When I watch into MongoDB I can see the Role Type of the user.MongoDB

If you need more Schema/Resolver let me know.


Solution

  • Ok it was kind of easy to fix. Actually the Role resolver was going multiple matches. But somehow it needs to be single lookup. That does not make much sense but somehow the search for the id lookup is a single lookup. Anyway here is what I have changed and now it works properly.

    Replace this:

    role_types: async ({_id}) => {
      return (await MongoDBRoleTypes.find({role_type_id: _id}).toArray()).map(prepare)
    },
    

    with:

    role_type: async ({role_type_id}) => {
      return prepare(await DBRoleTypes.findOne(ObjectId(role_type_id)))
    },
    

    and you fix this.