Skip to content

Commit 92c1a40

Browse files
authored
Merge pull request #54 from DouglasNeuroInformatics/export-create-app-ability
fix: export createAppAbility for testing
2 parents d170478 + c3aec05 commit 92c1a40

File tree

4 files changed

+24
-14
lines changed

4 files changed

+24
-14
lines changed

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export { ValidationSchema } from './decorators/validation-schema.decorator.js';
1515
export type { AppVersion, DocsConfig } from './docs/docs.factory.js';
1616
export { acceptLanguage } from './middleware/accept-language.middleware.js';
1717
export { DataTransferObject } from './mixins/data-transfer-object.mixin.js';
18+
export { createAppAbility } from './modules/auth/ability.utils.js';
1819
export type {
1920
AppAbility,
2021
AppAction,
Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
1-
import { AbilityBuilder, detectSubjectType } from '@casl/ability';
1+
import { AbilityBuilder } from '@casl/ability';
22
import { createPrismaAbility } from '@casl/prisma';
33
import { Inject, Injectable } from '@nestjs/common';
44

55
import { LoggingService } from '../logging/logging.service.js';
6+
import { createAppAbility, detectAppSubject } from './ability.utils.js';
67
import { DEFINE_ABILITY_TOKEN } from './auth.config.js';
78

8-
import type { AppAbilities, AppAbility, DefineAbility, Permission } from './auth.config.js';
9+
import type { AppAbility, DefineAbility, Permission } from './auth.config.js';
910

1011
@Injectable()
1112
export class AbilityFactory {
12-
private detectSubjectType = (obj: { [key: string]: unknown }): string => {
13-
if (typeof obj.__modelName === 'string') {
14-
return obj.__modelName;
15-
}
16-
return detectSubjectType(obj);
17-
};
18-
1913
constructor(
2014
private readonly loggingService: LoggingService,
2115
@Inject(DEFINE_ABILITY_TOKEN) private readonly defineAbility?: DefineAbility
@@ -32,7 +26,7 @@ export class AbilityFactory {
3226
this.defineAbility(abilityBuilder, payload, metadata);
3327
}
3428
return abilityBuilder.build({
35-
detectSubjectType: this.detectSubjectType
29+
detectSubjectType: detectAppSubject
3630
});
3731
}
3832

@@ -41,8 +35,6 @@ export class AbilityFactory {
4135
message: 'Creating Ability From Permissions',
4236
permissions
4337
});
44-
return createPrismaAbility<AppAbilities>(permissions, {
45-
detectSubjectType: this.detectSubjectType
46-
});
38+
return createAppAbility(permissions);
4739
}
4840
}

src/modules/auth/ability.utils.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { detectSubjectType } from '@casl/ability';
2+
import { createPrismaAbility } from '@casl/prisma';
3+
4+
import type { AppAbilities, AppAbility, Permission } from './auth.config.js';
5+
6+
export function detectAppSubject(obj: { [key: string]: unknown }): string {
7+
if (typeof obj.__modelName === 'string') {
8+
return obj.__modelName;
9+
}
10+
return detectSubjectType(obj);
11+
}
12+
13+
export function createAppAbility(permissions: Permission[]): AppAbility {
14+
return createPrismaAbility<AppAbilities>(permissions, {
15+
detectSubjectType: detectAppSubject
16+
});
17+
}

src/modules/auth/auth.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type DefineAbility<TPayload extends { [key: string]: unknown } = { [key: string]
4040
metadata: TMetadata
4141
) => void;
4242

43-
type Permission = RawRuleOf<PureAbility<[AppAction, AppSubjectName]>>;
43+
type Permission = RawRuleOf<PureAbility<[AppAction, AppSubjectName], AppConditions>>;
4444

4545
type BaseLoginCredentials = {
4646
password: string;

0 commit comments

Comments
 (0)