@carlonicora/nestjs-neo4jsonapi 1.113.0 → 1.114.0
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/dist/common/guards/index.d.ts +1 -0
- package/dist/common/guards/index.d.ts.map +1 -1
- package/dist/common/guards/index.js +1 -0
- package/dist/common/guards/index.js.map +1 -1
- package/dist/common/guards/jwt.auth.any-scope.guard.d.ts +20 -0
- package/dist/common/guards/jwt.auth.any-scope.guard.d.ts.map +1 -0
- package/dist/common/guards/jwt.auth.any-scope.guard.js +61 -0
- package/dist/common/guards/jwt.auth.any-scope.guard.js.map +1 -0
- package/dist/core/security/services/security.service.d.ts +5 -0
- package/dist/core/security/services/security.service.d.ts.map +1 -1
- package/dist/core/security/services/security.service.js +13 -0
- package/dist/core/security/services/security.service.js.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.d.ts +2 -0
- package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.js +29 -0
- package/dist/foundations/auth/controllers/auth.controller.js.map +1 -1
- package/dist/foundations/auth/entities/auth.entity.d.ts +10 -0
- package/dist/foundations/auth/entities/auth.entity.d.ts.map +1 -1
- package/dist/foundations/auth/repositories/auth.repository.d.ts +28 -0
- package/dist/foundations/auth/repositories/auth.repository.d.ts.map +1 -1
- package/dist/foundations/auth/repositories/auth.repository.js +92 -12
- package/dist/foundations/auth/repositories/auth.repository.js.map +1 -1
- package/dist/foundations/auth/serialisers/auth.serialiser.d.ts.map +1 -1
- package/dist/foundations/auth/serialisers/auth.serialiser.js +4 -0
- package/dist/foundations/auth/serialisers/auth.serialiser.js.map +1 -1
- package/dist/foundations/auth/services/auth.service.d.ts +12 -0
- package/dist/foundations/auth/services/auth.service.d.ts.map +1 -1
- package/dist/foundations/auth/services/auth.service.js +55 -0
- package/dist/foundations/auth/services/auth.service.js.map +1 -1
- package/dist/foundations/company/repositories/company.repository.d.ts.map +1 -1
- package/dist/foundations/company/repositories/company.repository.js +7 -34
- package/dist/foundations/company/repositories/company.repository.js.map +1 -1
- package/dist/foundations/discord-user/repositories/discord-user.repository.d.ts.map +1 -1
- package/dist/foundations/discord-user/repositories/discord-user.repository.js +6 -1
- package/dist/foundations/discord-user/repositories/discord-user.repository.js.map +1 -1
- package/dist/foundations/foundations.modules.d.ts.map +1 -1
- package/dist/foundations/foundations.modules.js +2 -0
- package/dist/foundations/foundations.modules.js.map +1 -1
- package/dist/foundations/google-user/repositories/google-user.repository.d.ts.map +1 -1
- package/dist/foundations/google-user/repositories/google-user.repository.js +6 -1
- package/dist/foundations/google-user/repositories/google-user.repository.js.map +1 -1
- package/dist/foundations/index.d.ts +1 -0
- package/dist/foundations/index.d.ts.map +1 -1
- package/dist/foundations/index.js +1 -0
- package/dist/foundations/index.js.map +1 -1
- package/dist/foundations/membership/entities/membership.d.ts +34 -0
- package/dist/foundations/membership/entities/membership.d.ts.map +1 -0
- package/dist/foundations/membership/entities/membership.js +24 -0
- package/dist/foundations/membership/entities/membership.js.map +1 -0
- package/dist/foundations/membership/entities/membership.meta.d.ts +3 -0
- package/dist/foundations/membership/entities/membership.meta.d.ts.map +1 -0
- package/dist/foundations/membership/entities/membership.meta.js +10 -0
- package/dist/foundations/membership/entities/membership.meta.js.map +1 -0
- package/dist/foundations/membership/index.d.ts +6 -0
- package/dist/foundations/membership/index.d.ts.map +1 -0
- package/dist/foundations/membership/index.js +17 -0
- package/dist/foundations/membership/index.js.map +1 -0
- package/dist/foundations/membership/membership.module.d.ts +9 -0
- package/dist/foundations/membership/membership.module.d.ts.map +1 -0
- package/dist/foundations/membership/membership.module.js +32 -0
- package/dist/foundations/membership/membership.module.js.map +1 -0
- package/dist/foundations/membership/queries/membership.query.d.ts +60 -0
- package/dist/foundations/membership/queries/membership.query.d.ts.map +1 -0
- package/dist/foundations/membership/queries/membership.query.js +86 -0
- package/dist/foundations/membership/queries/membership.query.js.map +1 -0
- package/dist/foundations/membership/repositories/membership.repository.d.ts +8 -0
- package/dist/foundations/membership/repositories/membership.repository.d.ts.map +1 -0
- package/dist/foundations/membership/repositories/membership.repository.js +30 -0
- package/dist/foundations/membership/repositories/membership.repository.js.map +1 -0
- package/dist/foundations/module/queries/feature.module.query.d.ts +2 -2
- package/dist/foundations/module/queries/feature.module.query.d.ts.map +1 -1
- package/dist/foundations/module/queries/feature.module.query.js +11 -3
- package/dist/foundations/module/queries/feature.module.query.js.map +1 -1
- package/dist/foundations/role/repositories/role.repository.d.ts.map +1 -1
- package/dist/foundations/role/repositories/role.repository.js +15 -4
- package/dist/foundations/role/repositories/role.repository.js.map +1 -1
- package/dist/foundations/user/entities/user.d.ts.map +1 -1
- package/dist/foundations/user/entities/user.js +6 -1
- package/dist/foundations/user/entities/user.js.map +1 -1
- package/dist/foundations/user/repositories/user.repository.d.ts +1 -0
- package/dist/foundations/user/repositories/user.repository.d.ts.map +1 -1
- package/dist/foundations/user/repositories/user.repository.js +105 -58
- package/dist/foundations/user/repositories/user.repository.js.map +1 -1
- package/dist/foundations/user/services/user.service.d.ts +8 -0
- package/dist/foundations/user/services/user.service.d.ts.map +1 -1
- package/dist/foundations/user/services/user.service.js +20 -4
- package/dist/foundations/user/services/user.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.meta.d.ts","sourceRoot":"","sources":["../../../../src/foundations/membership/entities/membership.meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAE1E,eAAO,MAAM,cAAc,EAAE,QAK5B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.membershipMeta = void 0;
|
|
4
|
+
exports.membershipMeta = {
|
|
5
|
+
type: "memberships",
|
|
6
|
+
endpoint: "memberships",
|
|
7
|
+
nodeName: "membership",
|
|
8
|
+
labelName: "Membership",
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=membership.meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.meta.js","sourceRoot":"","sources":["../../../../src/foundations/membership/entities/membership.meta.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAa;IACtC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,YAAY;CACxB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Membership, MembershipDescriptor, MembershipDescriptorType } from "./entities/membership";
|
|
2
|
+
export { membershipMeta } from "./entities/membership.meta";
|
|
3
|
+
export { membershipRoleMatch, membershipRoleMatchRequired, grantCompanyRoles, grantPlatformRole, } from "./queries/membership.query";
|
|
4
|
+
export { MembershipRepository } from "./repositories/membership.repository";
|
|
5
|
+
export { MembershipModule } from "./membership.module";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/foundations/membership/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MembershipModule = exports.MembershipRepository = exports.grantPlatformRole = exports.grantCompanyRoles = exports.membershipRoleMatchRequired = exports.membershipRoleMatch = exports.membershipMeta = exports.MembershipDescriptor = void 0;
|
|
4
|
+
var membership_1 = require("./entities/membership");
|
|
5
|
+
Object.defineProperty(exports, "MembershipDescriptor", { enumerable: true, get: function () { return membership_1.MembershipDescriptor; } });
|
|
6
|
+
var membership_meta_1 = require("./entities/membership.meta");
|
|
7
|
+
Object.defineProperty(exports, "membershipMeta", { enumerable: true, get: function () { return membership_meta_1.membershipMeta; } });
|
|
8
|
+
var membership_query_1 = require("./queries/membership.query");
|
|
9
|
+
Object.defineProperty(exports, "membershipRoleMatch", { enumerable: true, get: function () { return membership_query_1.membershipRoleMatch; } });
|
|
10
|
+
Object.defineProperty(exports, "membershipRoleMatchRequired", { enumerable: true, get: function () { return membership_query_1.membershipRoleMatchRequired; } });
|
|
11
|
+
Object.defineProperty(exports, "grantCompanyRoles", { enumerable: true, get: function () { return membership_query_1.grantCompanyRoles; } });
|
|
12
|
+
Object.defineProperty(exports, "grantPlatformRole", { enumerable: true, get: function () { return membership_query_1.grantPlatformRole; } });
|
|
13
|
+
var membership_repository_1 = require("./repositories/membership.repository");
|
|
14
|
+
Object.defineProperty(exports, "MembershipRepository", { enumerable: true, get: function () { return membership_repository_1.MembershipRepository; } });
|
|
15
|
+
var membership_module_1 = require("./membership.module");
|
|
16
|
+
Object.defineProperty(exports, "MembershipModule", { enumerable: true, get: function () { return membership_module_1.MembershipModule; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/foundations/membership/index.ts"],"names":[],"mappings":";;;AAAA,oDAAmG;AAA9E,kHAAA,oBAAoB,OAAA;AACzC,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AACvB,+DAKoC;AAJlC,uHAAA,mBAAmB,OAAA;AACnB,+HAAA,2BAA2B,OAAA;AAC3B,qHAAA,iBAAiB,OAAA;AACjB,qHAAA,iBAAiB,OAAA;AAEnB,8EAA4E;AAAnE,6HAAA,oBAAoB,OAAA;AAC7B,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { OnModuleInit } from "@nestjs/common";
|
|
2
|
+
/**
|
|
3
|
+
* Membership is backend-internal: no controller, no endpoint.
|
|
4
|
+
* The repository exists only to bootstrap the uniqueness constraint.
|
|
5
|
+
*/
|
|
6
|
+
export declare class MembershipModule implements OnModuleInit {
|
|
7
|
+
onModuleInit(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=membership.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.module.d.ts","sourceRoot":"","sources":["../../../src/foundations/membership/membership.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMtD;;;GAGG;AACH,qBAMa,gBAAiB,YAAW,YAAY;IACnD,YAAY;CAGb"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MembershipModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const registry_1 = require("../../common/registries/registry");
|
|
12
|
+
const membership_1 = require("./entities/membership");
|
|
13
|
+
const membership_repository_1 = require("./repositories/membership.repository");
|
|
14
|
+
/**
|
|
15
|
+
* Membership is backend-internal: no controller, no endpoint.
|
|
16
|
+
* The repository exists only to bootstrap the uniqueness constraint.
|
|
17
|
+
*/
|
|
18
|
+
let MembershipModule = class MembershipModule {
|
|
19
|
+
onModuleInit() {
|
|
20
|
+
registry_1.modelRegistry.register(membership_1.MembershipDescriptor.model);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
exports.MembershipModule = MembershipModule;
|
|
24
|
+
exports.MembershipModule = MembershipModule = __decorate([
|
|
25
|
+
(0, common_1.Module)({
|
|
26
|
+
controllers: [],
|
|
27
|
+
providers: [membership_repository_1.MembershipRepository, membership_1.MembershipDescriptor.model.serialiser],
|
|
28
|
+
exports: [membership_repository_1.MembershipRepository],
|
|
29
|
+
imports: [],
|
|
30
|
+
})
|
|
31
|
+
], MembershipModule);
|
|
32
|
+
//# sourceMappingURL=membership.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.module.js","sourceRoot":"","sources":["../../../src/foundations/membership/membership.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAsD;AAEtD,+DAAiE;AACjE,sDAA6D;AAC7D,gFAA4E;AAE5E;;;GAGG;AAOI,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAAY;QACV,wBAAa,CAAC,QAAQ,CAAC,iCAAoB,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AAJY,4CAAgB;2BAAhB,gBAAgB;IAN5B,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,CAAC,4CAAoB,EAAE,iCAAoB,CAAC,KAAK,CAAC,UAAU,CAAC;QACxE,OAAO,EAAE,CAAC,4CAAoB,CAAC;QAC/B,OAAO,EAAE,EAAE;KACZ,CAAC;GACW,gBAAgB,CAI5B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Cypher fragments for company-scoped role membership.
|
|
3
|
+
*
|
|
4
|
+
* These helpers are THE only sanctioned way to read/write role membership:
|
|
5
|
+
* (user)-[:HAS_MEMBERSHIP]->(:Membership)-[:IN_COMPANY]->(company)
|
|
6
|
+
* (membership)-[:HAS_ROLE]->(role)
|
|
7
|
+
*
|
|
8
|
+
* Rules for use:
|
|
9
|
+
* - `$companyId` is auto-injected from CLS by `Neo4jService.initQuery()`. Queries
|
|
10
|
+
* that must scope to an EXPLICIT company (login, switch, migration) set
|
|
11
|
+
* `query.queryParams.companyId` after `initQuery()`.
|
|
12
|
+
* - `$membershipId` is always `randomUUID()` generated in TypeScript and passed as
|
|
13
|
+
* a param — never `randomUUID()` in Cypher (keeps writes deterministic/testable).
|
|
14
|
+
* - `Membership.createdAt`/`updatedAt` are always written with `datetime()` in
|
|
15
|
+
* Cypher, never as a string param.
|
|
16
|
+
* - Invariant: every code path that deletes a `BELONGS_TO` edge, deletes a user, or
|
|
17
|
+
* deletes a company MUST also `DETACH DELETE` the corresponding (user, company)
|
|
18
|
+
* Membership node(s). An orphaned membership whose company vanished would read as
|
|
19
|
+
* a PLATFORM membership — a privilege escalation.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Effective-role read: roles of `userAlias` in the company bound to $companyId,
|
|
23
|
+
* PLUS platform-level roles (membership with no IN_COMPANY edge).
|
|
24
|
+
* Emits OPTIONAL MATCH lines; `roleAlias` is the Role node alias the caller's
|
|
25
|
+
* RETURN statement expects (e.g. "user_role", "auth_user_role").
|
|
26
|
+
*/
|
|
27
|
+
export declare const membershipRoleMatch: (params: {
|
|
28
|
+
userAlias: string;
|
|
29
|
+
roleAlias: string;
|
|
30
|
+
}) => string;
|
|
31
|
+
/**
|
|
32
|
+
* Required variant (MATCH, not OPTIONAL MATCH) for queries that filter BY role,
|
|
33
|
+
* with the role id bound to $roleParamName (default $roleId).
|
|
34
|
+
*/
|
|
35
|
+
export declare const membershipRoleMatchRequired: (params: {
|
|
36
|
+
userAlias: string;
|
|
37
|
+
roleAlias: string;
|
|
38
|
+
roleParamName?: string;
|
|
39
|
+
}) => string;
|
|
40
|
+
/**
|
|
41
|
+
* Write: ensure the (user, company) membership exists and grant roles.
|
|
42
|
+
* Expects $membershipId (fresh uuid) and $roleIds (string[]) params;
|
|
43
|
+
* `userAlias` and `companyAlias` must already be bound.
|
|
44
|
+
*
|
|
45
|
+
* The OPTIONAL MATCH + FOREACH shape deliberately avoids
|
|
46
|
+
* `MERGE (ms)-[:HAS_ROLE]->(:Role {id: roleId})`, which would CREATE a phantom
|
|
47
|
+
* Role node when the id does not exist (FOREACH cannot contain MATCH).
|
|
48
|
+
*/
|
|
49
|
+
export declare const grantCompanyRoles: (params: {
|
|
50
|
+
userAlias: string;
|
|
51
|
+
companyAlias: string;
|
|
52
|
+
}) => string;
|
|
53
|
+
/**
|
|
54
|
+
* Write: ensure the user's PLATFORM membership (no IN_COMPANY) exists and grant
|
|
55
|
+
* the role bound to $roleId. Expects $membershipId. `userAlias` must be bound.
|
|
56
|
+
*/
|
|
57
|
+
export declare const grantPlatformRole: (params: {
|
|
58
|
+
userAlias: string;
|
|
59
|
+
}) => string;
|
|
60
|
+
//# sourceMappingURL=membership.query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.query.d.ts","sourceRoot":"","sources":["../../../../src/foundations/membership/queries/membership.query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAAG,MAKtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,KAAG,MAKH,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,KAAG,MAUvF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,KAAG,MAWjE,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Canonical Cypher fragments for company-scoped role membership.
|
|
4
|
+
*
|
|
5
|
+
* These helpers are THE only sanctioned way to read/write role membership:
|
|
6
|
+
* (user)-[:HAS_MEMBERSHIP]->(:Membership)-[:IN_COMPANY]->(company)
|
|
7
|
+
* (membership)-[:HAS_ROLE]->(role)
|
|
8
|
+
*
|
|
9
|
+
* Rules for use:
|
|
10
|
+
* - `$companyId` is auto-injected from CLS by `Neo4jService.initQuery()`. Queries
|
|
11
|
+
* that must scope to an EXPLICIT company (login, switch, migration) set
|
|
12
|
+
* `query.queryParams.companyId` after `initQuery()`.
|
|
13
|
+
* - `$membershipId` is always `randomUUID()` generated in TypeScript and passed as
|
|
14
|
+
* a param — never `randomUUID()` in Cypher (keeps writes deterministic/testable).
|
|
15
|
+
* - `Membership.createdAt`/`updatedAt` are always written with `datetime()` in
|
|
16
|
+
* Cypher, never as a string param.
|
|
17
|
+
* - Invariant: every code path that deletes a `BELONGS_TO` edge, deletes a user, or
|
|
18
|
+
* deletes a company MUST also `DETACH DELETE` the corresponding (user, company)
|
|
19
|
+
* Membership node(s). An orphaned membership whose company vanished would read as
|
|
20
|
+
* a PLATFORM membership — a privilege escalation.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.grantPlatformRole = exports.grantCompanyRoles = exports.membershipRoleMatchRequired = exports.membershipRoleMatch = void 0;
|
|
24
|
+
/**
|
|
25
|
+
* Effective-role read: roles of `userAlias` in the company bound to $companyId,
|
|
26
|
+
* PLUS platform-level roles (membership with no IN_COMPANY edge).
|
|
27
|
+
* Emits OPTIONAL MATCH lines; `roleAlias` is the Role node alias the caller's
|
|
28
|
+
* RETURN statement expects (e.g. "user_role", "auth_user_role").
|
|
29
|
+
*/
|
|
30
|
+
const membershipRoleMatch = (params) => `
|
|
31
|
+
OPTIONAL MATCH (${params.userAlias})-[:HAS_MEMBERSHIP]->(${params.roleAlias}_ms:Membership)
|
|
32
|
+
WHERE (${params.roleAlias}_ms)-[:IN_COMPANY]->(:Company {id: $companyId})
|
|
33
|
+
OR NOT (${params.roleAlias}_ms)-[:IN_COMPANY]->(:Company)
|
|
34
|
+
OPTIONAL MATCH (${params.roleAlias}_ms)-[:HAS_ROLE]->(${params.roleAlias}:Role)
|
|
35
|
+
`;
|
|
36
|
+
exports.membershipRoleMatch = membershipRoleMatch;
|
|
37
|
+
/**
|
|
38
|
+
* Required variant (MATCH, not OPTIONAL MATCH) for queries that filter BY role,
|
|
39
|
+
* with the role id bound to $roleParamName (default $roleId).
|
|
40
|
+
*/
|
|
41
|
+
const membershipRoleMatchRequired = (params) => `
|
|
42
|
+
MATCH (${params.userAlias})-[:HAS_MEMBERSHIP]->(${params.roleAlias}_ms:Membership)
|
|
43
|
+
WHERE (${params.roleAlias}_ms)-[:IN_COMPANY]->(:Company {id: $companyId})
|
|
44
|
+
OR NOT (${params.roleAlias}_ms)-[:IN_COMPANY]->(:Company)
|
|
45
|
+
MATCH (${params.roleAlias}_ms)-[:HAS_ROLE]->(${params.roleAlias}:Role {id: $${params.roleParamName ?? "roleId"}})
|
|
46
|
+
`;
|
|
47
|
+
exports.membershipRoleMatchRequired = membershipRoleMatchRequired;
|
|
48
|
+
/**
|
|
49
|
+
* Write: ensure the (user, company) membership exists and grant roles.
|
|
50
|
+
* Expects $membershipId (fresh uuid) and $roleIds (string[]) params;
|
|
51
|
+
* `userAlias` and `companyAlias` must already be bound.
|
|
52
|
+
*
|
|
53
|
+
* The OPTIONAL MATCH + FOREACH shape deliberately avoids
|
|
54
|
+
* `MERGE (ms)-[:HAS_ROLE]->(:Role {id: roleId})`, which would CREATE a phantom
|
|
55
|
+
* Role node when the id does not exist (FOREACH cannot contain MATCH).
|
|
56
|
+
*/
|
|
57
|
+
const grantCompanyRoles = (params) => `
|
|
58
|
+
MERGE (${params.userAlias})-[:HAS_MEMBERSHIP]->(ms:Membership)-[:IN_COMPANY]->(${params.companyAlias})
|
|
59
|
+
ON CREATE SET ms.id = $membershipId, ms.createdAt = datetime(), ms.updatedAt = datetime()
|
|
60
|
+
SET ms.updatedAt = datetime()
|
|
61
|
+
WITH ms
|
|
62
|
+
UNWIND CASE WHEN size($roleIds) = 0 THEN [null] ELSE $roleIds END AS roleId
|
|
63
|
+
OPTIONAL MATCH (grant_role:Role {id: roleId})
|
|
64
|
+
FOREACH (_ IN CASE WHEN grant_role IS NULL THEN [] ELSE [1] END |
|
|
65
|
+
MERGE (ms)-[:HAS_ROLE]->(grant_role)
|
|
66
|
+
)
|
|
67
|
+
`;
|
|
68
|
+
exports.grantCompanyRoles = grantCompanyRoles;
|
|
69
|
+
/**
|
|
70
|
+
* Write: ensure the user's PLATFORM membership (no IN_COMPANY) exists and grant
|
|
71
|
+
* the role bound to $roleId. Expects $membershipId. `userAlias` must be bound.
|
|
72
|
+
*/
|
|
73
|
+
const grantPlatformRole = (params) => `
|
|
74
|
+
OPTIONAL MATCH (${params.userAlias})-[:HAS_MEMBERSHIP]->(existing_ms:Membership)
|
|
75
|
+
WHERE NOT (existing_ms)-[:IN_COMPANY]->(:Company)
|
|
76
|
+
FOREACH (_ IN CASE WHEN existing_ms IS NULL THEN [1] ELSE [] END |
|
|
77
|
+
CREATE (${params.userAlias})-[:HAS_MEMBERSHIP]->(:Membership {id: $membershipId, createdAt: datetime(), updatedAt: datetime()})
|
|
78
|
+
)
|
|
79
|
+
WITH ${params.userAlias}
|
|
80
|
+
MATCH (${params.userAlias})-[:HAS_MEMBERSHIP]->(platform_ms:Membership)
|
|
81
|
+
WHERE NOT (platform_ms)-[:IN_COMPANY]->(:Company)
|
|
82
|
+
MATCH (platform_role:Role {id: $roleId})
|
|
83
|
+
MERGE (platform_ms)-[:HAS_ROLE]->(platform_role)
|
|
84
|
+
`;
|
|
85
|
+
exports.grantPlatformRole = grantPlatformRole;
|
|
86
|
+
//# sourceMappingURL=membership.query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.query.js","sourceRoot":"","sources":["../../../../src/foundations/membership/queries/membership.query.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH;;;;;GAKG;AACI,MAAM,mBAAmB,GAAG,CAAC,MAAgD,EAAU,EAAE,CAAC;oBAC7E,MAAM,CAAC,SAAS,yBAAyB,MAAM,CAAC,SAAS;WAClE,MAAM,CAAC,SAAS;eACZ,MAAM,CAAC,SAAS;oBACX,MAAM,CAAC,SAAS,sBAAsB,MAAM,CAAC,SAAS;CACzE,CAAC;AALW,QAAA,mBAAmB,uBAK9B;AAEF;;;GAGG;AACI,MAAM,2BAA2B,GAAG,CAAC,MAI3C,EAAU,EAAE,CAAC;WACH,MAAM,CAAC,SAAS,yBAAyB,MAAM,CAAC,SAAS;WACzD,MAAM,CAAC,SAAS;eACZ,MAAM,CAAC,SAAS;WACpB,MAAM,CAAC,SAAS,sBAAsB,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,aAAa,IAAI,QAAQ;CAC/G,CAAC;AATW,QAAA,2BAA2B,+BAStC;AAEF;;;;;;;;GAQG;AACI,MAAM,iBAAiB,GAAG,CAAC,MAAmD,EAAU,EAAE,CAAC;WACvF,MAAM,CAAC,SAAS,wDAAwD,MAAM,CAAC,YAAY;;;;;;;;;CASrG,CAAC;AAVW,QAAA,iBAAiB,qBAU5B;AAEF;;;GAGG;AACI,MAAM,iBAAiB,GAAG,CAAC,MAA6B,EAAU,EAAE,CAAC;oBACxD,MAAM,CAAC,SAAS;;;cAGtB,MAAM,CAAC,SAAS;;SAErB,MAAM,CAAC,SAAS;WACd,MAAM,CAAC,SAAS;;;;CAI1B,CAAC;AAXW,QAAA,iBAAiB,qBAW5B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { OnModuleInit } from "@nestjs/common";
|
|
2
|
+
import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
|
|
3
|
+
export declare class MembershipRepository implements OnModuleInit {
|
|
4
|
+
private readonly neo4j;
|
|
5
|
+
constructor(neo4j: Neo4jService);
|
|
6
|
+
onModuleInit(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=membership.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/membership/repositories/membership.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAE1E,qBACa,oBAAqB,YAAW,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAE1C,YAAY;CAKnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MembershipRepository = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
|
|
15
|
+
let MembershipRepository = class MembershipRepository {
|
|
16
|
+
constructor(neo4j) {
|
|
17
|
+
this.neo4j = neo4j;
|
|
18
|
+
}
|
|
19
|
+
async onModuleInit() {
|
|
20
|
+
await this.neo4j.writeOne({
|
|
21
|
+
query: `CREATE CONSTRAINT membership_id IF NOT EXISTS FOR (membership:Membership) REQUIRE membership.id IS UNIQUE`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
exports.MembershipRepository = MembershipRepository;
|
|
26
|
+
exports.MembershipRepository = MembershipRepository = __decorate([
|
|
27
|
+
(0, common_1.Injectable)(),
|
|
28
|
+
__metadata("design:paramtypes", [neo4j_service_1.Neo4jService])
|
|
29
|
+
], MembershipRepository);
|
|
30
|
+
//# sourceMappingURL=membership.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.repository.js","sourceRoot":"","sources":["../../../../src/foundations/membership/repositories/membership.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0D;AAC1D,8EAA0E;AAGnE,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxB,KAAK,EAAE,2GAA2G;SACnH,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AARY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAEyB,4BAAY;GADrC,oBAAoB,CAQhC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare const modulePermissionResolutionQuery = "\n WITH m,\n coalesce(apoc.convert.fromJsonList(m.permissions), []) AS defaultPermissions,\n collect(perm) AS perms\n WITH m, defaultPermissions,\n apoc.coll.flatten([p IN perms | coalesce(apoc.convert.fromJsonList(p.permissions), [])]) AS rolePerms\n WITH m,\n head([x IN defaultPermissions WHERE x.type = 'create' | x.value]) AS defaultCreate,\n head([x IN defaultPermissions WHERE x.type = 'read' | x.value]) AS defaultRead,\n head([x IN defaultPermissions WHERE x.type = 'update' | x.value]) AS defaultUpdate,\n head([x IN defaultPermissions WHERE x.type = 'delete' | x.value]) AS defaultDelete,\n rolePerms\n WITH m,\n [defaultCreate] + [x IN rolePerms WHERE x.type = 'create' | x.value] AS createValues,\n [defaultRead] + [x IN rolePerms WHERE x.type = 'read' | x.value] AS readValues,\n [defaultUpdate] + [x IN rolePerms WHERE x.type = 'update' | x.value] AS updateValues,\n [defaultDelete] + [x IN rolePerms WHERE x.type = 'delete' | x.value] AS deleteValues\n WITH m,\n CASE\n WHEN any(x IN createValues WHERE x = true) THEN true\n WHEN any(x IN createValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN createValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(createValues), false)\n END AS effectiveCreate,\n CASE\n WHEN any(x IN readValues WHERE x = true) THEN true\n WHEN any(x IN readValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN readValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(readValues), false)\n END AS effectiveRead,\n CASE\n WHEN any(x IN updateValues WHERE x = true) THEN true\n WHEN any(x IN updateValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN updateValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(updateValues), false)\n END AS effectiveUpdate,\n CASE\n WHEN any(x IN deleteValues WHERE x = true) THEN true\n WHEN any(x IN deleteValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN deleteValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(deleteValues), false)\n END AS effectiveDelete\n WITH m, apoc.convert.toJson([\n { type: \"create\", value: effectiveCreate },\n { type: \"read\", value: effectiveRead },\n { type: \"update\", value: effectiveUpdate },\n { type: \"delete\", value: effectiveDelete }\n ]) AS newPermissions\n CALL apoc.create.vNode(\n labels(m),\n apoc.map.merge(properties(m), { permissions: newPermissions })\n ) YIELD node AS module\n\n RETURN module\n";
|
|
2
|
-
export declare const featureModuleQuery = "\n OPTIONAL MATCH (user)-[:
|
|
3
|
-
export declare const adminModuleQuery = "\n MATCH (user:User {id: $searchValue})-[:
|
|
2
|
+
export declare const featureModuleQuery = "\n OPTIONAL MATCH (user)-[:HAS_MEMBERSHIP]->(fm_ms:Membership)\n WHERE (fm_ms)-[:IN_COMPANY]->(company) OR NOT (fm_ms)-[:IN_COMPANY]->(:Company)\n OPTIONAL MATCH (fm_ms)-[:HAS_ROLE]->(role:Role)\n OPTIONAL MATCH (feature:Feature)\n WHERE exists((company)-[:HAS_FEATURE]->(feature))\n OR feature.isCore = true\n MATCH (m:Module)-[:IN_FEATURE]->(feature)\n OPTIONAL MATCH (role)-[perm:HAS_PERMISSIONS]->(m)\n \n WITH m,\n coalesce(apoc.convert.fromJsonList(m.permissions), []) AS defaultPermissions,\n collect(perm) AS perms\n WITH m, defaultPermissions,\n apoc.coll.flatten([p IN perms | coalesce(apoc.convert.fromJsonList(p.permissions), [])]) AS rolePerms\n WITH m,\n head([x IN defaultPermissions WHERE x.type = 'create' | x.value]) AS defaultCreate,\n head([x IN defaultPermissions WHERE x.type = 'read' | x.value]) AS defaultRead,\n head([x IN defaultPermissions WHERE x.type = 'update' | x.value]) AS defaultUpdate,\n head([x IN defaultPermissions WHERE x.type = 'delete' | x.value]) AS defaultDelete,\n rolePerms\n WITH m,\n [defaultCreate] + [x IN rolePerms WHERE x.type = 'create' | x.value] AS createValues,\n [defaultRead] + [x IN rolePerms WHERE x.type = 'read' | x.value] AS readValues,\n [defaultUpdate] + [x IN rolePerms WHERE x.type = 'update' | x.value] AS updateValues,\n [defaultDelete] + [x IN rolePerms WHERE x.type = 'delete' | x.value] AS deleteValues\n WITH m,\n CASE\n WHEN any(x IN createValues WHERE x = true) THEN true\n WHEN any(x IN createValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN createValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(createValues), false)\n END AS effectiveCreate,\n CASE\n WHEN any(x IN readValues WHERE x = true) THEN true\n WHEN any(x IN readValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN readValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(readValues), false)\n END AS effectiveRead,\n CASE\n WHEN any(x IN updateValues WHERE x = true) THEN true\n WHEN any(x IN updateValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN updateValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(updateValues), false)\n END AS effectiveUpdate,\n CASE\n WHEN any(x IN deleteValues WHERE x = true) THEN true\n WHEN any(x IN deleteValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN deleteValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(deleteValues), false)\n END AS effectiveDelete\n WITH m, apoc.convert.toJson([\n { type: \"create\", value: effectiveCreate },\n { type: \"read\", value: effectiveRead },\n { type: \"update\", value: effectiveUpdate },\n { type: \"delete\", value: effectiveDelete }\n ]) AS newPermissions\n CALL apoc.create.vNode(\n labels(m),\n apoc.map.merge(properties(m), { permissions: newPermissions })\n ) YIELD node AS module\n\n RETURN module\n\n";
|
|
3
|
+
export declare const adminModuleQuery = "\n MATCH (user:User {id: $searchValue})-[:HAS_MEMBERSHIP]->(am_ms:Membership)\n WHERE NOT (am_ms)-[:IN_COMPANY]->(:Company)\n MATCH (am_ms)-[:HAS_ROLE]->(role:Role)\n MATCH (role)-[perm:HAS_PERMISSIONS]->(m:Module)\n \n WITH m,\n coalesce(apoc.convert.fromJsonList(m.permissions), []) AS defaultPermissions,\n collect(perm) AS perms\n WITH m, defaultPermissions,\n apoc.coll.flatten([p IN perms | coalesce(apoc.convert.fromJsonList(p.permissions), [])]) AS rolePerms\n WITH m,\n head([x IN defaultPermissions WHERE x.type = 'create' | x.value]) AS defaultCreate,\n head([x IN defaultPermissions WHERE x.type = 'read' | x.value]) AS defaultRead,\n head([x IN defaultPermissions WHERE x.type = 'update' | x.value]) AS defaultUpdate,\n head([x IN defaultPermissions WHERE x.type = 'delete' | x.value]) AS defaultDelete,\n rolePerms\n WITH m,\n [defaultCreate] + [x IN rolePerms WHERE x.type = 'create' | x.value] AS createValues,\n [defaultRead] + [x IN rolePerms WHERE x.type = 'read' | x.value] AS readValues,\n [defaultUpdate] + [x IN rolePerms WHERE x.type = 'update' | x.value] AS updateValues,\n [defaultDelete] + [x IN rolePerms WHERE x.type = 'delete' | x.value] AS deleteValues\n WITH m,\n CASE\n WHEN any(x IN createValues WHERE x = true) THEN true\n WHEN any(x IN createValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN createValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(createValues), false)\n END AS effectiveCreate,\n CASE\n WHEN any(x IN readValues WHERE x = true) THEN true\n WHEN any(x IN readValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN readValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(readValues), false)\n END AS effectiveRead,\n CASE\n WHEN any(x IN updateValues WHERE x = true) THEN true\n WHEN any(x IN updateValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN updateValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(updateValues), false)\n END AS effectiveUpdate,\n CASE\n WHEN any(x IN deleteValues WHERE x = true) THEN true\n WHEN any(x IN deleteValues WHERE x IS NOT NULL AND x <> false AND x <> true)\n THEN head([x IN deleteValues WHERE x IS NOT NULL AND x <> false AND x <> true])\n ELSE coalesce(head(deleteValues), false)\n END AS effectiveDelete\n WITH m, apoc.convert.toJson([\n { type: \"create\", value: effectiveCreate },\n { type: \"read\", value: effectiveRead },\n { type: \"update\", value: effectiveUpdate },\n { type: \"delete\", value: effectiveDelete }\n ]) AS newPermissions\n CALL apoc.create.vNode(\n labels(m),\n apoc.map.merge(properties(m), { permissions: newPermissions })\n ) YIELD node AS module\n\n RETURN module\n\n";
|
|
4
4
|
//# sourceMappingURL=feature.module.query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.module.query.d.ts","sourceRoot":"","sources":["../../../../src/foundations/module/queries/feature.module.query.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,+BAA+B,y0FAsD3C,CAAC;
|
|
1
|
+
{"version":3,"file":"feature.module.query.d.ts","sourceRoot":"","sources":["../../../../src/foundations/module/queries/feature.module.query.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,+BAA+B,y0FAsD3C,CAAC;AAMF,eAAO,MAAM,kBAAkB,owGAU9B,CAAC;AAIF,eAAO,MAAM,gBAAgB,mjGAM5B,CAAC"}
|
|
@@ -59,8 +59,13 @@ exports.modulePermissionResolutionQuery = `
|
|
|
59
59
|
RETURN module
|
|
60
60
|
`;
|
|
61
61
|
// For regular users: modules via Company → Features → Modules
|
|
62
|
+
// The role read is the membershipRoleMatch expansion bound to the `company` alias the
|
|
63
|
+
// caller already binds (this file exports plain strings, so the helper cannot be used
|
|
64
|
+
// verbatim — see foundations/membership/queries/membership.query.ts).
|
|
62
65
|
exports.featureModuleQuery = `
|
|
63
|
-
OPTIONAL MATCH (user)-[:
|
|
66
|
+
OPTIONAL MATCH (user)-[:HAS_MEMBERSHIP]->(fm_ms:Membership)
|
|
67
|
+
WHERE (fm_ms)-[:IN_COMPANY]->(company) OR NOT (fm_ms)-[:IN_COMPANY]->(:Company)
|
|
68
|
+
OPTIONAL MATCH (fm_ms)-[:HAS_ROLE]->(role:Role)
|
|
64
69
|
OPTIONAL MATCH (feature:Feature)
|
|
65
70
|
WHERE exists((company)-[:HAS_FEATURE]->(feature))
|
|
66
71
|
OR feature.isCore = true
|
|
@@ -68,9 +73,12 @@ exports.featureModuleQuery = `
|
|
|
68
73
|
OPTIONAL MATCH (role)-[perm:HAS_PERMISSIONS]->(m)
|
|
69
74
|
${exports.modulePermissionResolutionQuery}
|
|
70
75
|
`;
|
|
71
|
-
// For Administrator users: modules via
|
|
76
|
+
// For Administrator users: modules via the PLATFORM membership (no IN_COMPANY edge)
|
|
77
|
+
// → Role → HAS_PERMISSIONS → Module
|
|
72
78
|
exports.adminModuleQuery = `
|
|
73
|
-
MATCH (user:User {id: $searchValue})-[:
|
|
79
|
+
MATCH (user:User {id: $searchValue})-[:HAS_MEMBERSHIP]->(am_ms:Membership)
|
|
80
|
+
WHERE NOT (am_ms)-[:IN_COMPANY]->(:Company)
|
|
81
|
+
MATCH (am_ms)-[:HAS_ROLE]->(role:Role)
|
|
74
82
|
MATCH (role)-[perm:HAS_PERMISSIONS]->(m:Module)
|
|
75
83
|
${exports.modulePermissionResolutionQuery}
|
|
76
84
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.module.query.js","sourceRoot":"","sources":["../../../../src/foundations/module/queries/feature.module.query.ts"],"names":[],"mappings":";;;AAAA,mFAAmF;AACnF,wEAAwE;AAC3D,QAAA,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsD9C,CAAC;AAEF,8DAA8D;
|
|
1
|
+
{"version":3,"file":"feature.module.query.js","sourceRoot":"","sources":["../../../../src/foundations/module/queries/feature.module.query.ts"],"names":[],"mappings":";;;AAAA,mFAAmF;AACnF,wEAAwE;AAC3D,QAAA,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsD9C,CAAC;AAEF,8DAA8D;AAC9D,sFAAsF;AACtF,sFAAsF;AACtF,sEAAsE;AACzD,QAAA,kBAAkB,GAAG;;;;;;;;;MAS5B,uCAA+B;CACpC,CAAC;AAEF,oFAAoF;AACpF,oCAAoC;AACvB,QAAA,gBAAgB,GAAG;;;;;MAK1B,uCAA+B;CACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/role/repositories/role.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAkB,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhE,qBACa,cAAe,YAAW,YAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAE1C,YAAY;IAMZ,eAAe,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxE,UAAU,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,QAAQ,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,IAAI,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,sBAAsB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAuBhF,WAAW,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,sBAAsB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"role.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/role/repositories/role.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAkB,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhE,qBACa,cAAe,YAAW,YAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAE1C,YAAY;IAMZ,eAAe,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxE,UAAU,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,QAAQ,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,IAAI,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,sBAAsB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAuBhF,WAAW,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,sBAAsB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IA+BvG,aAAa,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,sBAAsB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAiCzG,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBjF,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjF,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAaxD"}
|
|
@@ -87,11 +87,16 @@ let RoleRepository = class RoleRepository {
|
|
|
87
87
|
};
|
|
88
88
|
query.query += `
|
|
89
89
|
MATCH (user:User {id: $userId})-[:BELONGS_TO]->(company)
|
|
90
|
-
|
|
90
|
+
// Required (MATCH) variant of membershipRoleMatch bound to the company alias
|
|
91
|
+
// already matched above — see membership.query.ts. Company roles + platform roles.
|
|
92
|
+
MATCH (user)-[:HAS_MEMBERSHIP]->(role_ms:Membership)
|
|
93
|
+
WHERE (role_ms)-[:IN_COMPANY]->(company)
|
|
94
|
+
OR NOT (role_ms)-[:IN_COMPANY]->(:Company)
|
|
95
|
+
MATCH (role_ms)-[:HAS_ROLE]->(role:Role)
|
|
91
96
|
WHERE role.id <> $administratorsId
|
|
92
97
|
${params.term ? "AND toLower(role.name) CONTAINS toLower($term)" : ""}
|
|
93
|
-
|
|
94
|
-
WITH role
|
|
98
|
+
|
|
99
|
+
WITH DISTINCT role
|
|
95
100
|
ORDER BY role.name ASC
|
|
96
101
|
{CURSOR}
|
|
97
102
|
|
|
@@ -110,7 +115,13 @@ let RoleRepository = class RoleRepository {
|
|
|
110
115
|
query.query += `
|
|
111
116
|
MATCH (user:User {id: $userId})-[:BELONGS_TO]->(company)
|
|
112
117
|
MATCH (role:Role)
|
|
113
|
-
|
|
118
|
+
// Negated membership read (see membership.query.ts): the role must not be held
|
|
119
|
+
// through the company membership NOR through the platform membership.
|
|
120
|
+
WHERE NOT EXISTS {
|
|
121
|
+
MATCH (user)-[:HAS_MEMBERSHIP]->(nu_ms:Membership)-[:HAS_ROLE]->(role)
|
|
122
|
+
WHERE (nu_ms)-[:IN_COMPANY]->(company)
|
|
123
|
+
OR NOT (nu_ms)-[:IN_COMPANY]->(:Company)
|
|
124
|
+
}
|
|
114
125
|
${params.term ? "AND toLower(role.name) CONTAINS toLower($term)" : ""}
|
|
115
126
|
AND role.id <> $administratorsId
|
|
116
127
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.repository.js","sourceRoot":"","sources":["../../../../src/foundations/role/repositories/role.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yEAAgE;AAChE,2CAA0D;AAE1D,8EAA0E;AAC1E,mDAAgE;AAGzD,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxB,KAAK,EAAE,mFAAmF;SAC3F,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAwC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,qBAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QAEzE,KAAK,CAAC,WAAW,GAAG;YAClB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QAEF,KAAK,CAAC,KAAK,GAAG;;;;KAIb,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAwB;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,qBAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QAEzE,KAAK,CAAC,WAAW,GAAG;YAClB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QAEF,KAAK,CAAC,KAAK,GAAG;;;KAGb,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAA0B;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,qBAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QAEzE,KAAK,CAAC,WAAW,GAAG;YAClB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QAEF,KAAK,CAAC,KAAK,GAAG;;;KAGb,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAyD;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,qBAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhG,KAAK,CAAC,WAAW,GAAG;YAClB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,gBAAgB,EAAE,qBAAM,CAAC,aAAa;SACvC,CAAC;QAEF,KAAK,CAAC,KAAK,GAAG;;;QAGV,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,EAAE;;;;;;;KAOtE,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyE;QACzF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,qBAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhG,KAAK,CAAC,WAAW,GAAG;YAClB,GAAG,KAAK,CAAC,WAAW;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,gBAAgB,EAAE,qBAAM,CAAC,aAAa;SACvC,CAAC;QAEF,KAAK,CAAC,KAAK,IAAI
|
|
1
|
+
{"version":3,"file":"role.repository.js","sourceRoot":"","sources":["../../../../src/foundations/role/repositories/role.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../src/foundations/user/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAKhD;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAE1B,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../src/foundations/user/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAKhD;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAE1B,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAmEzB,CAAC;AAGH,MAAM,MAAM,kBAAkB,GAAG,OAAO,cAAc,CAAC;AAGvD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;EAA+C,CAAC;AAC5E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAAkD,CAAC;AAClF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;EAAgD,CAAC"}
|
|
@@ -52,10 +52,15 @@ exports.UserDescriptor = (0, common_1.defineEntity)()({
|
|
|
52
52
|
},
|
|
53
53
|
// Relationship definitions
|
|
54
54
|
relationships: {
|
|
55
|
+
// Serialisation-only: roles are hydrated through the Membership path
|
|
56
|
+
// (see foundations/membership/queries/membership.query.ts) — no single-hop
|
|
57
|
+
// (user)-[:HAS_MEMBERSHIP]->(role) edge exists. The serialiser maps by key +
|
|
58
|
+
// model, and no generic descriptor-driven writer touches this relationship
|
|
59
|
+
// (UserRepository/UserService do not extend AbstractRepository/AbstractService).
|
|
55
60
|
role: {
|
|
56
61
|
model: role_meta_1.roleMeta,
|
|
57
62
|
direction: "out",
|
|
58
|
-
relationship: "
|
|
63
|
+
relationship: "HAS_MEMBERSHIP",
|
|
59
64
|
cardinality: "many",
|
|
60
65
|
dtoKey: "roles",
|
|
61
66
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../../src/foundations/user/entities/user.ts"],"names":[],"mappings":";;;AAAA,4CAA0E;AAE1E,4DAAmE;AAEnE,mEAA+D;AAE/D,6DAAyD;AACzD,iCAAqC;AACrC,2CAA4E;AA4B5E;;;;;GAKG;AACU,QAAA,cAAc,GAAG,IAAA,qBAAY,GAAQ,CAAC;IACjD,GAAG,oBAAQ;IAEX,cAAc,EAAE,CAAC,cAAS,CAAC;IAE3B,oBAAoB;IACpB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE;QACtD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAClC,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO,SAAS,CAAC;gBACnC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACjE,OAAO,MAAM,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1F,CAAC;SACF;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;QACzC,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE;QAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;QAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,cAAc,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE;QAC9D,eAAe,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE;QAC/D,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE;QAC/D,kBAAkB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE;KACnE;IAED,mDAAmD;IACnD,aAAa,EAAE;QACb,SAAS,EAAE;YACT,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;SACxC;KACF;IAED,2BAA2B;IAC3B,aAAa,EAAE;QACb,IAAI,EAAE;YACJ,KAAK,EAAE,oBAAQ;YACf,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../../src/foundations/user/entities/user.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/user/repositories/user.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"user.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/user/repositories/user.repository.ts"],"names":[],"mappings":"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"}
|