Files
speckle-server/modules/core/graph/directives/hasRole.js
T
izzy lyseggen 222f932547 feat(auth-dirs): revert @hasScope and @hasRole
make these field definition only again so it works for now.
the obj directives problem is more messy than i thought 🙃
2020-08-19 15:41:42 +01:00

44 lines
1.4 KiB
JavaScript

const { SchemaDirectiveVisitor, ForbiddenError } = require( 'apollo-server-express' )
const { defaultFieldResolver } = require( 'graphql' )
const appRoot = require( 'app-root-path' )
const { validateServerRole } = require( `${appRoot}/modules/shared` )
module.exports = {
hasRole: class HasRoleDirective extends SchemaDirectiveVisitor {
visitObject( type ) {
this.wrapFields( type )
}
visitFieldDefinition( field, details ) {
// this.wrapFields( details.objectType )
const { resolver = field.resolve || defaultFieldResolver, name } = field
const requiredRole = this.args.role
field.resolve = async function ( parent, args, context, info ) {
await validateServerRole( context, requiredRole )
const data = await resolver.call( this, parent, args, context, info )
return data
}
}
wrapFields( objectType ) {
const fields = objectType.getFields()
Object.keys( fields ).forEach( fieldName => {
const field = fields[ fieldName ];
const { resolver = field.resolve || defaultFieldResolver, name } = field
const requiredRole = this.args.role
field.resolve = async function ( parent, args, context, info ) {
await validateServerRole( context, requiredRole )
const data = await resolver.call( this, parent, args, context, info )
return data
}
} )
}
}
}