feat(directives): add @hasRole directive

This commit is contained in:
izzy lyseggen
2020-08-12 16:03:13 +01:00
parent 392c95d3e1
commit ec09927f94
2 changed files with 40 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
const { ApolloError, ForbiddenError, SchemaDirectiveVisitor } = require( 'apollo-server-express' )
const { defaultFieldResolver } = require( 'graphql' )
const appRoot = require( 'app-root-path' )
const knex = require( `${appRoot}/db/knex` )
let roles
module.exports = {
hasRole: class HasRoleDirective extends SchemaDirectiveVisitor {
visitFieldDefinition( field ) {
const { resolver = defaultFieldResolver, name } = field
const requiredRole = this.args.role
console.log( requiredRole )
field.resolve = async function ( parent, args, context, info ) {
if ( !roles )
roles = await knex( 'user_roles' ).select( '*' )
if ( !context.auth ) throw new ForbiddenError( 'You must provide an auth token.' )
if ( context.role === 'server:admin' ) {
// pass
} else {
let role = roles.find( r => r.name === requiredRole )
let myRole = roles.find( r => r.name === context.role )
console.log( context.role )
if ( role === null ) new ApolloError( 'Invalid server role specified' )
if ( myRole === null ) new ForbiddenError( 'You do not have the required server role (null)' )
if ( myRole.weight < role.weight )
throw new ForbiddenError( 'You do not have the required server role' )
}
const data = await resolver.call( this, parent, args, context, info )
return data
}
}
}
}
+2
View File
@@ -34,6 +34,7 @@ exports.graph = ( ) => {
let typeDefs = [ `
${scalarSchemas}
directive @hasScope(scope: String!) on FIELD_DEFINITION
directive @hasRole(role: String!) on FIELD_DEFINITION
type Query {
"""
@@ -84,5 +85,6 @@ exports.graph = ( ) => {
merge( resolvers, o )
} )
console.log( schemaDirectives )
return { resolvers, typeDefs, schemaDirectives }
}