generator-nest-js-boilerplate
Version:
This generator will help you to build your own Nest.js Mongodb API using TypeScript 4
32 lines (26 loc) • 1.03 kB
text/typescript
import {
AbilityBuilder, ExtractSubjectType, InferSubjects, MongoAbility, createMongoAbility,
} from '@casl/ability';
import { RolesEnum } from '@decorators/roles.decorator';
import { Injectable } from '@nestjs/common';
import { UserEntity } from '@prisma/client';
import { UserResponseEntity } from '@v1/users/entities/user-response.entity';
import Action from './enums/casl-action.enum';
type Subjects = InferSubjects<typeof UserResponseEntity> | 'all';
export type AppAbility = MongoAbility<[Action, Subjects]>;
()
export default class CaslAbilityFactory {
createForUser(user: Omit<UserEntity, 'roles'> & { roles: string[] }) {
const { can, build, cannot } = new AbilityBuilder<
MongoAbility<[Action, Subjects]>
>(createMongoAbility);
if (user.roles.includes(RolesEnum.ADMIN)) {
can(Action.Manage, 'all');
} else {
can(Action.Read, 'all');
}
return build({
detectSubjectType: (item: any) => item.constructor as ExtractSubjectType<Subjects>,
});
}
}