@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.
Files changed (103) hide show
  1. package/dist/common/guards/index.d.ts +1 -0
  2. package/dist/common/guards/index.d.ts.map +1 -1
  3. package/dist/common/guards/index.js +1 -0
  4. package/dist/common/guards/index.js.map +1 -1
  5. package/dist/common/guards/jwt.auth.any-scope.guard.d.ts +20 -0
  6. package/dist/common/guards/jwt.auth.any-scope.guard.d.ts.map +1 -0
  7. package/dist/common/guards/jwt.auth.any-scope.guard.js +61 -0
  8. package/dist/common/guards/jwt.auth.any-scope.guard.js.map +1 -0
  9. package/dist/common/helpers/define-entity.d.ts.map +1 -1
  10. package/dist/common/helpers/define-entity.js +6 -2
  11. package/dist/common/helpers/define-entity.js.map +1 -1
  12. package/dist/common/interfaces/entity.schema.interface.d.ts +19 -0
  13. package/dist/common/interfaces/entity.schema.interface.d.ts.map +1 -1
  14. package/dist/core/security/services/security.service.d.ts +5 -0
  15. package/dist/core/security/services/security.service.d.ts.map +1 -1
  16. package/dist/core/security/services/security.service.js +13 -0
  17. package/dist/core/security/services/security.service.js.map +1 -1
  18. package/dist/foundations/auth/auth.module.d.ts.map +1 -1
  19. package/dist/foundations/auth/auth.module.js +2 -1
  20. package/dist/foundations/auth/auth.module.js.map +1 -1
  21. package/dist/foundations/auth/controllers/auth.company.controller.d.ts +21 -0
  22. package/dist/foundations/auth/controllers/auth.company.controller.d.ts.map +1 -0
  23. package/dist/foundations/auth/controllers/auth.company.controller.js +71 -0
  24. package/dist/foundations/auth/controllers/auth.company.controller.js.map +1 -0
  25. package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
  26. package/dist/foundations/auth/controllers/auth.controller.js +4 -0
  27. package/dist/foundations/auth/controllers/auth.controller.js.map +1 -1
  28. package/dist/foundations/auth/entities/auth.entity.d.ts +10 -0
  29. package/dist/foundations/auth/entities/auth.entity.d.ts.map +1 -1
  30. package/dist/foundations/auth/index.d.ts +1 -0
  31. package/dist/foundations/auth/index.d.ts.map +1 -1
  32. package/dist/foundations/auth/index.js +3 -1
  33. package/dist/foundations/auth/index.js.map +1 -1
  34. package/dist/foundations/auth/repositories/auth.repository.d.ts +28 -0
  35. package/dist/foundations/auth/repositories/auth.repository.d.ts.map +1 -1
  36. package/dist/foundations/auth/repositories/auth.repository.js +92 -12
  37. package/dist/foundations/auth/repositories/auth.repository.js.map +1 -1
  38. package/dist/foundations/auth/serialisers/auth.serialiser.d.ts.map +1 -1
  39. package/dist/foundations/auth/serialisers/auth.serialiser.js +4 -0
  40. package/dist/foundations/auth/serialisers/auth.serialiser.js.map +1 -1
  41. package/dist/foundations/auth/services/auth.service.d.ts +12 -0
  42. package/dist/foundations/auth/services/auth.service.d.ts.map +1 -1
  43. package/dist/foundations/auth/services/auth.service.js +55 -0
  44. package/dist/foundations/auth/services/auth.service.js.map +1 -1
  45. package/dist/foundations/company/repositories/company.repository.d.ts.map +1 -1
  46. package/dist/foundations/company/repositories/company.repository.js +7 -34
  47. package/dist/foundations/company/repositories/company.repository.js.map +1 -1
  48. package/dist/foundations/discord-user/repositories/discord-user.repository.d.ts.map +1 -1
  49. package/dist/foundations/discord-user/repositories/discord-user.repository.js +6 -1
  50. package/dist/foundations/discord-user/repositories/discord-user.repository.js.map +1 -1
  51. package/dist/foundations/foundations.modules.d.ts.map +1 -1
  52. package/dist/foundations/foundations.modules.js +2 -0
  53. package/dist/foundations/foundations.modules.js.map +1 -1
  54. package/dist/foundations/google-user/repositories/google-user.repository.d.ts.map +1 -1
  55. package/dist/foundations/google-user/repositories/google-user.repository.js +6 -1
  56. package/dist/foundations/google-user/repositories/google-user.repository.js.map +1 -1
  57. package/dist/foundations/index.d.ts +1 -0
  58. package/dist/foundations/index.d.ts.map +1 -1
  59. package/dist/foundations/index.js +1 -0
  60. package/dist/foundations/index.js.map +1 -1
  61. package/dist/foundations/membership/entities/membership.d.ts +34 -0
  62. package/dist/foundations/membership/entities/membership.d.ts.map +1 -0
  63. package/dist/foundations/membership/entities/membership.js +24 -0
  64. package/dist/foundations/membership/entities/membership.js.map +1 -0
  65. package/dist/foundations/membership/entities/membership.meta.d.ts +3 -0
  66. package/dist/foundations/membership/entities/membership.meta.d.ts.map +1 -0
  67. package/dist/foundations/membership/entities/membership.meta.js +10 -0
  68. package/dist/foundations/membership/entities/membership.meta.js.map +1 -0
  69. package/dist/foundations/membership/index.d.ts +6 -0
  70. package/dist/foundations/membership/index.d.ts.map +1 -0
  71. package/dist/foundations/membership/index.js +17 -0
  72. package/dist/foundations/membership/index.js.map +1 -0
  73. package/dist/foundations/membership/membership.module.d.ts +9 -0
  74. package/dist/foundations/membership/membership.module.d.ts.map +1 -0
  75. package/dist/foundations/membership/membership.module.js +32 -0
  76. package/dist/foundations/membership/membership.module.js.map +1 -0
  77. package/dist/foundations/membership/queries/membership.query.d.ts +60 -0
  78. package/dist/foundations/membership/queries/membership.query.d.ts.map +1 -0
  79. package/dist/foundations/membership/queries/membership.query.js +86 -0
  80. package/dist/foundations/membership/queries/membership.query.js.map +1 -0
  81. package/dist/foundations/membership/repositories/membership.repository.d.ts +8 -0
  82. package/dist/foundations/membership/repositories/membership.repository.d.ts.map +1 -0
  83. package/dist/foundations/membership/repositories/membership.repository.js +30 -0
  84. package/dist/foundations/membership/repositories/membership.repository.js.map +1 -0
  85. package/dist/foundations/module/queries/feature.module.query.d.ts +2 -2
  86. package/dist/foundations/module/queries/feature.module.query.d.ts.map +1 -1
  87. package/dist/foundations/module/queries/feature.module.query.js +11 -3
  88. package/dist/foundations/module/queries/feature.module.query.js.map +1 -1
  89. package/dist/foundations/role/repositories/role.repository.d.ts.map +1 -1
  90. package/dist/foundations/role/repositories/role.repository.js +15 -4
  91. package/dist/foundations/role/repositories/role.repository.js.map +1 -1
  92. package/dist/foundations/user/entities/user.d.ts.map +1 -1
  93. package/dist/foundations/user/entities/user.js +6 -1
  94. package/dist/foundations/user/entities/user.js.map +1 -1
  95. package/dist/foundations/user/repositories/user.repository.d.ts +1 -0
  96. package/dist/foundations/user/repositories/user.repository.d.ts.map +1 -1
  97. package/dist/foundations/user/repositories/user.repository.js +105 -58
  98. package/dist/foundations/user/repositories/user.repository.js.map +1 -1
  99. package/dist/foundations/user/services/user.service.d.ts +8 -0
  100. package/dist/foundations/user/services/user.service.d.ts.map +1 -1
  101. package/dist/foundations/user/services/user.service.js +20 -4
  102. package/dist/foundations/user/services/user.service.js.map +1 -1
  103. 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)-[:MEMBER_OF]->(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})-[:MEMBER_OF]->(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";
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;AAGF,eAAO,MAAM,kBAAkB,8mGAQ9B,CAAC;AAGF,eAAO,MAAM,gBAAgB,08FAI5B,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)-[:MEMBER_OF]->(role:Role)
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 Role HAS_PERMISSIONS Module
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})-[:MEMBER_OF]->(role:Role)
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;AACjD,QAAA,kBAAkB,GAAG;;;;;;;MAO5B,uCAA+B;CACpC,CAAC;AAEF,uEAAuE;AAC1D,QAAA,gBAAgB,GAAG;;;MAG1B,uCAA+B;CACpC,CAAC"}
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;IA0BvG,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;IA2BzG,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"}
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
- MATCH (user)-[:MEMBER_OF]->(role:Role)
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
- WHERE NOT (role)<-[:MEMBER_OF]-(user)
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":"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"}
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;;;;;;;;;QASX,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,aAAa,CAAC,MAAyE;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,qBAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhH,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;;;;;;;;;;QAUX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,EAAE;;;;;;;;KAQtE,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA0D;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAErC,KAAK,CAAC,WAAW,GAAG;YAClB,GAAG,KAAK,CAAC,WAAW;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;QAEF,KAAK,CAAC,KAAK,GAAG;;;;;;;KAOb,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA0D;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAErC,KAAK,CAAC,WAAW,GAAG;YAClB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;QAEF,KAAK,CAAC,KAAK,GAAG;;;;;KAKb,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA0B;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAErC,KAAK,CAAC,WAAW,GAAG;YAClB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QAEF,KAAK,CAAC,KAAK,GAAG;;;KAGb,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AArMY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAEyB,4BAAY;GADrC,cAAc,CAqM1B"}
@@ -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;;;;;;;;;;;;;;;;;;;;;EA8DzB,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"}
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: "MEMBER_OF",
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":"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"}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../../src/foundations/user/entities/user.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export declare class UserRepository implements OnModuleInit {
12
12
  onModuleInit(): Promise<void>;
