import { IPermission, IExpressionInput, IMutationViewsByName } from "../gql-schema-builder/interfaces"; // tslint:disable-next-line:function-name export function QueryPermissions(readExpressions: IExpressionInput) { return (target: object, columnName: string): void => { const entityName = target.constructor.name; addQueryPermissions(entityName, columnName, readExpressions); }; } interface IMutationPermissions { createViews?: IMutationViewsByName; updateViews?: IMutationViewsByName; deleteExpressions?: IExpressionInput; } // tslint:disable-next-line:function-name export function MutationPermissions(options: IMutationPermissions) { return (target: any) => { const entityName = target.name; addMutationPermissions(entityName, options); return target; }; } const permissions: { [gqlTypeName: string]: IPermission } = {}; function addQueryPermissions(gqlTypeName: string, columnName: string, readExpressions: IExpressionInput) { const permission = getPermissionAndCreateIfNotExist(gqlTypeName); permission.readExpressions = { ...permission.readExpressions, [columnName]: readExpressions }; } function addMutationPermissions(gqlTypeName: string, options: IMutationPermissions): void { const permission = getPermissionAndCreateIfNotExist(gqlTypeName); permission.createViews = options.createViews; permission.updateViews = options.updateViews; permission.deleteExpressions = options.deleteExpressions; } function getPermissionAndCreateIfNotExist(gqlTypeName: string): IPermission { if (permissions[gqlTypeName] == null) { permissions[gqlTypeName] = { gqlTypeName }; } return permissions[gqlTypeName] as IPermission; } export function getDecoratorPermissions(): IPermission[] { return Object.values(permissions); }