@dudousxd/nestjs-authz-prisma 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +64 -4
- package/dist/authz-rbac.module.d.ts +17 -0
- package/dist/authz-rbac.module.d.ts.map +1 -1
- package/dist/authz-rbac.module.js +51 -9
- package/dist/authz-rbac.module.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prisma-authz.store.d.ts +42 -17
- package/dist/prisma-authz.store.d.ts.map +1 -1
- package/dist/prisma-authz.store.js +103 -39
- package/dist/prisma-authz.store.js.map +1 -1
- package/dist/prisma-client.d.ts +10 -1
- package/dist/prisma-client.d.ts.map +1 -1
- package/dist/prisma-client.js +3 -1
- package/dist/prisma-client.js.map +1 -1
- package/dist/tenancy.d.ts +100 -0
- package/dist/tenancy.d.ts.map +1 -0
- package/dist/tenancy.js +128 -0
- package/dist/tenancy.js.map +1 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @dudousxd/nestjs-authz-prisma
|
|
2
2
|
|
|
3
|
+
## 1.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#73](https://github.com/DavideCarvalho/nestjs-authz/pull/73) [`9fd6787`](https://github.com/DavideCarvalho/nestjs-authz/commit/9fd6787307361b8552236a833d969fa041a46bca) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Fix the `$queryRaw` permission fast path: it is now called on the client instead of detached from it. A real `PrismaClient` threw on the unbound call, so every permission check silently fell back to the three-query path.
|
|
8
|
+
|
|
9
|
+
## 1.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#72](https://github.com/DavideCarvalho/nestjs-authz/pull/72) [`58a5d72`](https://github.com/DavideCarvalho/nestjs-authz/commit/58a5d72d2964a7cfae9cbfe8506526c8518ba30a) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Tenancy for the RBAC modules, following the `@dudousxd/nestjs-context` tenancy switch.
|
|
14
|
+
|
|
15
|
+
- New `tenancy` option (`'inherit' | false | { enabled?, kinds?, nullRows?, roles? }`, default `'inherit'`). With context tenancy on, permission and role checks are scoped to the request's tenant from `Context.setTenant`. A request with no tenant, inside `Context.allTenants()`, or outside a request sees global assignments only. `kinds` limits the tenant kinds this module honours. With tenancy off nothing changes.
|
|
16
|
+
- `tenancy.roles` maps the caller's role inside the tenant (`tenant.role`) to authz roles that apply in that tenant only, e.g. `{ owner: 'org_admin' }`.
|
|
17
|
+
- New `tenant` resolver option, `(user) => tenantId | null | undefined`: an explicit tenant that wins over the context.
|
|
18
|
+
- MikroORM and Prisma can now store tenant-scoped role assignments like Drizzle and TypeORM: `assignRole`, `removeRole` and `setUserRoles` take `{ tenantId }`, and the read methods take a tenant scope. MikroORM: build the entities with `createAuthzEntitySchemas({}, { tenantScoped: true })`. Prisma: add `tenantId String @default("")` to `UserRole` and its `@@id`, then pass `tenantScoped: true`. Without that, every assignment stays global.
|
|
19
|
+
|
|
3
20
|
## 1.0.0
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -185,10 +185,70 @@ await store.listRoleAssignments({ user: { type: 'user', id: 7 } });
|
|
|
185
185
|
await store.removeUser({ type: 'user', id: 7 });
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
nothing. Without `roleSources: true` every row
|
|
191
|
-
`source` matches nothing.
|
|
188
|
+
`tenantId` filters: omitted = every tenant, `null` = global assignments only, a string = that
|
|
189
|
+
tenant's scoped assignments only. Without `tenantScoped: true` (below) every row has
|
|
190
|
+
`tenantId: null`, so a tenant id string matches nothing. Without `roleSources: true` every row
|
|
191
|
+
is `'manual'`, so filtering by another `source` matches nothing.
|
|
192
|
+
|
|
193
|
+
## Tenant-scoped roles
|
|
194
|
+
|
|
195
|
+
Tenant-scoped assignments are opt-in. Add the column to `UserRole` and its `@@id`, then run
|
|
196
|
+
`prisma migrate dev` (existing rows get `''`, a global assignment):
|
|
197
|
+
|
|
198
|
+
```prisma
|
|
199
|
+
model UserRole {
|
|
200
|
+
userType String
|
|
201
|
+
userId String
|
|
202
|
+
roleId String
|
|
203
|
+
tenantId String @default("")
|
|
204
|
+
|
|
205
|
+
@@id([userType, userId, roleId, tenantId])
|
|
206
|
+
@@index([userType, userId])
|
|
207
|
+
@@map("authz_user_role")
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Then turn it on: `new PrismaAuthzStore(prisma, { tenantScoped: true })`, or
|
|
212
|
+
`AuthzRbacModule.forRoot({ client: prisma, tenantScoped: true })`.
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
await store.assignRole(user, 'editor', { tenantId: 'acme' }); // only inside acme
|
|
216
|
+
await store.assignRole(user, 'viewer'); // everywhere
|
|
217
|
+
await store.getRolesForUser(user, { tenantId: 'acme' }); // ['editor', 'viewer']
|
|
218
|
+
await store.getRolesForUser(user); // ['viewer']
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
`removeRole` and `setUserRoles` take the same `{ tenantId }` (omitted = the global
|
|
222
|
+
assignments). Without `tenantScoped`, every assignment is global and reads ignore the tenant.
|
|
223
|
+
`assignRole` and `setUserRoles` with a `tenantId` throw; `removeRole` with one does nothing,
|
|
224
|
+
since there is no tenant assignment to remove.
|
|
225
|
+
|
|
226
|
+
## Tenancy
|
|
227
|
+
|
|
228
|
+
The RBAC module reads the tenant only when tenancy is on: turn it on with
|
|
229
|
+
`ContextModule.forRoot({ tenancy: { enabled: true } })` in `@dudousxd/nestjs-context`. Checks
|
|
230
|
+
are then scoped to the request's tenant from `Context.setTenant(...)`.
|
|
231
|
+
A request with no tenant, or inside `Context.allTenants()`, sees global assignments only.
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
AuthzRbacModule.forRoot({
|
|
235
|
+
client: prisma,
|
|
236
|
+
tenantScoped: true,
|
|
237
|
+
tenancy: {
|
|
238
|
+
kinds: ['organization'], // optional: tenant kinds this module honours
|
|
239
|
+
roles: { owner: 'org_admin', member: 'org_member' }, // optional: tenant.role → authz roles in that tenant
|
|
240
|
+
},
|
|
241
|
+
tenant: (user) => (user as { orgId?: string }).orgId, // optional: an explicit tenant wins over the context
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
`tenancy` defaults to `'inherit'` (follow the context switch); `false` keeps this module out.
|
|
246
|
+
Roles mapped with `roles` apply only inside that tenant and only to the context's current user.
|
|
247
|
+
The `tenant` resolver returns a tenant id, `null` for the global scope, or `undefined` to fall
|
|
248
|
+
back to the context.
|
|
249
|
+
|
|
250
|
+
With tenancy on and without `tenantScoped`, every assignment is global, so only `roles` and the
|
|
251
|
+
`tenant` resolver change what a check sees.
|
|
192
252
|
|
|
193
253
|
## License
|
|
194
254
|
|
|
@@ -2,6 +2,7 @@ import type { UserRef } from '@dudousxd/nestjs-authz/store-kit';
|
|
|
2
2
|
import { type DynamicModule } from '@nestjs/common';
|
|
3
3
|
import { PrismaAuthzStore } from './prisma-authz.store.js';
|
|
4
4
|
import { type PrismaAuthzClientLike } from './prisma-client.js';
|
|
5
|
+
import { type AuthzTenancyOption, type TenantResolver } from './tenancy.js';
|
|
5
6
|
/** Injection token holding the {@link PrismaAuthzStore} the RBAC module manages. */
|
|
6
7
|
export declare const AUTHZ_RBAC_STORE: unique symbol;
|
|
7
8
|
/** Injection token holding the resolved {@link AuthzRbacModuleOptions}. */
|
|
@@ -30,11 +31,27 @@ export interface AuthzRbacModuleOptions {
|
|
|
30
31
|
* `source` column on `UserRole`. Only used when the module builds the store from `client`.
|
|
31
32
|
*/
|
|
32
33
|
roleSources?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Tenant-scoped role assignments (see {@link PrismaAuthzStoreOptions.tenantScoped}); requires
|
|
36
|
+
* the `tenantId` column on `UserRole`. Only used when the module builds the store from `client`.
|
|
37
|
+
*/
|
|
38
|
+
tenantScoped?: boolean;
|
|
33
39
|
/**
|
|
34
40
|
* Derive a {@link UserRef} from the Gate's current user. Defaults to
|
|
35
41
|
* {@link defaultUserRefMapper} (`{ type, id }` or `{ id }`).
|
|
36
42
|
*/
|
|
37
43
|
userRefFrom?: UserRefMapper;
|
|
44
|
+
/**
|
|
45
|
+
* Tenancy, from `@dudousxd/nestjs-context`. `'inherit'` (default) follows `ContextModule`'s
|
|
46
|
+
* `tenancy.enabled`; with it on, checks are scoped to the context tenant. The object form adds
|
|
47
|
+
* `kinds` and `roles` (map the caller's `tenant.role` to authz roles in that tenant).
|
|
48
|
+
*/
|
|
49
|
+
tenancy?: AuthzTenancyOption;
|
|
50
|
+
/**
|
|
51
|
+
* Explicit tenant for a check, from the user being checked. Wins over the context: return a
|
|
52
|
+
* tenant id, `null` for the global scope, or `undefined` to fall back to the context.
|
|
53
|
+
*/
|
|
54
|
+
tenant?: TenantResolver;
|
|
38
55
|
}
|
|
39
56
|
export interface AuthzRbacModuleAsyncOptions {
|
|
40
57
|
imports?: unknown[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz-rbac.module.d.ts","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"authz-rbac.module.d.ts","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAQnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACL,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EAEpB,MAAM,cAAc,CAAC;AAEtB,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,eAAoD,CAAC;AAClF,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,eAAsD,CAAC;AAEtF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,oFAAoF;IACpF,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;CAC9F;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAOvE;AA0ID;;;;;;GAMG;AACH,qBACa,eAAe;IAC1B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa;IAa9D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,2BAA2B,GAAG,aAAa;IAsBxE,OAAO,CAAC,MAAM,CAAC,eAAe;CAS/B"}
|
|
@@ -11,9 +11,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
var AuthzRbacModule_1;
|
|
14
|
-
import { PERMISSION_PROVIDER, ROLE_PROVIDER, } from '@dudousxd/nestjs-authz';
|
|
14
|
+
import { CONTEXT_ACCESSOR, PERMISSION_PROVIDER, ROLE_PROVIDER, } from '@dudousxd/nestjs-authz';
|
|
15
15
|
import { Inject, Injectable, Module, Optional, } from '@nestjs/common';
|
|
16
|
+
import { ModuleRef } from '@nestjs/core';
|
|
16
17
|
import { PrismaAuthzStore } from './prisma-authz.store.js';
|
|
18
|
+
import { rbacTenant, } from './tenancy.js';
|
|
17
19
|
/** Injection token holding the {@link PrismaAuthzStore} the RBAC module manages. */
|
|
18
20
|
export const AUTHZ_RBAC_STORE = Symbol.for('@dudousxd/nestjs-authz-prisma:store');
|
|
19
21
|
/** Injection token holding the resolved {@link AuthzRbacModuleOptions}. */
|
|
@@ -35,7 +37,10 @@ function resolveStore(options) {
|
|
|
35
37
|
if (options.store)
|
|
36
38
|
return options.store;
|
|
37
39
|
if (options.client) {
|
|
38
|
-
return new PrismaAuthzStore(options.client,
|
|
40
|
+
return new PrismaAuthzStore(options.client, {
|
|
41
|
+
...(options.roleSources ? { roleSources: true } : {}),
|
|
42
|
+
...(options.tenantScoped ? { tenantScoped: true } : {}),
|
|
43
|
+
});
|
|
39
44
|
}
|
|
40
45
|
throw new Error('AuthzRbacModule (prisma): provide either `store` or `client` in the options.');
|
|
41
46
|
}
|
|
@@ -46,13 +51,27 @@ function resolveStore(options) {
|
|
|
46
51
|
*/
|
|
47
52
|
let RbacPermissionProvider = class RbacPermissionProvider {
|
|
48
53
|
options;
|
|
54
|
+
context;
|
|
55
|
+
moduleRef;
|
|
49
56
|
// `getPermissions` lists every grant `hasPermission` can find, for any resource.
|
|
50
57
|
exhaustivePermissions = true;
|
|
51
58
|
store;
|
|
52
|
-
|
|
59
|
+
contextCache = { resolved: false, value: undefined };
|
|
60
|
+
constructor(options, context, moduleRef) {
|
|
53
61
|
this.options = options;
|
|
62
|
+
this.context = context;
|
|
63
|
+
this.moduleRef = moduleRef;
|
|
54
64
|
this.store = resolveStore(options);
|
|
55
65
|
}
|
|
66
|
+
tenant(user, ref) {
|
|
67
|
+
return rbacTenant(this.options, user, ref, this.context, this.moduleRef, this.contextCache, false);
|
|
68
|
+
}
|
|
69
|
+
/** The permissions `tenancy.roles` grants through the caller's role in the tenant. */
|
|
70
|
+
async tenantRolePermissions(roles) {
|
|
71
|
+
if (roles.length === 0)
|
|
72
|
+
return [];
|
|
73
|
+
return Object.values(await this.store.getRolePermissions(roles)).flat();
|
|
74
|
+
}
|
|
56
75
|
// The core `PermissionProvider` interface passes an optional `resource` (3rd
|
|
57
76
|
// arg); it is intentionally ignored here. RBAC grants are model-less,
|
|
58
77
|
// named-ability grants (the Laravel/spatie `Gate::before` grant), so the
|
|
@@ -62,7 +81,10 @@ let RbacPermissionProvider = class RbacPermissionProvider {
|
|
|
62
81
|
const ref = map(user);
|
|
63
82
|
if (ref === undefined)
|
|
64
83
|
return undefined;
|
|
65
|
-
|
|
84
|
+
const tenant = this.tenant(user, ref);
|
|
85
|
+
if (await this.store.userHasPermission(ref, permission, tenant.scope))
|
|
86
|
+
return true;
|
|
87
|
+
return (await this.tenantRolePermissions(tenant.roles)).includes(permission);
|
|
66
88
|
}
|
|
67
89
|
// Expose the user's full granted permission set so the core can apply
|
|
68
90
|
// Laravel/spatie-style wildcard matching (a granted `posts.*` satisfies a check
|
|
@@ -72,13 +94,20 @@ let RbacPermissionProvider = class RbacPermissionProvider {
|
|
|
72
94
|
const ref = map(user);
|
|
73
95
|
if (ref === undefined)
|
|
74
96
|
return undefined;
|
|
75
|
-
|
|
97
|
+
const tenant = this.tenant(user, ref);
|
|
98
|
+
const own = await this.store.getPermissionsForUser(ref, tenant.scope);
|
|
99
|
+
if (tenant.roles.length === 0)
|
|
100
|
+
return own;
|
|
101
|
+
return [...new Set([...own, ...(await this.tenantRolePermissions(tenant.roles))])];
|
|
76
102
|
}
|
|
77
103
|
};
|
|
78
104
|
RbacPermissionProvider = __decorate([
|
|
79
105
|
Injectable(),
|
|
80
106
|
__param(0, Inject(AUTHZ_RBAC_OPTIONS)),
|
|
81
|
-
|
|
107
|
+
__param(1, Optional()),
|
|
108
|
+
__param(1, Inject(CONTEXT_ACCESSOR)),
|
|
109
|
+
__param(2, Optional()),
|
|
110
|
+
__metadata("design:paramtypes", [Object, Object, ModuleRef])
|
|
82
111
|
], RbacPermissionProvider);
|
|
83
112
|
/**
|
|
84
113
|
* The RBAC {@link RoleProvider} the Gate consults (via the shared {@link ROLE_PROVIDER}
|
|
@@ -88,23 +117,36 @@ RbacPermissionProvider = __decorate([
|
|
|
88
117
|
*/
|
|
89
118
|
let RbacRoleProvider = class RbacRoleProvider {
|
|
90
119
|
options;
|
|
120
|
+
context;
|
|
121
|
+
moduleRef;
|
|
91
122
|
store;
|
|
92
|
-
|
|
123
|
+
contextCache = { resolved: false, value: undefined };
|
|
124
|
+
constructor(options, context, moduleRef) {
|
|
93
125
|
this.options = options;
|
|
126
|
+
this.context = context;
|
|
127
|
+
this.moduleRef = moduleRef;
|
|
94
128
|
this.store = resolveStore(options);
|
|
95
129
|
}
|
|
130
|
+
tenant(user, ref) {
|
|
131
|
+
return rbacTenant(this.options, user, ref, this.context, this.moduleRef, this.contextCache, false);
|
|
132
|
+
}
|
|
96
133
|
async getRoles(user) {
|
|
97
134
|
const map = this.options.userRefFrom ?? defaultUserRefMapper;
|
|
98
135
|
const ref = map(user);
|
|
99
136
|
if (ref === undefined)
|
|
100
137
|
return undefined;
|
|
101
|
-
|
|
138
|
+
const tenant = this.tenant(user, ref);
|
|
139
|
+
const own = await this.store.getRolesForUser(ref, tenant.scope);
|
|
140
|
+
return tenant.roles.length === 0 ? own : [...new Set([...own, ...tenant.roles])];
|
|
102
141
|
}
|
|
103
142
|
};
|
|
104
143
|
RbacRoleProvider = __decorate([
|
|
105
144
|
Injectable(),
|
|
106
145
|
__param(0, Inject(AUTHZ_RBAC_OPTIONS)),
|
|
107
|
-
|
|
146
|
+
__param(1, Optional()),
|
|
147
|
+
__param(1, Inject(CONTEXT_ACCESSOR)),
|
|
148
|
+
__param(2, Optional()),
|
|
149
|
+
__metadata("design:paramtypes", [Object, Object, ModuleRef])
|
|
108
150
|
], RbacRoleProvider);
|
|
109
151
|
/**
|
|
110
152
|
* Runs `ensureSchema` on bootstrap when `autoCreateSchema` is enabled. For Prisma this is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz-rbac.module.js","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EACL,mBAAmB,EAEnB,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,MAAM,EACN,UAAU,EACV,MAAM,EAEN,QAAQ,GAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"authz-rbac.module.js","sourceRoot":"","sources":["../src/authz-rbac.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EAEnB,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,MAAM,EACN,UAAU,EACV,MAAM,EAEN,QAAQ,GAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAML,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,oFAAoF;AACpF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AAClF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AAwDtF,qFAAqF;AACrF,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACtE,MAAM,CAAC,GAAG,IAAwC,CAAC;IACnD,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAqB,CAAC;IACnC,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;AACpE,CAAC;AAED,0FAA0F;AAC1F,SAAS,YAAY,CAAC,OAA+B;IACnD,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE;YAC1C,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,IACM,sBAAsB,GAD5B,MACM,sBAAsB;IAQqB;IACU;IAC1B;IAT/B,iFAAiF;IACxE,qBAAqB,GAAG,IAAI,CAAC;IAErB,KAAK,CAAmB;IACxB,YAAY,GAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAE1F,YAC+C,OAA+B,EACrB,OAA+B,EACzD,SAAqB;QAFL,YAAO,GAAP,OAAO,CAAwB;QACrB,YAAO,GAAP,OAAO,CAAwB;QACzD,cAAS,GAAT,SAAS,CAAY;QAElD,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAEO,MAAM,CAAC,IAAa,EAAE,GAAY;QACxC,OAAO,UAAU,CACf,IAAI,CAAC,OAAO,EACZ,IAAI,EACJ,GAAG,EACH,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,YAAY,EACjB,KAAK,CACN,CAAC;IACJ,CAAC;IAED,sFAAsF;IAC9E,KAAK,CAAC,qBAAqB,CAAC,KAAe;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,CAAC;IAED,6EAA6E;IAC7E,sEAAsE;IACtE,yEAAyE;IACzE,yDAAyD;IACzD,KAAK,CAAC,aAAa,CAAC,IAAa,EAAE,UAAkB;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnF,OAAO,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/E,CAAC;IAED,sEAAsE;IACtE,gFAAgF;IAChF,6EAA6E;IAC7E,KAAK,CAAC,cAAc,CAAC,IAAa;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAC1C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;CACF,CAAA;AA1DK,sBAAsB;IAD3B,UAAU,EAAE;IASR,WAAA,MAAM,CAAC,kBAAkB,CAAC,CAAA;IAC1B,WAAA,QAAQ,EAAE,CAAA;IAAE,WAAA,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACpC,WAAA,QAAQ,EAAE,CAAA;qDAA8B,SAAS;GAVhD,sBAAsB,CA0D3B;AAED;;;;;GAKG;AACH,IACM,gBAAgB,GADtB,MACM,gBAAgB;IAK2B;IACU;IAC1B;IANd,KAAK,CAAmB;IACxB,YAAY,GAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAE1F,YAC+C,OAA+B,EACrB,OAA+B,EACzD,SAAqB;QAFL,YAAO,GAAP,OAAO,CAAwB;QACrB,YAAO,GAAP,OAAO,CAAwB;QACzD,cAAS,GAAT,SAAS,CAAY;QAElD,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAEO,MAAM,CAAC,IAAa,EAAE,GAAY;QACxC,OAAO,UAAU,CACf,IAAI,CAAC,OAAO,EACZ,IAAI,EACJ,GAAG,EACH,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,YAAY,EACjB,KAAK,CACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAa;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;QAC7D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;CACF,CAAA;AAhCK,gBAAgB;IADrB,UAAU,EAAE;IAMR,WAAA,MAAM,CAAC,kBAAkB,CAAC,CAAA;IAC1B,WAAA,QAAQ,EAAE,CAAA;IAAE,WAAA,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACpC,WAAA,QAAQ,EAAE,CAAA;qDAA8B,SAAS;GAPhD,gBAAgB,CAgCrB;AAED;;;GAGG;AACH,IACM,kBAAkB,GADxB,MACM,kBAAkB;IAEqC;IAD3D,YAC2D,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;IACxF,CAAC;IAEJ,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,IAAI;YAAE,OAAO;QACnD,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;IAClD,CAAC;CACF,CAAA;AAVK,kBAAkB;IADvB,UAAU,EAAE;IAGR,WAAA,QAAQ,EAAE,CAAA;IAAE,WAAA,MAAM,CAAC,kBAAkB,CAAC,CAAA;;GAFrC,kBAAkB,CAUvB;AAED;;;;;;GAMG;AAEI,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,MAAM,CAAC,OAAO,CAAC,OAA+B;QAC5C,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAClD,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;gBACtE,GAAG,iBAAe,CAAC,eAAe,EAAE;aACrC;YACD,OAAO,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,CAAC;SAChE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAoC;QACtD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAoB;YACnD,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,kBAAkB;oBAC3B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAyB;iBACvD;gBACD;oBACE,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,CAAC,IAA4B,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;oBAChE,MAAM,EAAE,CAAC,kBAAkB,CAAC;iBAC7B;gBACD,GAAG,iBAAe,CAAC,eAAe,EAAE;aACrC;YACD,OAAO,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,CAAC;SAChE,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,eAAe;QAC5B,OAAO;YACL,sBAAsB;YACtB,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,sBAAsB,EAAE;YACrE,gBAAgB;YAChB,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE;YACzD,kBAAkB;SACnB,CAAC;IACJ,CAAC;CACF,CAAA;AA7CY,eAAe;IAD3B,MAAM,CAAC,EAAE,CAAC;GACE,eAAe,CA6C3B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export { PRISMA_AUTHZ_STORE_OPTIONS, PRISMA_CLIENT, type PrismaAuthzClientLike, type PrismaAuthzStoreOptions, type PrismaModelDelegate, } from './prisma-client.js';
|
|
2
|
-
export { PrismaAuthzStore } from './prisma-authz.store.js';
|
|
3
|
-
export type { RoleAssignment, RoleAssignmentFilter, RoleSourceOptions, UserAuthz, UserRoleAssignment, } from './prisma-authz.store.js';
|
|
2
|
+
export { GLOBAL_TENANT, PrismaAuthzStore } from './prisma-authz.store.js';
|
|
3
|
+
export type { RoleAssignment, RoleAssignmentFilter, RoleSourceOptions, TenantScope, UserAuthz, UserRoleAssignment, } from './prisma-authz.store.js';
|
|
4
4
|
export { AUTHZ_RBAC_OPTIONS, AUTHZ_RBAC_STORE, AuthzRbacModule, defaultUserRefMapper, } from './authz-rbac.module.js';
|
|
5
5
|
export type { AuthzRbacModuleAsyncOptions, AuthzRbacModuleOptions, UserRefMapper, } from './authz-rbac.module.js';
|
|
6
|
+
export type { AuthzTenancyOption, TenantResolver } from './tenancy.js';
|
|
6
7
|
export type { UserRef, UserRefInput } from '@dudousxd/nestjs-authz/store-kit';
|
|
7
8
|
export { applyScope, compileScope } from './scope.js';
|
|
8
9
|
export type { PrismaWhere, ScopeResolver } from './scope.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,aAAa,EACb,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,aAAa,EACb,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,2BAA2B,EAC3B,sBAAsB,EACtB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { PRISMA_AUTHZ_STORE_OPTIONS, PRISMA_CLIENT, } from './prisma-client.js';
|
|
2
|
-
export { PrismaAuthzStore } from './prisma-authz.store.js';
|
|
2
|
+
export { GLOBAL_TENANT, PrismaAuthzStore } from './prisma-authz.store.js';
|
|
3
3
|
export { AUTHZ_RBAC_OPTIONS, AUTHZ_RBAC_STORE, AuthzRbacModule, defaultUserRefMapper, } from './authz-rbac.module.js';
|
|
4
4
|
export { applyScope, compileScope } from './scope.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,aAAa,GAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,aAAa,GAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAS1E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAQhC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import { type RoleAssignment, type RoleAssignmentFilter, type UserAuthz, type UserRef, type UserRoleAssignment } from '@dudousxd/nestjs-authz/store-kit';
|
|
2
2
|
import { type PrismaAuthzClientLike, type PrismaAuthzStoreOptions } from './prisma-client.js';
|
|
3
3
|
export type { RoleAssignment, RoleAssignmentFilter, UserAuthz, UserRoleAssignment };
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Optional tenant scope for a query. Omitted → the GLOBAL scope (only global assignments; a
|
|
6
|
+
* tenant-scoped role never leaks into an unscoped check). With a `tenantId`, global assignments
|
|
7
|
+
* AND that tenant's apply. Needs `tenantScoped: true`; without it every assignment is global.
|
|
8
|
+
*/
|
|
9
|
+
export interface TenantScope {
|
|
10
|
+
tenantId?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Assignment source (default `'manual'`, needs `roleSources: true`) and tenant (needs
|
|
14
|
+
* `tenantScoped: true`) for role mutations — see `setUserRoles`.
|
|
15
|
+
*/
|
|
16
|
+
export interface RoleSourceOptions extends TenantScope {
|
|
6
17
|
source?: string;
|
|
7
18
|
}
|
|
19
|
+
/** The tenant id of a GLOBAL role assignment (applies in every tenant). */
|
|
20
|
+
export declare const GLOBAL_TENANT = "";
|
|
8
21
|
/**
|
|
9
22
|
* Prisma-backed RBAC store. Receives the app-owned Prisma client via the
|
|
10
23
|
* {@link PRISMA_CLIENT} DI token — NO internal connection ownership, NO `@prisma/client`
|
|
@@ -22,6 +35,12 @@ export declare class PrismaAuthzStore {
|
|
|
22
35
|
* `{}` otherwise (legacy schema without the column) — where a non-default source is an error.
|
|
23
36
|
*/
|
|
24
37
|
private sourceField;
|
|
38
|
+
/** The `tenantId` value of a written assignment (`{}` without `tenantScoped`). */
|
|
39
|
+
private tenantField;
|
|
40
|
+
/** Assignments visible in a scope: global ones, plus the tenant's own when one is given. */
|
|
41
|
+
private tenantWhere;
|
|
42
|
+
/** The public `tenantId` of a stored row: `null` for a global assignment. */
|
|
43
|
+
private static rowTenant;
|
|
25
44
|
/**
|
|
26
45
|
* No-op: Prisma is schema-first / consumer-managed. Declare the RBAC models in your
|
|
27
46
|
* `schema.prisma` (see {@link PrismaAuthzClientLike}) and apply them with
|
|
@@ -68,7 +87,9 @@ export declare class PrismaAuthzStore {
|
|
|
68
87
|
assignRole(user: UserRef, roleName: string, opts?: RoleSourceOptions): Promise<void>;
|
|
69
88
|
/**
|
|
70
89
|
* Remove a role from a user. No-op if the role or assignment is absent. With `{ source }` only
|
|
71
|
-
* that source's assignment goes; without it, the role is removed from every source.
|
|
90
|
+
* that source's assignment goes; without it, the role is removed from every source. With
|
|
91
|
+
* `tenantScoped`, `{ tenantId }` removes the assignment in that tenant and omitting it removes
|
|
92
|
+
* the global one.
|
|
72
93
|
*/
|
|
73
94
|
removeRole(user: UserRef, roleName: string, opts?: RoleSourceOptions): Promise<void>;
|
|
74
95
|
/**
|
|
@@ -76,18 +97,23 @@ export declare class PrismaAuthzStore {
|
|
|
76
97
|
* `roleNames` — e.g. an SSO/SCIM sync calls `setUserRoles(user, mappedRoles, { source: 'sso' })`
|
|
77
98
|
* on every login; other sources' assignments are untouched. Roles are created by name when
|
|
78
99
|
* missing. Atomic when the client has `$transaction`. Without `roleSources: true` there is only
|
|
79
|
-
* one (implicit manual) source, so this replaces ALL of the user's roles.
|
|
100
|
+
* one (implicit manual) source, so this replaces ALL of the user's roles. With `tenantScoped` it
|
|
101
|
+
* replaces the assignments of one tenant (`{ tenantId }`), or the global ones when omitted.
|
|
80
102
|
*/
|
|
81
103
|
setUserRoles(user: UserRef, roleNames: readonly string[], opts?: RoleSourceOptions): Promise<void>;
|
|
82
|
-
/**
|
|
83
|
-
|
|
104
|
+
/**
|
|
105
|
+
* Every role assignment of a user visible in a tenant scope (global ones always; the tenant's
|
|
106
|
+
* own with `{ tenantId }`), one entry per `(role, source, tenant)`.
|
|
107
|
+
*/
|
|
108
|
+
getRoleAssignments(user: UserRef, scope?: TenantScope): Promise<RoleAssignment[]>;
|
|
84
109
|
/**
|
|
85
110
|
* Raw role-assignment rows for admin listings — e.g. who holds a role (`{ role: 'admin' }`) or
|
|
86
111
|
* a user's assignments with their sources (`{ user }`). `role` accepts one name or a list;
|
|
87
112
|
* `user` and `source` narrow further. Ordered by `(userType, userId, role, source)`.
|
|
88
113
|
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
114
|
+
* `tenantId`: omitted = no tenant filter; `null` = global assignments only; a string = exactly
|
|
115
|
+
* that tenant's scoped assignments. Without `tenantScoped: true` every row is global
|
|
116
|
+
* (`tenantId: null`), so a tenant id string matches nothing.
|
|
91
117
|
* Without `roleSources: true` every row is `'manual'`, so another `source` matches nothing.
|
|
92
118
|
*/
|
|
93
119
|
listRoleAssignments(filter?: RoleAssignmentFilter): Promise<UserRoleAssignment[]>;
|
|
@@ -96,8 +122,8 @@ export declare class PrismaAuthzStore {
|
|
|
96
122
|
* Roles and permissions are kept. (This adapter has no direct user permissions.)
|
|
97
123
|
*/
|
|
98
124
|
removeUser(user: UserRef): Promise<void>;
|
|
99
|
-
/** The role names a user holds. */
|
|
100
|
-
getRolesForUser(user: UserRef): Promise<string[]>;
|
|
125
|
+
/** The role names a user holds, in a tenant scope (see {@link TenantScope}). */
|
|
126
|
+
getRolesForUser(user: UserRef, scope?: TenantScope): Promise<string[]>;
|
|
101
127
|
/**
|
|
102
128
|
* The flattened, distinct permission names a user has via their roles.
|
|
103
129
|
*
|
|
@@ -107,12 +133,11 @@ export declare class PrismaAuthzStore {
|
|
|
107
133
|
*
|
|
108
134
|
* Fast path: when the injected client exposes `$queryRaw`, assemble the set in a
|
|
109
135
|
* SINGLE database round-trip via one JOIN (3 round-trips → 1). On ANY failure
|
|
110
|
-
* (
|
|
111
|
-
* quoting, etc.) it degrades to {@link getPermissionsViaDelegates}, so correctness
|
|
136
|
+
* (custom `@@map` table names, non-Postgres identifier quoting, etc.) it degrades to {@link getPermissionsViaDelegates}, so correctness
|
|
112
137
|
* is preserved everywhere and only the common (Postgres + documented schema) case
|
|
113
138
|
* gets the speedup.
|
|
114
139
|
*/
|
|
115
|
-
getPermissionsForUser(user: UserRef): Promise<string[]>;
|
|
140
|
+
getPermissionsForUser(user: UserRef, scope?: TenantScope): Promise<string[]>;
|
|
116
141
|
/**
|
|
117
142
|
* The original three-query implementation (userRole → rolePermission → permission),
|
|
118
143
|
* returning the same deduped permission-name set as {@link getPermissionsForUser}.
|
|
@@ -120,9 +145,9 @@ export declare class PrismaAuthzStore {
|
|
|
120
145
|
* fast path throws.
|
|
121
146
|
*/
|
|
122
147
|
private getPermissionsViaDelegates;
|
|
123
|
-
/** A user's roles + effective permissions in one shot. */
|
|
124
|
-
getUserAuthz(user: UserRef): Promise<UserAuthz>;
|
|
125
|
-
/** True when the user holds `permission` through any of their roles. */
|
|
126
|
-
userHasPermission(user: UserRef, permission: string): Promise<boolean>;
|
|
148
|
+
/** A user's roles + effective permissions in one shot, in a tenant scope. */
|
|
149
|
+
getUserAuthz(user: UserRef, scope?: TenantScope): Promise<UserAuthz>;
|
|
150
|
+
/** True when the user holds `permission` through any of their roles, in a tenant scope. */
|
|
151
|
+
userHasPermission(user: UserRef, permission: string, scope?: TenantScope): Promise<boolean>;
|
|
127
152
|
}
|
|
128
153
|
//# sourceMappingURL=prisma-authz.store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-authz.store.d.ts","sourceRoot":"","sources":["../src/prisma-authz.store.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,kBAAkB,EAIxB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAI5B,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAEpF,
|
|
1
|
+
{"version":3,"file":"prisma-authz.store.d.ts","sourceRoot":"","sources":["../src/prisma-authz.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,9 +10,12 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
|
+
var PrismaAuthzStore_1;
|
|
13
14
|
import { randomUUID } from 'node:crypto';
|
|
14
15
|
import { DEFAULT_ROLE_SOURCE, compareUserRoleAssignments, normalizeUserRef, roleFilterNames, } from '@dudousxd/nestjs-authz/store-kit';
|
|
15
16
|
import { PRISMA_AUTHZ_STORE_OPTIONS, PRISMA_CLIENT, } from './prisma-client.js';
|
|
17
|
+
/** The tenant id of a GLOBAL role assignment (applies in every tenant). */
|
|
18
|
+
export const GLOBAL_TENANT = '';
|
|
16
19
|
// Optional Nest DI decorators — declared structurally so this package does not need a
|
|
17
20
|
// hard runtime dependency on @nestjs/common for the POJO store (the module supplies the
|
|
18
21
|
// real Inject token). The store is usable as a plain POJO: `new PrismaAuthzStore(client)`.
|
|
@@ -25,7 +28,7 @@ import { Inject, Injectable, Optional } from '@nestjs/common';
|
|
|
25
28
|
* Same method surface as the TypeORM/MikroORM adapters. The user is referenced BY ID ONLY
|
|
26
29
|
* — this package never owns a users table.
|
|
27
30
|
*/
|
|
28
|
-
let PrismaAuthzStore = class PrismaAuthzStore {
|
|
31
|
+
let PrismaAuthzStore = PrismaAuthzStore_1 = class PrismaAuthzStore {
|
|
29
32
|
client;
|
|
30
33
|
options;
|
|
31
34
|
constructor(client, options = {}) {
|
|
@@ -44,6 +47,29 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
44
47
|
}
|
|
45
48
|
return {};
|
|
46
49
|
}
|
|
50
|
+
/** The `tenantId` value of a written assignment (`{}` without `tenantScoped`). */
|
|
51
|
+
tenantField(tenantId) {
|
|
52
|
+
if (this.options?.tenantScoped)
|
|
53
|
+
return { tenantId: tenantId ?? GLOBAL_TENANT };
|
|
54
|
+
if (tenantId !== undefined && tenantId !== GLOBAL_TENANT) {
|
|
55
|
+
throw new Error(`PrismaAuthzStore: a tenant-scoped role assignment needs \`tenantId String @default("")\` on the UserRole model (in its @@id) and the store built with { tenantScoped: true }.`);
|
|
56
|
+
}
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
/** Assignments visible in a scope: global ones, plus the tenant's own when one is given. */
|
|
60
|
+
tenantWhere(scope) {
|
|
61
|
+
if (!this.options?.tenantScoped)
|
|
62
|
+
return {};
|
|
63
|
+
const tenantId = scope?.tenantId ?? GLOBAL_TENANT;
|
|
64
|
+
return tenantId === GLOBAL_TENANT
|
|
65
|
+
? { tenantId: GLOBAL_TENANT }
|
|
66
|
+
: { tenantId: { in: [GLOBAL_TENANT, tenantId] } };
|
|
67
|
+
}
|
|
68
|
+
/** The public `tenantId` of a stored row: `null` for a global assignment. */
|
|
69
|
+
static rowTenant(row) {
|
|
70
|
+
const value = row.tenantId;
|
|
71
|
+
return value === undefined || value === null || value === GLOBAL_TENANT ? null : value;
|
|
72
|
+
}
|
|
47
73
|
/**
|
|
48
74
|
* No-op: Prisma is schema-first / consumer-managed. Declare the RBAC models in your
|
|
49
75
|
* `schema.prisma` (see {@link PrismaAuthzClientLike}) and apply them with
|
|
@@ -206,26 +232,37 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
206
232
|
async assignRole(user, roleName, opts) {
|
|
207
233
|
const { type, id } = normalizeUserRef(user);
|
|
208
234
|
const source = this.sourceField(opts?.source);
|
|
235
|
+
const tenant = this.tenantField(opts?.tenantId);
|
|
209
236
|
const roleId = await this.createRole(roleName);
|
|
210
237
|
const existing = await this.client.userRole.findFirst({
|
|
211
|
-
where: { userType: type, userId: id, roleId, ...source },
|
|
238
|
+
where: { userType: type, userId: id, roleId, ...source, ...tenant },
|
|
212
239
|
});
|
|
213
240
|
if (existing)
|
|
214
241
|
return;
|
|
215
|
-
await this.client.userRole.create({
|
|
242
|
+
await this.client.userRole.create({
|
|
243
|
+
data: { userType: type, userId: id, roleId, ...source, ...tenant },
|
|
244
|
+
});
|
|
216
245
|
}
|
|
217
246
|
/**
|
|
218
247
|
* Remove a role from a user. No-op if the role or assignment is absent. With `{ source }` only
|
|
219
|
-
* that source's assignment goes; without it, the role is removed from every source.
|
|
248
|
+
* that source's assignment goes; without it, the role is removed from every source. With
|
|
249
|
+
* `tenantScoped`, `{ tenantId }` removes the assignment in that tenant and omitting it removes
|
|
250
|
+
* the global one.
|
|
220
251
|
*/
|
|
221
252
|
async removeRole(user, roleName, opts) {
|
|
222
253
|
const { type, id } = normalizeUserRef(user);
|
|
223
254
|
const source = opts?.source === undefined ? {} : this.sourceField(opts.source);
|
|
255
|
+
if (!this.options?.tenantScoped &&
|
|
256
|
+
opts?.tenantId !== undefined &&
|
|
257
|
+
opts.tenantId !== GLOBAL_TENANT) {
|
|
258
|
+
return; // no tenant column: there is no tenant-scoped assignment to remove
|
|
259
|
+
}
|
|
260
|
+
const tenant = this.tenantField(opts?.tenantId);
|
|
224
261
|
const roleId = await this.findRoleId(roleName);
|
|
225
262
|
if (!roleId)
|
|
226
263
|
return;
|
|
227
264
|
await this.client.userRole.deleteMany({
|
|
228
|
-
where: { userType: type, userId: id, roleId, ...source },
|
|
265
|
+
where: { userType: type, userId: id, roleId, ...source, ...tenant },
|
|
229
266
|
});
|
|
230
267
|
}
|
|
231
268
|
/**
|
|
@@ -233,27 +270,36 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
233
270
|
* `roleNames` — e.g. an SSO/SCIM sync calls `setUserRoles(user, mappedRoles, { source: 'sso' })`
|
|
234
271
|
* on every login; other sources' assignments are untouched. Roles are created by name when
|
|
235
272
|
* missing. Atomic when the client has `$transaction`. Without `roleSources: true` there is only
|
|
236
|
-
* one (implicit manual) source, so this replaces ALL of the user's roles.
|
|
273
|
+
* one (implicit manual) source, so this replaces ALL of the user's roles. With `tenantScoped` it
|
|
274
|
+
* replaces the assignments of one tenant (`{ tenantId }`), or the global ones when omitted.
|
|
237
275
|
*/
|
|
238
276
|
async setUserRoles(user, roleNames, opts) {
|
|
239
277
|
const { type, id } = normalizeUserRef(user);
|
|
240
278
|
const source = this.sourceField(opts?.source);
|
|
279
|
+
const tenant = this.tenantField(opts?.tenantId);
|
|
241
280
|
const roleIds = [];
|
|
242
281
|
for (const name of new Set(roleNames))
|
|
243
282
|
roleIds.push(await this.createRole(name));
|
|
244
283
|
const replace = async (client) => {
|
|
245
|
-
await client.userRole.deleteMany({
|
|
284
|
+
await client.userRole.deleteMany({
|
|
285
|
+
where: { userType: type, userId: id, ...source, ...tenant },
|
|
286
|
+
});
|
|
246
287
|
for (const roleId of roleIds) {
|
|
247
|
-
await client.userRole.create({
|
|
288
|
+
await client.userRole.create({
|
|
289
|
+
data: { userType: type, userId: id, roleId, ...source, ...tenant },
|
|
290
|
+
});
|
|
248
291
|
}
|
|
249
292
|
};
|
|
250
293
|
await this.inTransaction(replace);
|
|
251
294
|
}
|
|
252
|
-
/**
|
|
253
|
-
|
|
295
|
+
/**
|
|
296
|
+
* Every role assignment of a user visible in a tenant scope (global ones always; the tenant's
|
|
297
|
+
* own with `{ tenantId }`), one entry per `(role, source, tenant)`.
|
|
298
|
+
*/
|
|
299
|
+
async getRoleAssignments(user, scope) {
|
|
254
300
|
const { type, id } = normalizeUserRef(user);
|
|
255
301
|
const assignments = await this.client.userRole.findMany({
|
|
256
|
-
where: { userType: type, userId: id },
|
|
302
|
+
where: { userType: type, userId: id, ...this.tenantWhere(scope) },
|
|
257
303
|
});
|
|
258
304
|
if (assignments.length === 0)
|
|
259
305
|
return [];
|
|
@@ -266,23 +312,30 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
266
312
|
.map((a) => ({
|
|
267
313
|
role: nameById.get(a.roleId),
|
|
268
314
|
source: a.source ?? DEFAULT_ROLE_SOURCE,
|
|
269
|
-
tenantId:
|
|
315
|
+
tenantId: PrismaAuthzStore_1.rowTenant(a),
|
|
270
316
|
}))
|
|
271
|
-
.sort((a, b) => a.role.localeCompare(b.role) ||
|
|
317
|
+
.sort((a, b) => a.role.localeCompare(b.role) ||
|
|
318
|
+
a.source.localeCompare(b.source) ||
|
|
319
|
+
(a.tenantId ?? '').localeCompare(b.tenantId ?? ''));
|
|
272
320
|
}
|
|
273
321
|
/**
|
|
274
322
|
* Raw role-assignment rows for admin listings — e.g. who holds a role (`{ role: 'admin' }`) or
|
|
275
323
|
* a user's assignments with their sources (`{ user }`). `role` accepts one name or a list;
|
|
276
324
|
* `user` and `source` narrow further. Ordered by `(userType, userId, role, source)`.
|
|
277
325
|
*
|
|
278
|
-
*
|
|
279
|
-
*
|
|
326
|
+
* `tenantId`: omitted = no tenant filter; `null` = global assignments only; a string = exactly
|
|
327
|
+
* that tenant's scoped assignments. Without `tenantScoped: true` every row is global
|
|
328
|
+
* (`tenantId: null`), so a tenant id string matches nothing.
|
|
280
329
|
* Without `roleSources: true` every row is `'manual'`, so another `source` matches nothing.
|
|
281
330
|
*/
|
|
282
331
|
async listRoleAssignments(filter = {}) {
|
|
283
|
-
if (typeof filter.tenantId === 'string')
|
|
284
|
-
return [];
|
|
285
332
|
const where = {};
|
|
333
|
+
if (filter.tenantId !== undefined) {
|
|
334
|
+
if (this.options?.tenantScoped)
|
|
335
|
+
where.tenantId = filter.tenantId ?? GLOBAL_TENANT;
|
|
336
|
+
else if (filter.tenantId !== null)
|
|
337
|
+
return [];
|
|
338
|
+
}
|
|
286
339
|
if (filter.source !== undefined) {
|
|
287
340
|
if (this.options?.roleSources)
|
|
288
341
|
where.source = filter.source;
|
|
@@ -317,7 +370,7 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
317
370
|
userId: a.userId,
|
|
318
371
|
role: nameById.get(a.roleId),
|
|
319
372
|
source: a.source ?? DEFAULT_ROLE_SOURCE,
|
|
320
|
-
tenantId:
|
|
373
|
+
tenantId: PrismaAuthzStore_1.rowTenant(a),
|
|
321
374
|
}))
|
|
322
375
|
.sort(compareUserRoleAssignments);
|
|
323
376
|
}
|
|
@@ -330,11 +383,11 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
330
383
|
await this.client.userRole.deleteMany({ where: { userType: type, userId: id } });
|
|
331
384
|
}
|
|
332
385
|
// --- queries ---
|
|
333
|
-
/** The role names a user holds. */
|
|
334
|
-
async getRolesForUser(user) {
|
|
386
|
+
/** The role names a user holds, in a tenant scope (see {@link TenantScope}). */
|
|
387
|
+
async getRolesForUser(user, scope) {
|
|
335
388
|
const { type, id } = normalizeUserRef(user);
|
|
336
389
|
const assignments = await this.client.userRole.findMany({
|
|
337
|
-
where: { userType: type, userId: id },
|
|
390
|
+
where: { userType: type, userId: id, ...this.tenantWhere(scope) },
|
|
338
391
|
});
|
|
339
392
|
if (assignments.length === 0)
|
|
340
393
|
return [];
|
|
@@ -351,20 +404,31 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
351
404
|
*
|
|
352
405
|
* Fast path: when the injected client exposes `$queryRaw`, assemble the set in a
|
|
353
406
|
* SINGLE database round-trip via one JOIN (3 round-trips → 1). On ANY failure
|
|
354
|
-
* (
|
|
355
|
-
* quoting, etc.) it degrades to {@link getPermissionsViaDelegates}, so correctness
|
|
407
|
+
* (custom `@@map` table names, non-Postgres identifier quoting, etc.) it degrades to {@link getPermissionsViaDelegates}, so correctness
|
|
356
408
|
* is preserved everywhere and only the common (Postgres + documented schema) case
|
|
357
409
|
* gets the speedup.
|
|
358
410
|
*/
|
|
359
|
-
async getPermissionsForUser(user) {
|
|
411
|
+
async getPermissionsForUser(user, scope) {
|
|
360
412
|
const { type, id } = normalizeUserRef(user);
|
|
361
|
-
|
|
362
|
-
|
|
413
|
+
// Call `$queryRaw` as a method ON the client, never detached: the real
|
|
414
|
+
// `PrismaClient.$queryRaw` reads `this`, so an unbound reference throws and would
|
|
415
|
+
// silently send every check down the slow path.
|
|
416
|
+
const client = this.client;
|
|
417
|
+
if (typeof client.$queryRaw === 'function') {
|
|
363
418
|
try {
|
|
364
419
|
// Single JOIN across the three documented `@@map` tables. Identifiers are
|
|
365
420
|
// literal + double-quoted (Postgres); the user `${type}`/`${id}` VALUES go
|
|
366
421
|
// through the tagged template as BOUND params — never string-concatenated.
|
|
367
|
-
const rows =
|
|
422
|
+
const rows = this.options?.tenantScoped
|
|
423
|
+
? await client.$queryRaw `
|
|
424
|
+
SELECT DISTINCT p."name" AS name
|
|
425
|
+
FROM "authz_permissions" p
|
|
426
|
+
JOIN "authz_role_permission" rp ON rp."permissionId" = p."id"
|
|
427
|
+
JOIN "authz_user_role" ur ON ur."roleId" = rp."roleId"
|
|
428
|
+
WHERE ur."userType" = ${type} AND ur."userId" = ${id}
|
|
429
|
+
AND ur."tenantId" IN (${GLOBAL_TENANT}, ${scope?.tenantId ?? GLOBAL_TENANT})
|
|
430
|
+
`
|
|
431
|
+
: await client.$queryRaw `
|
|
368
432
|
SELECT DISTINCT p."name" AS name
|
|
369
433
|
FROM "authz_permissions" p
|
|
370
434
|
JOIN "authz_role_permission" rp ON rp."permissionId" = p."id"
|
|
@@ -375,10 +439,10 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
375
439
|
}
|
|
376
440
|
catch {
|
|
377
441
|
// Raw path unsupported for this client/schema/dialect — fall back below.
|
|
378
|
-
return this.getPermissionsViaDelegates(type, id);
|
|
442
|
+
return this.getPermissionsViaDelegates(type, id, scope);
|
|
379
443
|
}
|
|
380
444
|
}
|
|
381
|
-
return this.getPermissionsViaDelegates(type, id);
|
|
445
|
+
return this.getPermissionsViaDelegates(type, id, scope);
|
|
382
446
|
}
|
|
383
447
|
/**
|
|
384
448
|
* The original three-query implementation (userRole → rolePermission → permission),
|
|
@@ -386,9 +450,9 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
386
450
|
* Used directly when `$queryRaw` is unavailable, and as the fallback when the raw
|
|
387
451
|
* fast path throws.
|
|
388
452
|
*/
|
|
389
|
-
async getPermissionsViaDelegates(type, id) {
|
|
453
|
+
async getPermissionsViaDelegates(type, id, scope) {
|
|
390
454
|
const assignments = await this.client.userRole.findMany({
|
|
391
|
-
where: { userType: type, userId: id },
|
|
455
|
+
where: { userType: type, userId: id, ...this.tenantWhere(scope) },
|
|
392
456
|
});
|
|
393
457
|
if (assignments.length === 0)
|
|
394
458
|
return [];
|
|
@@ -404,21 +468,21 @@ let PrismaAuthzStore = class PrismaAuthzStore {
|
|
|
404
468
|
});
|
|
405
469
|
return [...new Set(permissions.map((p) => p.name))];
|
|
406
470
|
}
|
|
407
|
-
/** A user's roles + effective permissions in one shot. */
|
|
408
|
-
async getUserAuthz(user) {
|
|
471
|
+
/** A user's roles + effective permissions in one shot, in a tenant scope. */
|
|
472
|
+
async getUserAuthz(user, scope) {
|
|
409
473
|
const [roles, permissions] = await Promise.all([
|
|
410
|
-
this.getRolesForUser(user),
|
|
411
|
-
this.getPermissionsForUser(user),
|
|
474
|
+
this.getRolesForUser(user, scope),
|
|
475
|
+
this.getPermissionsForUser(user, scope),
|
|
412
476
|
]);
|
|
413
477
|
return { roles, permissions };
|
|
414
478
|
}
|
|
415
|
-
/** True when the user holds `permission` through any of their roles. */
|
|
416
|
-
async userHasPermission(user, permission) {
|
|
417
|
-
const permissions = await this.getPermissionsForUser(user);
|
|
479
|
+
/** True when the user holds `permission` through any of their roles, in a tenant scope. */
|
|
480
|
+
async userHasPermission(user, permission, scope) {
|
|
481
|
+
const permissions = await this.getPermissionsForUser(user, scope);
|
|
418
482
|
return permissions.includes(permission);
|
|
419
483
|
}
|
|
420
484
|
};
|
|
421
|
-
PrismaAuthzStore = __decorate([
|
|
485
|
+
PrismaAuthzStore = PrismaAuthzStore_1 = __decorate([
|
|
422
486
|
Injectable(),
|
|
423
487
|
__param(0, Inject(PRISMA_CLIENT)),
|
|
424
488
|
__param(1, Optional()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-authz.store.js","sourceRoot":"","sources":["../src/prisma-authz.store.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,mBAAmB,EAMnB,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,0BAA0B,EAC1B,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAW5B,sFAAsF;AACtF,wFAAwF;AACxF,2FAA2F;AAC3F,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE9D;;;;;;;GAOG;AAEI,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAGR;IAGA;IALnB,YAEmB,MAA6B,EAG7B,UAAmC,EAAE;QAHrC,WAAM,GAAN,MAAM,CAAuB;QAG7B,YAAO,GAAP,OAAO,CAA8B;IACrD,CAAC;IAEJ;;;OAGG;IACK,WAAW,CAAC,MAA0B;QAC5C,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,mBAAmB,EAAE,CAAC;QAChF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,mKAAmK,CAC5M,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY;QAChB,6CAA6C;IAC/C,CAAC;IAED,2DAA2D;IAE3D,+EAA+E;IAC/E,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACxC,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;aACrE,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAY,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,IAAI,CAAC,CAAC;YACxE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC9C,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;aACrE,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAY,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,IAAI,CAAC,CAAC;YAC9E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAY;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,GAAG,EAAE,EAAwB,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACxE,OAAO,GAAG,EAAE,EAAwB,CAAC;IACvC,CAAC;IAED,4BAA4B;IAE5B,kFAAkF;IAClF,KAAK,CAAC,oBAAoB,CAAC,QAAgB,EAAE,cAAsB;QACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC;YAC1D,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;SAChC,CAAC,CAAC;QACH,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,wBAAwB,CAAC,QAAgB,EAAE,cAAsB;QACrE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY;YAAE,OAAO;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,gGAAgG;IACxF,KAAK,CAAC,aAAa,CAAI,EAAiD;QAC9E,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACnD,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAyB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAM,CAAC;QACtF,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,IAAI,EAAE,EAAwB,CAAC;YAC9C,IAAI,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAC1B,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgB,EAAE,eAAkC;QAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5C,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9D,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;gBACzC,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,SAA4B;QACnD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACtC,MAAM,GAAG,GAA6B,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAClF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAY,EAAE,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC;QACnF,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,MAAM,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC;YACtD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;SACpD,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACnC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;YACxD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAsB,CAAC,CAAC,CAAC,EAAE,EAAE;SAChF,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAY,EAAE,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC;QAC3F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAsB,CAAC,CAAC;YACnE,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClF,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,sBAAsB;IAEtB;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,IAAa,EAAE,QAAgB,EAAE,IAAwB;QACxE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YACpD,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;SACzD,CAAC,CAAC;QACH,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,IAAa,EAAE,QAAgB,EAAE,IAAwB;QACxE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YACpC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;SACzD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAChB,IAAa,EACb,SAA4B,EAC5B,IAAwB;QAExB,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,KAAK,EAAE,MAA6B,EAAE,EAAE;YACtD,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;YACvF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,kBAAkB,CAAC,IAAa;QACpC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtD,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;SACtC,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,CAAC,EAAE,EAAE;SAChF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAY,EAAE,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO,WAAW;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC;aAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAgB,CAAW;YAChD,MAAM,EAAG,CAAC,CAAC,MAA6B,IAAI,mBAAmB;YAC/D,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,mBAAmB,CAAC,SAA+B,EAAE;QACzD,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACnD,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW;gBAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;iBACvD,IAAI,MAAM,CAAC,MAAM,KAAK,mBAAmB;gBAAE,OAAO,EAAE,CAAC;QAC5D,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACtF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAY,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnD,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACtB,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,CAAC,EAAE,EAAE;SAChF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAY,EAAE,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO,WAAW;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC;aAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,QAAQ,EAAE,CAAC,CAAC,QAAkB;YAC9B,MAAM,EAAE,CAAC,CAAC,MAAgB;YAC1B,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAgB,CAAW;YAChD,MAAM,EAAG,CAAC,CAAC,MAA6B,IAAI,mBAAmB;YAC/D,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;aACF,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,IAAa;QAC5B,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,kBAAkB;IAElB,mCAAmC;IACnC,KAAK,CAAC,eAAe,CAAC,IAAa;QACjC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtD,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;SACtC,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,qBAAqB,CAAC,IAAa;QACvC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACvC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,0EAA0E;gBAC1E,2EAA2E;gBAC3E,2EAA2E;gBAC3E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAyB;;;;;kCAK1B,IAAI,sBAAsB,EAAE;SACrD,CAAC;gBACF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;gBACzE,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,0BAA0B,CAAC,IAAY,EAAE,EAAU;QAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtD,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;SACtC,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC;YACtD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;SACnC,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAsB,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;YACxD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE;SACrC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,YAAY,CAAC,IAAa;QAC9B,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC1B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;SACjC,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAChC,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,iBAAiB,CAAC,IAAa,EAAE,UAAkB;QACvD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC3D,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;CACF,CAAA;AA9YY,gBAAgB;IAD5B,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,aAAa,CAAC,CAAA;IAErB,WAAA,QAAQ,EAAE,CAAA;IACV,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;;GAL1B,gBAAgB,CA8Y5B"}
|
|
1
|
+
{"version":3,"file":"prisma-authz.store.js","sourceRoot":"","sources":["../src/prisma-authz.store.ts"],"names":[],"mappings":"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"}
|
package/dist/prisma-client.d.ts
CHANGED
|
@@ -47,8 +47,10 @@
|
|
|
47
47
|
* roleId String
|
|
48
48
|
* // Only with `roleSources: true` (per-source assignments — see PrismaAuthzStore.setUserRoles):
|
|
49
49
|
* // source String @default("manual")
|
|
50
|
+
* // Only with `tenantScoped: true` (tenant-scoped assignments, '' = global):
|
|
51
|
+
* // tenantId String @default("")
|
|
50
52
|
*
|
|
51
|
-
* @@id([userType, userId, roleId]) //
|
|
53
|
+
* @@id([userType, userId, roleId]) // add `tenantId` and/or `source` to the @@id when enabled
|
|
52
54
|
* @@index([userType, userId])
|
|
53
55
|
* @@map("authz_user_role")
|
|
54
56
|
* }
|
|
@@ -142,6 +144,13 @@ export interface PrismaAuthzStoreOptions {
|
|
|
142
144
|
* `setUserRoles(…, { source })` for a non-default source throw.
|
|
143
145
|
*/
|
|
144
146
|
roleSources?: boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Tenant-scoped role assignments. Requires a `tenantId String @default("")` column on the
|
|
149
|
+
* `UserRole` model, included in its `@@id` (`''` = a global assignment). Default `false`: the
|
|
150
|
+
* schema keeps working unchanged, every assignment is global, and a `tenantId` on a write
|
|
151
|
+
* throws.
|
|
152
|
+
*/
|
|
153
|
+
tenantScoped?: boolean;
|
|
145
154
|
}
|
|
146
155
|
/** DI token for optional {@link PrismaAuthzStoreOptions}. */
|
|
147
156
|
export declare const PRISMA_AUTHZ_STORE_OPTIONS: unique symbol;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-client.d.ts","sourceRoot":"","sources":["../src/prisma-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"prisma-client.d.ts","sourceRoot":"","sources":["../src/prisma-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAEH;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAElC,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1C,SAAS,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9C,QAAQ,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,UAAU,EAAE,mBAAmB,CAAC;IAChC,cAAc,EAAE,mBAAmB,CAAC;IACpC,QAAQ,EAAE,mBAAmB,CAAC;IAE9B;;;;;;;;;;;;OAYG;IAEH,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEnF;;;;OAIG;IAEH,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;AAED,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,6DAA6D;AAC7D,eAAO,MAAM,0BAA0B,eAA4D,CAAC;AAEpG;;;GAGG;AACH,eAAO,MAAM,aAAa,eAAqD,CAAC"}
|
package/dist/prisma-client.js
CHANGED
|
@@ -47,8 +47,10 @@
|
|
|
47
47
|
* roleId String
|
|
48
48
|
* // Only with `roleSources: true` (per-source assignments — see PrismaAuthzStore.setUserRoles):
|
|
49
49
|
* // source String @default("manual")
|
|
50
|
+
* // Only with `tenantScoped: true` (tenant-scoped assignments, '' = global):
|
|
51
|
+
* // tenantId String @default("")
|
|
50
52
|
*
|
|
51
|
-
* @@id([userType, userId, roleId]) //
|
|
53
|
+
* @@id([userType, userId, roleId]) // add `tenantId` and/or `source` to the @@id when enabled
|
|
52
54
|
* @@index([userType, userId])
|
|
53
55
|
* @@map("authz_user_role")
|
|
54
56
|
* }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-client.js","sourceRoot":"","sources":["../src/prisma-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"prisma-client.js","sourceRoot":"","sources":["../src/prisma-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAwEH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;AAEpG;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { type UserRef } from '@dudousxd/nestjs-authz/store-kit';
|
|
2
|
+
import type { ModuleRef } from '@nestjs/core';
|
|
3
|
+
/** A tenant as published by `@dudousxd/nestjs-context` (`Context.tenant()`). */
|
|
4
|
+
export interface TenantRef {
|
|
5
|
+
id: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
source: string;
|
|
8
|
+
slug?: string;
|
|
9
|
+
role?: string;
|
|
10
|
+
}
|
|
11
|
+
/** How the context says a lib must scope data right now (`Context.tenantFilter()`). */
|
|
12
|
+
export type TenantFilter = {
|
|
13
|
+
mode: 'system';
|
|
14
|
+
} | {
|
|
15
|
+
mode: 'all';
|
|
16
|
+
} | {
|
|
17
|
+
mode: 'tenantless';
|
|
18
|
+
} | {
|
|
19
|
+
mode: 'tenant';
|
|
20
|
+
tenant: TenantRef;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The RBAC module's `tenancy` option. `'inherit'` (default) follows `ContextModule`'s
|
|
24
|
+
* `tenancy.enabled`; `false` keeps this module out of tenancy.
|
|
25
|
+
*/
|
|
26
|
+
export type AuthzTenancyOption = 'inherit' | false | {
|
|
27
|
+
/** `'inherit'` (default) follows the context switch; a boolean overrides it. */
|
|
28
|
+
enabled?: 'inherit' | boolean;
|
|
29
|
+
/** Tenant kinds this module honours, instead of the context's `kinds`. */
|
|
30
|
+
kinds?: string[];
|
|
31
|
+
/**
|
|
32
|
+
* Accepted for the shared shape. It changes nothing here: a GLOBAL role assignment
|
|
33
|
+
* always applies, in every tenant.
|
|
34
|
+
*/
|
|
35
|
+
nullRows?: 'tenantless' | 'shared';
|
|
36
|
+
/**
|
|
37
|
+
* Map the caller's role inside the context tenant (`tenant.role`) to authz roles that
|
|
38
|
+
* apply in that tenant's scope only, e.g. `{ owner: 'org_admin', member: 'org_member' }`.
|
|
39
|
+
* Unmapped roles grant nothing.
|
|
40
|
+
*/
|
|
41
|
+
roles?: Record<string, string | readonly string[]>;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* An explicit tenant for a check, from the user being checked. Return a tenant id to scope the
|
|
45
|
+
* check to it, `null` for the global scope, or `undefined` to fall back to the context.
|
|
46
|
+
*/
|
|
47
|
+
export type TenantResolver = (user: unknown) => string | null | undefined;
|
|
48
|
+
/** The structural slice of nestjs-context's accessor this module reads. */
|
|
49
|
+
export interface TenantContextAccessor {
|
|
50
|
+
tenantId?(): string | undefined;
|
|
51
|
+
userRef?(): {
|
|
52
|
+
type?: string;
|
|
53
|
+
id: string | number;
|
|
54
|
+
} | undefined;
|
|
55
|
+
tenancy?(): {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
kinds?: string[];
|
|
58
|
+
};
|
|
59
|
+
tenantFilter?(options?: {
|
|
60
|
+
kinds?: string[];
|
|
61
|
+
}): TenantFilter;
|
|
62
|
+
}
|
|
63
|
+
/** The tenant scope of one check, plus the roles `tenancy.roles` adds in that scope. */
|
|
64
|
+
export interface RbacTenant {
|
|
65
|
+
scope: {
|
|
66
|
+
tenantId?: string;
|
|
67
|
+
};
|
|
68
|
+
roles: string[];
|
|
69
|
+
}
|
|
70
|
+
export interface ResolveRbacTenantInput {
|
|
71
|
+
/** The user as the Gate passed it. */
|
|
72
|
+
user: unknown;
|
|
73
|
+
/** The same user mapped to a store ref. */
|
|
74
|
+
ref: UserRef;
|
|
75
|
+
/** The module's explicit `tenant` resolver, if any. */
|
|
76
|
+
resolver?: TenantResolver | undefined;
|
|
77
|
+
/** The module's `tenancy` option. */
|
|
78
|
+
tenancy?: AuthzTenancyOption | undefined;
|
|
79
|
+
/** The context accessor found through DI, if any (else the global slot is read). */
|
|
80
|
+
accessor?: TenantContextAccessor | undefined;
|
|
81
|
+
/** With tenancy off, scope by the context's plain `tenantId()` (drizzle/typeorm behaviour). */
|
|
82
|
+
legacyContextTenant: boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Precedence: the explicit `tenant` resolver, then (tenancy on) the context tenant filter, then
|
|
86
|
+
* (tenancy off) the adapter's behaviour without tenancy. `tenant` mode scopes to that tenant;
|
|
87
|
+
* `tenantless`, `all` and `system` use the global scope.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveRbacTenant(input: ResolveRbacTenantInput): RbacTenant;
|
|
90
|
+
/** A provider's per-instance cache for {@link rbacTenant}'s accessor lookup. */
|
|
91
|
+
export interface TenantContextCache {
|
|
92
|
+
resolved: boolean;
|
|
93
|
+
value: TenantContextAccessor | undefined;
|
|
94
|
+
}
|
|
95
|
+
/** The tenant scope (and `tenancy.roles` roles) of one check for `user`. */
|
|
96
|
+
export declare function rbacTenant(options: {
|
|
97
|
+
tenant?: TenantResolver | undefined;
|
|
98
|
+
tenancy?: AuthzTenancyOption | undefined;
|
|
99
|
+
}, user: unknown, ref: UserRef, injected: TenantContextAccessor | undefined, moduleRef: ModuleRef | undefined, cache: TenantContextCache, legacyContextTenant: boolean): RbacTenant;
|
|
100
|
+
//# sourceMappingURL=tenancy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancy.d.ts","sourceRoot":"","sources":["../src/tenancy.ts"],"names":[],"mappings":"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"}
|
package/dist/tenancy.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Tenancy for the RBAC module: which tenant scope a permission/role check runs in, and which
|
|
2
|
+
// roles the caller's role inside the context tenant maps to. The same file ships in every
|
|
3
|
+
// store adapter. It reads the @dudousxd/nestjs-context tenancy contract STRUCTURALLY (no import),
|
|
4
|
+
// so it works with any context version, and with none: a missing or older context reads as
|
|
5
|
+
// tenancy off.
|
|
6
|
+
import { CONTEXT_ACCESSOR } from '@dudousxd/nestjs-authz';
|
|
7
|
+
import { normalizeUserRef } from '@dudousxd/nestjs-authz/store-kit';
|
|
8
|
+
const SLOT = Symbol.for('@dudousxd/nestjs-diagnostics:accessor');
|
|
9
|
+
/** Is tenancy on for this module? Call per check: the context can change between requests. */
|
|
10
|
+
function readTenancy(option, a) {
|
|
11
|
+
if (option === false)
|
|
12
|
+
return { enabled: false };
|
|
13
|
+
if (typeof a?.tenancy !== 'function' || typeof a.tenantFilter !== 'function') {
|
|
14
|
+
return { enabled: false };
|
|
15
|
+
}
|
|
16
|
+
const own = typeof option === 'object' ? option : {};
|
|
17
|
+
const inherit = own.enabled === undefined || own.enabled === 'inherit';
|
|
18
|
+
if (!(inherit ? a.tenancy().enabled : own.enabled))
|
|
19
|
+
return { enabled: false };
|
|
20
|
+
const kinds = own.kinds;
|
|
21
|
+
const tenantFilter = a.tenantFilter.bind(a);
|
|
22
|
+
return { enabled: true, filter: () => tenantFilter(kinds ? { kinds } : undefined) };
|
|
23
|
+
}
|
|
24
|
+
/** The accessor found through DI, else the global slot `ContextModule` publishes. */
|
|
25
|
+
function effectiveAccessor(injected) {
|
|
26
|
+
if (injected)
|
|
27
|
+
return injected;
|
|
28
|
+
const slot = globalThis[SLOT];
|
|
29
|
+
const current = slot?.current;
|
|
30
|
+
return current && typeof current === 'object' ? current : undefined;
|
|
31
|
+
}
|
|
32
|
+
/** Today's behaviour without tenancy: the context's plain `tenantId()`, read defensively. */
|
|
33
|
+
function legacyTenantId(accessor) {
|
|
34
|
+
if (!accessor || typeof accessor.tenantId !== 'function')
|
|
35
|
+
return undefined;
|
|
36
|
+
try {
|
|
37
|
+
return accessor.tenantId() ?? undefined;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Is `ref` the context's current user? Tenant roles belong to the caller, nobody else. */
|
|
44
|
+
function isContextUser(ref, accessor) {
|
|
45
|
+
let current;
|
|
46
|
+
try {
|
|
47
|
+
current = accessor?.userRef?.();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
current = undefined;
|
|
51
|
+
}
|
|
52
|
+
if (!current || current.id === undefined || current.id === null)
|
|
53
|
+
return false;
|
|
54
|
+
const a = normalizeUserRef(ref);
|
|
55
|
+
const b = normalizeUserRef(current);
|
|
56
|
+
return a.type === b.type && a.id === b.id;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Precedence: the explicit `tenant` resolver, then (tenancy on) the context tenant filter, then
|
|
60
|
+
* (tenancy off) the adapter's behaviour without tenancy. `tenant` mode scopes to that tenant;
|
|
61
|
+
* `tenantless`, `all` and `system` use the global scope.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveRbacTenant(input) {
|
|
64
|
+
const explicit = input.resolver ? input.resolver(input.user) : undefined;
|
|
65
|
+
const accessor = effectiveAccessor(input.accessor);
|
|
66
|
+
const tenancy = readTenancy(input.tenancy, accessor);
|
|
67
|
+
const filter = tenancy.enabled ? tenancy.filter() : undefined;
|
|
68
|
+
let scope;
|
|
69
|
+
if (explicit !== undefined) {
|
|
70
|
+
scope = explicit === null ? {} : { tenantId: explicit };
|
|
71
|
+
}
|
|
72
|
+
else if (filter) {
|
|
73
|
+
scope = filter.mode === 'tenant' ? { tenantId: filter.tenant.id } : {};
|
|
74
|
+
}
|
|
75
|
+
else if (input.legacyContextTenant) {
|
|
76
|
+
const id = legacyTenantId(input.accessor);
|
|
77
|
+
scope = id === undefined ? {} : { tenantId: id };
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
scope = {};
|
|
81
|
+
}
|
|
82
|
+
const map = typeof input.tenancy === 'object' ? input.tenancy.roles : undefined;
|
|
83
|
+
let roles = [];
|
|
84
|
+
if (map &&
|
|
85
|
+
filter?.mode === 'tenant' &&
|
|
86
|
+
filter.tenant.role !== undefined &&
|
|
87
|
+
scope.tenantId === filter.tenant.id &&
|
|
88
|
+
Object.prototype.hasOwnProperty.call(map, filter.tenant.role) &&
|
|
89
|
+
isContextUser(input.ref, accessor)) {
|
|
90
|
+
const mapped = map[filter.tenant.role];
|
|
91
|
+
roles = typeof mapped === 'string' ? [mapped] : [...(mapped ?? [])];
|
|
92
|
+
}
|
|
93
|
+
return { scope, roles };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Locate the context accessor. Prefers a value injected into the module; falls back to a
|
|
97
|
+
* non-strict {@link ModuleRef} lookup so an accessor provided by ANY module (the app root, a
|
|
98
|
+
* global ContextModule) is still found: the RBAC module is global and its providers don't import
|
|
99
|
+
* the app's modules, so a plain `@Inject` would miss a root-provided accessor.
|
|
100
|
+
*/
|
|
101
|
+
function resolveTenantContext(injected, moduleRef, cache) {
|
|
102
|
+
if (injected)
|
|
103
|
+
return injected;
|
|
104
|
+
if (cache.resolved)
|
|
105
|
+
return cache.value;
|
|
106
|
+
cache.resolved = true;
|
|
107
|
+
if (moduleRef) {
|
|
108
|
+
try {
|
|
109
|
+
cache.value = moduleRef.get(CONTEXT_ACCESSOR, { strict: false });
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
cache.value = undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return cache.value;
|
|
116
|
+
}
|
|
117
|
+
/** The tenant scope (and `tenancy.roles` roles) of one check for `user`. */
|
|
118
|
+
export function rbacTenant(options, user, ref, injected, moduleRef, cache, legacyContextTenant) {
|
|
119
|
+
return resolveRbacTenant({
|
|
120
|
+
user,
|
|
121
|
+
ref,
|
|
122
|
+
resolver: options.tenant,
|
|
123
|
+
tenancy: options.tenancy,
|
|
124
|
+
accessor: resolveTenantContext(injected, moduleRef, cache),
|
|
125
|
+
legacyContextTenant,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=tenancy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancy.js","sourceRoot":"","sources":["../src/tenancy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dudousxd/nestjs-authz-prisma",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Prisma RBAC persistence for @dudousxd/nestjs-authz — roles, permissions, and a Gate seam (zero connection ownership, structural client).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"reflect-metadata": ">=0.1.13"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
+
"@electric-sql/pglite": "0.4.6",
|
|
48
49
|
"@nestjs/authorization": "0.1.3",
|
|
49
50
|
"@nestjs/common": "12.0.1",
|
|
50
51
|
"@nestjs/core": "12.0.1",
|