13
13
  makeCompanyAdmin(params: {
14
14
  userId: string;
15
+ companyId: string;
15
16
  }): Promise<void>;
16
17
  findOneForAdmin(params: {
17
18
  userId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"user.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/user/repositories/user.repository.ts"],"names":[],"mappings":"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"}
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
- roleId: system_roles_1.RoleId.CompanyAdministrator,
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 (role:Role {id: $roleId})
57
+ MATCH (company:Company {id: $companyId})
55
58
  MATCH (user:User {id: $userId})
56
- MERGE (user)-[:MEMBER_OF]->(role)
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
- OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
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
- OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
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
- OPTIONAL MATCH (${user_meta_1.userMeta.nodeName})-[:MEMBER_OF]->(${user_meta_1.userMeta.nodeName}_role:Role)
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
- OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
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
- MATCH (user)-[:MEMBER_OF]->(role:Role {id: $roleId})
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
- OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
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 (user)-[:MEMBER_OF]->(referenceRole)
304
- ${params.term ? "WHERE toLower(user.name) CONTAINS toLower($term)" : ""}
305
-
306
- WITH user
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
- OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
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
- ${params.roleIds && params.roleIds.length > 0
359
- ? `
360
- WITH user, company
361
- UNWIND $roleIds AS roleId
362
- MATCH (role:Role {id: roleId})
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
- // Delete outdated MEMBER_OF relationships
423
- WITH user
424
- OPTIONAL MATCH (user)-[roleRel:MEMBER_OF]->(role:Role)
425
- WHERE NOT role.id IN $roleIds
426
- DELETE roleRel
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
- // Add new MEMBER_OF relationships
429
- WITH user, $roleIds AS roleIds
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
- query.query += `
512
- MATCH (user:User {id: $userId})-[:BELONGS_TO]->(company)
513
- MATCH (role:Role {id: $roleId})
514
- CREATE (user)-[:MEMBER_OF]->(role)
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})-[:BELONGS_TO]->(company)
527
- MATCH (role:Role {id: $roleId})
528
- MATCH (user)-[rel:MEMBER_OF]->(role)
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})-[:MEMBER_OF]->(role:Role {id: $administratorRoleId})
544
- RETURN user
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)-[:MEMBER_OF]->(role:Role {id: $companyAdminRoleId})
563
- OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
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)-[:MEMBER_OF]->(role:Role {id: $companyAdminRoleId})
582
- OPTIONAL MATCH (user)-[:MEMBER_OF]->(user_role:Role)
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);