Picsur/backend/src/decorators/permissions.decorator.ts

58 lines
1.7 KiB
TypeScript
Raw Normal View History

import {
2022-09-06 14:32:16 +00:00
createParamDecorator,
ExecutionContext,
SetMetadata,
UseGuards,
} from '@nestjs/common';
2022-08-26 18:40:16 +00:00
import { Fail, FT } from 'picsur-shared/dist/types';
2022-03-27 20:48:10 +00:00
import { CombineFCDecorators } from 'picsur-shared/dist/util/decorator';
2022-04-18 12:34:53 +00:00
import { LocalAuthGuard } from '../managers/auth/guards/local-auth.guard';
import { Permission, Permissions } from '../models/constants/permissions.const';
2022-09-03 18:03:28 +00:00
import AuthFastifyRequest from '../models/interfaces/authrequest.dto';
2022-03-12 14:10:22 +00:00
export const RequiredPermissions = (...permissions: Permissions) => {
return SetMetadata('permissions', permissions);
};
2022-03-28 10:44:00 +00:00
// Just a verbose wrapper
2022-03-12 20:13:58 +00:00
export const NoPermissions = () => RequiredPermissions();
2022-03-12 14:10:22 +00:00
2022-03-28 10:44:00 +00:00
// This still requires permissions, but also allows the client to use user/pass authentication instead of JWT
2022-03-12 14:10:22 +00:00
export const UseLocalAuth = (...permissions: Permissions) =>
2022-03-27 20:48:10 +00:00
CombineFCDecorators(
2022-03-12 14:10:22 +00:00
RequiredPermissions(...permissions),
UseGuards(LocalAuthGuard),
);
export const HasPermission = createParamDecorator(
(data: Permission, ctx: ExecutionContext) => {
2022-09-03 18:03:28 +00:00
const req: AuthFastifyRequest = ctx.switchToHttp().getRequest();
const permissions = req.userPermissions;
if (!permissions) {
2022-09-06 14:32:16 +00:00
throw Fail(
FT.Internal,
undefined,
'Permissions are missing from request',
);
}
return permissions.includes(data);
},
);
export const GetPermissions = createParamDecorator(
(data: Permission, ctx: ExecutionContext) => {
2022-09-03 18:03:28 +00:00
const req: AuthFastifyRequest = ctx.switchToHttp().getRequest();
const permissions = req.userPermissions;
if (!permissions) {
2022-09-06 14:32:16 +00:00
throw Fail(
FT.Internal,
undefined,
'Permissions are missing from request',
);
}
return permissions;
},
);