core-mvc
Version:
Simple but powerful MVC framework for NodeJS.
76 lines (64 loc) • 2.56 kB
text/typescript
import { GraphQLError } from 'graphql';
import { define } from './gqlDefinitions';
import { ResolverRequest, Result } from '../gql';
import { gqlFieldResolverSymbol } from './gqlSymbols';
import { shouldDenyAccess } from './securityHandler';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const buildResolverObject = (fullPath: string, value: any) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const resolvers: any = {};
let current = resolvers;
const keys = fullPath.split('.');
for (const key of keys.slice(0, -1)) {
current[key] = {};
current = current[key];
}
current[keys.slice(-1)[0]] = value;
return resolvers;
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const gqlHandler = (controller: any, instance: any, name: string | symbol) => {
const fullPaths: string[] | undefined = Reflect.getMetadata(
gqlFieldResolverSymbol,
controller,
name
);
if (fullPaths) {
for (const fullPath of fullPaths) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const resolvers = buildResolverObject(
fullPath,
async (...args: any[]) => {
// const rawContext: GraphQLResolverContext = args[2];
const resolverRequest: ResolverRequest = {
params: args[1],
parent: args[0],
user: args[2].req.user,
};
if (shouldDenyAccess(controller, name, args[2])) {
throw new GraphQLError(`Not authorized to do this`, {
extensions: { code: 'FORBIDDEN' },
});
}
const response = await instance[name](resolverRequest);
if (response instanceof Result) {
const { cookies } = response;
if (cookies) {
for (const [cookieName, value] of Object.entries(
cookies
)) {
args[2].res.cookie(cookieName, value);
}
}
return response.data;
}
return response;
}
);
define({
resolvers,
});
}
}
};
export default gqlHandler;