@carlonicora/nestjs-neo4jsonapi 1.113.0 → 1.115.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/common/helpers/define-entity.d.ts.map +1 -1
- package/dist/common/helpers/define-entity.js +6 -2
- package/dist/common/helpers/define-entity.js.map +1 -1
- package/dist/common/interfaces/entity.schema.interface.d.ts +19 -0
- package/dist/common/interfaces/entity.schema.interface.d.ts.map +1 -1
- 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/auth.module.d.ts.map +1 -1
- package/dist/foundations/auth/auth.module.js +2 -1
- package/dist/foundations/auth/auth.module.js.map +1 -1
- package/dist/foundations/auth/controllers/auth.company.controller.d.ts +21 -0
- package/dist/foundations/auth/controllers/auth.company.controller.d.ts.map +1 -0
- package/dist/foundations/auth/controllers/auth.company.controller.js +71 -0
- package/dist/foundations/auth/controllers/auth.company.controller.js.map +1 -0
- package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.js +4 -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/index.d.ts +1 -0
- package/dist/foundations/auth/index.d.ts.map +1 -1
- package/dist/foundations/auth/index.js +3 -1
- package/dist/foundations/auth/index.js.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
|
@@ -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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"}
|
|
@@ -17,6 +17,7 @@ const system_roles_1 = require("../../../common/constants/system.roles");
|
|
|
17
17
|
const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
|
|
18
18
|
const company_meta_1 = require("../../company/entities/company.meta");
|
|
19
19
|
const feature_meta_1 = require("../../feature/entities/feature.meta");
|
|
20
|
+
const membership_query_1 = require("../../membership/queries/membership.query");
|
|
20
21
|
const module_model_1 = require("../../module/entities/module.model");
|
|
21
22
|
const feature_module_query_1 = require("../../module/queries/feature.module.query");
|
|
22
23
|
const role_meta_1 = require("../../role/entities/role.meta");
|
|
@@ -48,12 +49,14 @@ let UserRepository = class UserRepository {
|
|
|
48
49
|
const query = this.neo4j.initQuery();
|
|
49
50
|
query.queryParams = {
|
|
50
51
|
userId: params.userId,
|
|
51
|
-
|
|
52
|
+
companyId: params.companyId,
|
|
53
|
+
membershipId: (0, crypto_1.randomUUID)(),
|
|
54
|
+
roleIds: [system_roles_1.RoleId.CompanyAdministrator],
|
|
52
55
|
};
|
|
53
56
|
query.query = `
|
|
54
|
-
MATCH (
|
|
57
|
+
MATCH (company:Company {id: $companyId})
|
|
55
58
|
MATCH (user:User {id: $userId})
|
|
56
|
-
|
|
59
|
+
${(0, membership_query_1.grantCompanyRoles)({ userAlias: "user", companyAlias: "company" })}
|
|
57
60
|
`;
|
|
58
61
|
await this.neo4j.writeOne(query);
|
|
59
62
|
}
|
|
@@ -65,8 +68,13 @@ let UserRepository = class UserRepository {
|
|
|
65
68
|
query.query = `
|
|
66
69
|
MATCH (user:User {id: $userId})
|
|
67
70
|
|
|
68
|
-
OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
|
|
69
71
|
OPTIONAL MATCH (user)-[:BELONGS_TO]->(user_company:Company)
|
|
72
|
+
// membershipRoleMatch bound to the matched company alias: this query has no
|
|
73
|
+
// $companyId param (it is not CLS-scoped). See membership.query.ts.
|
|
74
|
+
OPTIONAL MATCH (user)-[:HAS_MEMBERSHIP]->(user_role_ms:Membership)
|
|
75
|
+
WHERE (user_role_ms)-[:IN_COMPANY]->(user_company)
|
|
76
|
+
OR NOT (user_role_ms)-[:IN_COMPANY]->(:Company)
|
|
77
|
+
OPTIONAL MATCH (user_role_ms)-[:HAS_ROLE]->(user_role:Role)
|
|
70
78
|
RETURN user, user_role, user_company
|
|
71
79
|
`;
|
|
72
80
|
return this.neo4j.readOne(query);
|
|
@@ -84,8 +92,13 @@ let UserRepository = class UserRepository {
|
|
|
84
92
|
query.query = `
|
|
85
93
|
MATCH (${user_meta_1.userMeta.nodeName}:User {id: $userId})
|
|
86
94
|
|
|
87
|
-
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName})-[:MEMBER_OF]->(${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}:${role_meta_1.roleMeta.labelName})
|
|
88
95
|
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName})-[:BELONGS_TO]->(${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}:${company_meta_1.companyMeta.labelName})
|
|
96
|
+
// membershipRoleMatch bound to the matched company alias: this query deliberately
|
|
97
|
+
// does not depend on CLS/$companyId. See membership.query.ts.
|
|
98
|
+
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName})-[:HAS_MEMBERSHIP]->(${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms:Membership)
|
|
99
|
+
WHERE (${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms)-[:IN_COMPANY]->(${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName})
|
|
100
|
+
OR NOT (${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms)-[:IN_COMPANY]->(:${company_meta_1.companyMeta.labelName})
|
|
101
|
+
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms)-[:HAS_ROLE]->(${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}:${role_meta_1.roleMeta.labelName})
|
|
89
102
|
|
|
90
103
|
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}_${feature_meta_1.featureMeta.nodeName}:${feature_meta_1.featureMeta.labelName})
|
|
91
104
|
WHERE ${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}_${feature_meta_1.featureMeta.nodeName}.isCore = true
|
|
@@ -107,7 +120,7 @@ let UserRepository = class UserRepository {
|
|
|
107
120
|
query.query += `
|
|
108
121
|
${this.userCypherService.default({ searchField: "id" })}
|
|
109
122
|
|
|
110
|
-
|
|
123
|
+
${(0, membership_query_1.membershipRoleMatch)({ userAlias: "user", roleAlias: "user_role" })}
|
|
111
124
|
OPTIONAL MATCH (user)-[:BELONGS_TO]->(user_company:Company)
|
|
112
125
|
OPTIONAL MATCH (user_company)-[:HAS_CONFIGURATION]->(user_company_configuration:Configuration)
|
|
113
126
|
MATCH (${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}_${feature_meta_1.featureMeta.nodeName}:${feature_meta_1.featureMeta.labelName})
|
|
@@ -155,7 +168,7 @@ let UserRepository = class UserRepository {
|
|
|
155
168
|
query.query = `
|
|
156
169
|
MATCH (company:Company {id: $companyId})
|
|
157
170
|
MATCH (user:User {id: $userId})-[:BELONGS_TO]->(company)
|
|
158
|
-
|
|
171
|
+
${(0, membership_query_1.membershipRoleMatch)({ userAlias: "user", roleAlias: "user_role" })}
|
|
159
172
|
OPTIONAL MATCH (user)-[:BELONGS_TO]->(user_company:Company)
|
|
160
173
|
|
|
161
174
|
MATCH (${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}_${feature_meta_1.featureMeta.nodeName}:${feature_meta_1.featureMeta.labelName})
|
|
@@ -176,8 +189,13 @@ let UserRepository = class UserRepository {
|
|
|
176
189
|
WHERE toLower(${user_meta_1.userMeta.nodeName}.email) = $email
|
|
177
190
|
${params.includeDeleted ? `` : `AND ${user_meta_1.userMeta.nodeName}.isDeleted = false`}
|
|
178
191
|
|
|
179
|
-
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName})-[:MEMBER_OF]->(${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}:${role_meta_1.roleMeta.labelName})
|
|
180
192
|
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName})-[:BELONGS_TO]->(${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}:${company_meta_1.companyMeta.labelName})
|
|
193
|
+
// membershipRoleMatch bound to the matched company alias: the login/lookup path
|
|
194
|
+
// has no $companyId param. See membership.query.ts.
|
|
195
|
+
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName})-[:HAS_MEMBERSHIP]->(${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms:Membership)
|
|
196
|
+
WHERE (${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms)-[:IN_COMPANY]->(${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName})
|
|
197
|
+
OR NOT (${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms)-[:IN_COMPANY]->(:${company_meta_1.companyMeta.labelName})
|
|
198
|
+
OPTIONAL MATCH (${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}_ms)-[:HAS_ROLE]->(${user_meta_1.userMeta.nodeName}_${role_meta_1.roleMeta.nodeName}:${role_meta_1.roleMeta.labelName})
|
|
181
199
|
|
|
182
200
|
MATCH (${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}_${feature_meta_1.featureMeta.nodeName}:${feature_meta_1.featureMeta.labelName})
|
|
183
201
|
WHERE ${user_meta_1.userMeta.nodeName}_${company_meta_1.companyMeta.nodeName}_${feature_meta_1.featureMeta.nodeName}.isCore = true
|
|
@@ -195,10 +213,15 @@ let UserRepository = class UserRepository {
|
|
|
195
213
|
code: params.code,
|
|
196
214
|
};
|
|
197
215
|
query.query = `
|
|
198
|
-
MATCH (user:User {code: $code, isDeleted: false})
|
|
199
|
-
|
|
200
|
-
OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
|
|
216
|
+
MATCH (user:User {code: $code, isDeleted: false})
|
|
217
|
+
|
|
201
218
|
OPTIONAL MATCH (user)-[:BELONGS_TO]->(user_company:Company)
|
|
219
|
+
// membershipRoleMatch bound to the matched company alias: the activation-code
|
|
220
|
+
// lookup has no $companyId param. See membership.query.ts.
|
|
221
|
+
OPTIONAL MATCH (user)-[:HAS_MEMBERSHIP]->(user_role_ms:Membership)
|
|
222
|
+
WHERE (user_role_ms)-[:IN_COMPANY]->(user_company)
|
|
223
|
+
OR NOT (user_role_ms)-[:IN_COMPANY]->(:Company)
|
|
224
|
+
OPTIONAL MATCH (user_role_ms)-[:HAS_ROLE]->(user_role:Role)
|
|
202
225
|
RETURN user, user_role, user_company
|
|
203
226
|
`;
|
|
204
227
|
return this.neo4j.readOne(query);
|
|
@@ -228,7 +251,7 @@ let UserRepository = class UserRepository {
|
|
|
228
251
|
query.query += `
|
|
229
252
|
{CURSOR}
|
|
230
253
|
|
|
231
|
-
|
|
254
|
+
${(0, membership_query_1.membershipRoleMatch)({ userAlias: user_meta_1.userMeta.nodeName, roleAlias: `${user_meta_1.userMeta.nodeName}_role` })}
|
|
232
255
|
RETURN ${user_meta_1.userMeta.nodeName}, ${user_meta_1.userMeta.nodeName}_role
|
|
233
256
|
`;
|
|
234
257
|
return this.neo4j.readMany(query);
|
|
@@ -263,7 +286,7 @@ let UserRepository = class UserRepository {
|
|
|
263
286
|
MATCH (company:Company {id: $companyId})<-[:BELONGS_TO]-(user:User)
|
|
264
287
|
${params.isDeleted ? `WHERE user.isDeleted = $isDeleted` : ``}
|
|
265
288
|
${params.term ? `${params.isDeleted ? `AND` : `WHERE`} toLower(user.name) CONTAINS toLower($term)` : ``}
|
|
266
|
-
|
|
289
|
+
${(0, membership_query_1.membershipRoleMatch)({ userAlias: "user", roleAlias: "user_role" })}
|
|
267
290
|
RETURN user, user_role
|
|
268
291
|
`;
|
|
269
292
|
return this.neo4j.readMany(query);
|
|
@@ -278,13 +301,13 @@ let UserRepository = class UserRepository {
|
|
|
278
301
|
query.query += `
|
|
279
302
|
MATCH (user:User {isDeleted: false})-[:BELONGS_TO]->(company)
|
|
280
303
|
${params.term ? "WHERE toLower(user.name) CONTAINS toLower($term)" : ""}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
WITH user
|
|
304
|
+
${(0, membership_query_1.membershipRoleMatchRequired)({ userAlias: "user", roleAlias: "role" })}
|
|
305
|
+
|
|
306
|
+
WITH DISTINCT user
|
|
284
307
|
ORDER BY user.name ASC
|
|
285
308
|
{CURSOR}
|
|
286
|
-
|
|
287
|
-
|
|
309
|
+
|
|
310
|
+
${(0, membership_query_1.membershipRoleMatch)({ userAlias: "user", roleAlias: "user_role" })}
|
|
288
311
|
OPTIONAL MATCH (user)-[:BELONGS_TO]->(user_company:Company)
|
|
289
312
|
RETURN user, user_role, user_company
|
|
290
313
|
`;
|
|
@@ -300,14 +323,18 @@ let UserRepository = class UserRepository {
|
|
|
300
323
|
query.query += `
|
|
301
324
|
MATCH (referenceRole:Role {id: $roleId})
|
|
302
325
|
MATCH (user:User {isDeleted: false})-[:BELONGS_TO]->(company)
|
|
303
|
-
WHERE NOT
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
326
|
+
WHERE NOT EXISTS {
|
|
327
|
+
MATCH (user)-[:HAS_MEMBERSHIP]->(nr_ms:Membership)-[:HAS_ROLE]->(referenceRole)
|
|
328
|
+
WHERE (nr_ms)-[:IN_COMPANY]->(:Company {id: $companyId})
|
|
329
|
+
OR NOT (nr_ms)-[:IN_COMPANY]->(:Company)
|
|
330
|
+
}
|
|
331
|
+
${params.term ? "AND toLower(user.name) CONTAINS toLower($term)" : ""}
|
|
332
|
+
|
|
333
|
+
WITH DISTINCT user
|
|
307
334
|
ORDER BY user.name ASC
|
|
308
335
|
{CURSOR}
|
|
309
|
-
|
|
310
|
-
|
|
336
|
+
|
|
337
|
+
${(0, membership_query_1.membershipRoleMatch)({ userAlias: "user", roleAlias: "user_role" })}
|
|
311
338
|
OPTIONAL MATCH (user)-[:BELONGS_TO]->(user_company:Company)
|
|
312
339
|
RETURN user, user_role, user_company
|
|
313
340
|
`;
|
|
@@ -329,7 +356,8 @@ let UserRepository = class UserRepository {
|
|
|
329
356
|
code: (0, crypto_1.randomUUID)(),
|
|
330
357
|
codeExpiration: new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
331
358
|
companyId: params.companyId,
|
|
332
|
-
roleIds: params.roleIds,
|
|
359
|
+
roleIds: params.roleIds ?? [],
|
|
360
|
+
membershipId: (0, crypto_1.randomUUID)(),
|
|
333
361
|
termsAcceptedAt: params.termsAcceptedAt ?? null,
|
|
334
362
|
marketingConsent: params.marketingConsent ?? false,
|
|
335
363
|
marketingConsentAt: params.marketingConsentAt ?? null,
|
|
@@ -355,14 +383,11 @@ let UserRepository = class UserRepository {
|
|
|
355
383
|
createdAt: datetime(),
|
|
356
384
|
updatedAt: datetime()
|
|
357
385
|
})-[:BELONGS_TO]->(company)
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
CREATE (user)-[:MEMBER_OF]->(role)
|
|
364
|
-
`
|
|
365
|
-
: ""}
|
|
386
|
+
|
|
387
|
+
// Always create the (user, company) Membership — the BELONGS_TO ⇄ Membership
|
|
388
|
+
// invariant holds even when the user starts with no roles.
|
|
389
|
+
WITH user, company
|
|
390
|
+
${(0, membership_query_1.grantCompanyRoles)({ userAlias: "user", companyAlias: "company" })}
|
|
366
391
|
`;
|
|
367
392
|
await this.neo4j.writeOne(query);
|
|
368
393
|
return this.findByUserId({ userId: params.userId, companyId: params.companyId });
|
|
@@ -408,7 +433,8 @@ let UserRepository = class UserRepository {
|
|
|
408
433
|
bio: params.bio ?? null,
|
|
409
434
|
password: params.password,
|
|
410
435
|
avatar: params.avatar ?? null,
|
|
411
|
-
roleIds: params.roles,
|
|
436
|
+
roleIds: params.roles ?? [],
|
|
437
|
+
membershipId: (0, crypto_1.randomUUID)(),
|
|
412
438
|
isActive: params.isActive,
|
|
413
439
|
phone: params.phone ?? null,
|
|
414
440
|
};
|
|
@@ -419,17 +445,16 @@ let UserRepository = class UserRepository {
|
|
|
419
445
|
|
|
420
446
|
${params.isAdmin && params.roles !== undefined
|
|
421
447
|
? `
|
|
422
|
-
//
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
448
|
+
// Drop the roles this user no longer holds IN THIS COMPANY.
|
|
449
|
+
// Platform memberships (no IN_COMPANY edge) are untouched here.
|
|
450
|
+
WITH user, company
|
|
451
|
+
OPTIONAL MATCH (user)-[:HAS_MEMBERSHIP]->(put_ms:Membership)-[:IN_COMPANY]->(company)
|
|
452
|
+
OPTIONAL MATCH (put_ms)-[stale:HAS_ROLE]->(stale_role:Role)
|
|
453
|
+
WHERE NOT stale_role.id IN $roleIds
|
|
454
|
+
DELETE stale
|
|
427
455
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
UNWIND roleIds AS roleId
|
|
431
|
-
MATCH (role:Role {id: roleId})
|
|
432
|
-
MERGE (user)-[:MEMBER_OF]->(role)
|
|
456
|
+
WITH DISTINCT user, company
|
|
457
|
+
${(0, membership_query_1.grantCompanyRoles)({ userAlias: "user", companyAlias: "company" })}
|
|
433
458
|
`
|
|
434
459
|
: ``}
|
|
435
460
|
`;
|
|
@@ -507,12 +532,23 @@ let UserRepository = class UserRepository {
|
|
|
507
532
|
...query.queryParams,
|
|
508
533
|
roleId: params.roleId,
|
|
509
534
|
userId: params.userId,
|
|
535
|
+
membershipId: (0, crypto_1.randomUUID)(),
|
|
536
|
+
roleIds: [params.roleId],
|
|
510
537
|
};
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
538
|
+
// Administrator is a PLATFORM role: it lives on the membership with no IN_COMPANY
|
|
539
|
+
// edge. Every other role is granted on the CLS company's membership.
|
|
540
|
+
if (params.roleId === system_roles_1.RoleId.Administrator) {
|
|
541
|
+
query.query += `
|
|
542
|
+
MATCH (user:User {id: $userId})
|
|
543
|
+
${(0, membership_query_1.grantPlatformRole)({ userAlias: "user" })}
|
|
544
|
+
`;
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
query.query += `
|
|
548
|
+
MATCH (user:User {id: $userId})-[:BELONGS_TO]->(company)
|
|
549
|
+
${(0, membership_query_1.grantCompanyRoles)({ userAlias: "user", companyAlias: "company" })}
|
|
550
|
+
`;
|
|
551
|
+
}
|
|
516
552
|
await this.neo4j.writeOne(query);
|
|
517
553
|
}
|
|
518
554
|
async removeUserFromRole(params) {
|
|
@@ -521,11 +557,13 @@ let UserRepository = class UserRepository {
|
|
|
521
557
|
...query.queryParams,
|
|
522
558
|
roleId: params.roleId,
|
|
523
559
|
userId: params.userId,
|
|
560
|
+
administratorRoleId: system_roles_1.RoleId.Administrator,
|
|
524
561
|
};
|
|
525
562
|
query.query += `
|
|
526
|
-
MATCH (user:User {id: $userId})-[:
|
|
527
|
-
|
|
528
|
-
|
|
563
|
+
MATCH (user:User {id: $userId})-[:HAS_MEMBERSHIP]->(rm_ms:Membership)
|
|
564
|
+
WHERE (rm_ms)-[:IN_COMPANY]->(:Company {id: $companyId})
|
|
565
|
+
OR ($roleId = $administratorRoleId AND NOT (rm_ms)-[:IN_COMPANY]->(:Company))
|
|
566
|
+
MATCH (rm_ms)-[rel:HAS_ROLE]->(:Role {id: $roleId})
|
|
529
567
|
DELETE rel
|
|
530
568
|
`;
|
|
531
569
|
await this.neo4j.writeOne(query);
|
|
@@ -540,8 +578,10 @@ let UserRepository = class UserRepository {
|
|
|
540
578
|
administratorRoleId: system_roles_1.RoleId.Administrator,
|
|
541
579
|
};
|
|
542
580
|
query.query = `
|
|
543
|
-
MATCH (user:User {isDeleted: false})-[:
|
|
544
|
-
|
|
581
|
+
MATCH (user:User {isDeleted: false})-[:HAS_MEMBERSHIP]->(pa_ms:Membership)
|
|
582
|
+
WHERE NOT (pa_ms)-[:IN_COMPANY]->(:Company)
|
|
583
|
+
MATCH (pa_ms)-[:HAS_ROLE]->(:Role {id: $administratorRoleId})
|
|
584
|
+
RETURN DISTINCT user
|
|
545
585
|
`;
|
|
546
586
|
return this.neo4j.readMany(query);
|
|
547
587
|
}
|
|
@@ -559,8 +599,14 @@ let UserRepository = class UserRepository {
|
|
|
559
599
|
MATCH (stripeCustomer:StripeCustomer {stripeCustomerId: $stripeCustomerId})
|
|
560
600
|
MATCH (company:Company)<-[:BELONGS_TO]-(stripeCustomer)
|
|
561
601
|
MATCH (user:User {isDeleted: false})-[:BELONGS_TO]->(company)
|
|
562
|
-
MATCH (user)-[:
|
|
563
|
-
|
|
602
|
+
MATCH (user)-[:HAS_MEMBERSHIP]->(ca_ms:Membership)-[:IN_COMPANY]->(company)
|
|
603
|
+
MATCH (ca_ms)-[:HAS_ROLE]->(:Role {id: $companyAdminRoleId})
|
|
604
|
+
// membershipRoleMatch bound to the matched company alias: this query has no
|
|
605
|
+
// $companyId param. See membership.query.ts.
|
|
606
|
+
OPTIONAL MATCH (user)-[:HAS_MEMBERSHIP]->(user_role_ms:Membership)
|
|
607
|
+
WHERE (user_role_ms)-[:IN_COMPANY]->(company)
|
|
608
|
+
OR NOT (user_role_ms)-[:IN_COMPANY]->(:Company)
|
|
609
|
+
OPTIONAL MATCH (user_role_ms)-[:HAS_ROLE]->(user_role:Role)
|
|
564
610
|
RETURN user, user_role
|
|
565
611
|
`;
|
|
566
612
|
return this.neo4j.readMany(query);
|
|
@@ -578,8 +624,9 @@ let UserRepository = class UserRepository {
|
|
|
578
624
|
query.query = `
|
|
579
625
|
MATCH (company:Company {id: $companyId})
|
|
580
626
|
MATCH (user:User {isDeleted: false})-[:BELONGS_TO]->(company)
|
|
581
|
-
MATCH (user)-[:
|
|
582
|
-
|
|
627
|
+
MATCH (user)-[:HAS_MEMBERSHIP]->(ca_ms:Membership)-[:IN_COMPANY]->(company)
|
|
628
|
+
MATCH (ca_ms)-[:HAS_ROLE]->(:Role {id: $companyAdminRoleId})
|
|
629
|
+
${(0, membership_query_1.membershipRoleMatch)({ userAlias: "user", roleAlias: "user_role" })}
|
|
583
630
|
RETURN user, user_role
|
|
584
631
|
`;
|
|
585
632
|
return this.neo4j.readMany(query);
|