Skip to content

Commit 004a6d4

Browse files
committed
🛂 Introduce @Permission decorator
This decorator can accept permission conditions required to access the resource. For example: `@Permission({ type: 'plan', permission: 'editPlanData' })` Non-global permissions also take id argument of the query into account to check access permissions.
1 parent 173eda8 commit 004a6d4

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { actionIsPermitted } from '@unocha/hpc-api-core/src/auth';
2+
import { RequiredPermissionsCondition } from '@unocha/hpc-api-core/src/auth/permissions';
3+
import { Context } from '@unocha/hpc-api-core/src/lib/context';
4+
import { ForbiddenError } from '@unocha/hpc-api-core/src/util/error';
5+
import { createMethodDecorator, ResolverData } from 'type-graphql';
6+
7+
type RequiredPermissions = (
8+
resolverData: ResolverData<Context>
9+
) => Promise<RequiredPermissionsCondition<never>>;
10+
11+
// eslint-disable-next-line @typescript-eslint/naming-convention
12+
export function Permission(
13+
requiredPermissions: RequiredPermissions
14+
): MethodDecorator {
15+
return createMethodDecorator(
16+
async (resolverData: ResolverData<Context>, next) => {
17+
const permissions = await requiredPermissions(resolverData);
18+
const { context } = resolverData;
19+
20+
if (!(await actionIsPermitted(permissions, context))) {
21+
throw new ForbiddenError('No permission to perform this action');
22+
}
23+
24+
return next();
25+
}
26+
);
27+
}

0 commit comments

Comments
 (0)