Search code examples
node.jsgraphqlgraphql-jsapollo-serverexpress-graphql

NodeJs GraphQL enum type value as dynamic


https://launchpad.graphql.com/9qvqz3v5r

Here is my example graphQL Schema. i am trying to use enum type. How do i get enum values from backend and give it into schema?

// Construct a schema, using GraphQL schema language
const typeDefs = `
  type User {
        userId: Int
        firstName: String
        lastName: String
        pincode:String
        state:String
        country:String
  }
  type Query {
    hello: String
    user: User
  }
  type CreateUserLoad {
    user: User 
  }
  enum Role {
        writer
        reader
        author
        admin
        superAdmin
  }
  type Mutation{
        createUser(firstName: String, lastName: String, role: Role): User
  }
`;

I want to populate enum Role value from dynamic variable as

const roleData = ['writer','reader','author','admin','superAdmin'];

Can anyone help me?


Solution

  • You can simply use string interpolation:

    // Construct a schema, using GraphQL schema language
    const typeDefs = `
      type User {
            userId: Int
            firstName: String
            lastName: String
            pincode:String
            state:String
            country:String
      }
      type Query {
        hello: String
        user: User
      }
      type CreateUserLoad {
        user: User 
      }
      enum Role { ${roles.join(' ')} }
      type Mutation{
            createUser(firstName: String, lastName: String, role: Role): User
      }
    `;
    

    In fact, on every incoming grahpql query you have to pass the parsed schema to the graphql server, so you can even change it for every request. In that case, it would be better to change the object representation that the schema parsing returned.

    For creating enum types directly, say you have an array of values userRoles and want a RolesEnum type, then you can create it like so:

    const roleValues = {}
    for (const value of userRoles) {
        roleValues[value] = {value}
    }
    const RolesEnum = new GraphQLEnumType({
        name: 'UserRoles',
        values: roleValues,
    })
    

    you can then assign that directly as a type in your schema.