@carbonbox/domain 0.49.1 → 0.50.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 (127) hide show
  1. package/build/carbonbox/company-resources/events/domain/entity/Event.js +11 -2
  2. package/build/carbonbox/company-resources/events/editions/domain/entity/EventEdition.js +11 -2
  3. package/build/carbonbox/company-resources/products/domain/entity/Product.js +11 -2
  4. package/build/carbonbox/shared/domain/enums/ErrorCode.js +9 -1
  5. package/build/carbonbox/shared/domain/enums/SemanticUuidPrefix.js +2 -0
  6. package/build/carbonbox/shared/domain/exceptions/InvalidCrossTenantReferenceError.js +36 -0
  7. package/build/carbonbox/shared/domain/policies/CarbonClientOwnershipPolicy.js +55 -0
  8. package/build/carbonbox/stakeholders/carbon-clients/domain/value-objects/CarbonClientPermissions.js +18 -0
  9. package/build/carbonbox/stakeholders/carbon-coordinators/domain/value-objects/CarbonCoordinatorPermissions.js +18 -0
  10. package/build/carbonbox/stakeholders/carbon-managers/domain/value-objects/CarbonManagerPermissions.js +18 -0
  11. package/build/carbonbox/stakeholders/shared/domain/constants/CARBON_CLIENT_PERMISSION_CEILING.js +87 -0
  12. package/build/carbonbox/stakeholders/shared/domain/constants/CARBON_COORDINATOR_PERMISSION_CEILING.js +88 -0
  13. package/build/carbonbox/stakeholders/shared/domain/constants/CARBON_MANAGER_PERMISSION_CEILING.js +29 -0
  14. package/build/carbonbox/stakeholders/shared/domain/exceptions/PermissionAboveRoleCeilingError.js +33 -0
  15. package/build/carbonbox/stakeholders/shared/domain/policies/RolePermissionCeilingPolicy.js +55 -0
  16. package/build/carbonbox/stakeholders/user-invitations/domain/constants/USER_INVITATION_VALIDITY_IN_DAYS.js +11 -0
  17. package/build/carbonbox/stakeholders/user-invitations/domain/entity/IUserInvitation.js +2 -0
  18. package/build/carbonbox/stakeholders/user-invitations/domain/entity/UserInvitation.js +229 -0
  19. package/build/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationAlreadyConsumedError.js +31 -0
  20. package/build/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationExpiredError.js +31 -0
  21. package/build/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationRevokedError.js +31 -0
  22. package/build/carbonbox/stakeholders/user-invitations/domain/repository/IUserInvitationRepository.js +2 -0
  23. package/build/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationIssueProps.js +2 -0
  24. package/build/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationPrimitives.js +2 -0
  25. package/build/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationProps.js +2 -0
  26. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationConsumedAt.js +21 -0
  27. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationEmail.js +24 -0
  28. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationEvaluatedAt.js +29 -0
  29. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationExpiresAt.js +37 -0
  30. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationId.js +44 -0
  31. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationInvitedByStakeholder.js +50 -0
  32. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationIssuedAt.js +24 -0
  33. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationRevokedAt.js +21 -0
  34. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationTokenHash.js +37 -0
  35. package/build/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationUserId.js +47 -0
  36. package/build/main/index.js +54 -6
  37. package/build/types/carbonbox/company-resources/events/domain/entity/Event.d.ts +2 -0
  38. package/build/types/carbonbox/company-resources/events/domain/entity/Event.d.ts.map +1 -1
  39. package/build/types/carbonbox/company-resources/events/domain/entity/IEvent.d.ts +2 -0
  40. package/build/types/carbonbox/company-resources/events/domain/entity/IEvent.d.ts.map +1 -1
  41. package/build/types/carbonbox/company-resources/events/domain/types/EventPrimitives.d.ts +1 -0
  42. package/build/types/carbonbox/company-resources/events/domain/types/EventPrimitives.d.ts.map +1 -1
  43. package/build/types/carbonbox/company-resources/events/domain/types/EventProps.d.ts +1 -0
  44. package/build/types/carbonbox/company-resources/events/domain/types/EventProps.d.ts.map +1 -1
  45. package/build/types/carbonbox/company-resources/events/editions/domain/entity/EventEdition.d.ts +2 -0
  46. package/build/types/carbonbox/company-resources/events/editions/domain/entity/EventEdition.d.ts.map +1 -1
  47. package/build/types/carbonbox/company-resources/events/editions/domain/entity/IEventEdition.d.ts +2 -0
  48. package/build/types/carbonbox/company-resources/events/editions/domain/entity/IEventEdition.d.ts.map +1 -1
  49. package/build/types/carbonbox/company-resources/events/editions/domain/types/EventEditionPrimitives.d.ts +1 -0
  50. package/build/types/carbonbox/company-resources/events/editions/domain/types/EventEditionPrimitives.d.ts.map +1 -1
  51. package/build/types/carbonbox/company-resources/events/editions/domain/types/EventEditionProps.d.ts +1 -0
  52. package/build/types/carbonbox/company-resources/events/editions/domain/types/EventEditionProps.d.ts.map +1 -1
  53. package/build/types/carbonbox/company-resources/products/domain/entity/IProduct.d.ts +2 -0
  54. package/build/types/carbonbox/company-resources/products/domain/entity/IProduct.d.ts.map +1 -1
  55. package/build/types/carbonbox/company-resources/products/domain/entity/Product.d.ts +2 -0
  56. package/build/types/carbonbox/company-resources/products/domain/entity/Product.d.ts.map +1 -1
  57. package/build/types/carbonbox/company-resources/products/domain/types/ProductPrimitives.d.ts +1 -0
  58. package/build/types/carbonbox/company-resources/products/domain/types/ProductPrimitives.d.ts.map +1 -1
  59. package/build/types/carbonbox/company-resources/products/domain/types/ProductProps.d.ts +1 -0
  60. package/build/types/carbonbox/company-resources/products/domain/types/ProductProps.d.ts.map +1 -1
  61. package/build/types/carbonbox/shared/domain/enums/ErrorCode.d.ts +7 -2
  62. package/build/types/carbonbox/shared/domain/enums/ErrorCode.d.ts.map +1 -1
  63. package/build/types/carbonbox/shared/domain/enums/SemanticUuidPrefix.d.ts +1 -0
  64. package/build/types/carbonbox/shared/domain/enums/SemanticUuidPrefix.d.ts.map +1 -1
  65. package/build/types/carbonbox/shared/domain/exceptions/InvalidCrossTenantReferenceError.d.ts +16 -0
  66. package/build/types/carbonbox/shared/domain/exceptions/InvalidCrossTenantReferenceError.d.ts.map +1 -0
  67. package/build/types/carbonbox/shared/domain/policies/CarbonClientOwnershipPolicy.d.ts +36 -0
  68. package/build/types/carbonbox/shared/domain/policies/CarbonClientOwnershipPolicy.d.ts.map +1 -0
  69. package/build/types/carbonbox/stakeholders/carbon-clients/domain/value-objects/CarbonClientPermissions.d.ts +7 -0
  70. package/build/types/carbonbox/stakeholders/carbon-clients/domain/value-objects/CarbonClientPermissions.d.ts.map +1 -1
  71. package/build/types/carbonbox/stakeholders/carbon-coordinators/domain/value-objects/CarbonCoordinatorPermissions.d.ts +7 -0
  72. package/build/types/carbonbox/stakeholders/carbon-coordinators/domain/value-objects/CarbonCoordinatorPermissions.d.ts.map +1 -1
  73. package/build/types/carbonbox/stakeholders/carbon-managers/domain/value-objects/CarbonManagerPermissions.d.ts +7 -0
  74. package/build/types/carbonbox/stakeholders/carbon-managers/domain/value-objects/CarbonManagerPermissions.d.ts.map +1 -1
  75. package/build/types/carbonbox/stakeholders/shared/domain/constants/CARBON_CLIENT_PERMISSION_CEILING.d.ts +14 -0
  76. package/build/types/carbonbox/stakeholders/shared/domain/constants/CARBON_CLIENT_PERMISSION_CEILING.d.ts.map +1 -0
  77. package/build/types/carbonbox/stakeholders/shared/domain/constants/CARBON_COORDINATOR_PERMISSION_CEILING.d.ts +14 -0
  78. package/build/types/carbonbox/stakeholders/shared/domain/constants/CARBON_COORDINATOR_PERMISSION_CEILING.d.ts.map +1 -0
  79. package/build/types/carbonbox/stakeholders/shared/domain/constants/CARBON_MANAGER_PERMISSION_CEILING.d.ts +14 -0
  80. package/build/types/carbonbox/stakeholders/shared/domain/constants/CARBON_MANAGER_PERMISSION_CEILING.d.ts.map +1 -0
  81. package/build/types/carbonbox/stakeholders/shared/domain/exceptions/PermissionAboveRoleCeilingError.d.ts +12 -0
  82. package/build/types/carbonbox/stakeholders/shared/domain/exceptions/PermissionAboveRoleCeilingError.d.ts.map +1 -0
  83. package/build/types/carbonbox/stakeholders/shared/domain/policies/RolePermissionCeilingPolicy.d.ts +26 -0
  84. package/build/types/carbonbox/stakeholders/shared/domain/policies/RolePermissionCeilingPolicy.d.ts.map +1 -0
  85. package/build/types/carbonbox/stakeholders/user-invitations/domain/constants/USER_INVITATION_VALIDITY_IN_DAYS.d.ts +9 -0
  86. package/build/types/carbonbox/stakeholders/user-invitations/domain/constants/USER_INVITATION_VALIDITY_IN_DAYS.d.ts.map +1 -0
  87. package/build/types/carbonbox/stakeholders/user-invitations/domain/entity/IUserInvitation.d.ts +20 -0
  88. package/build/types/carbonbox/stakeholders/user-invitations/domain/entity/IUserInvitation.d.ts.map +1 -0
  89. package/build/types/carbonbox/stakeholders/user-invitations/domain/entity/UserInvitation.d.ts +67 -0
  90. package/build/types/carbonbox/stakeholders/user-invitations/domain/entity/UserInvitation.d.ts.map +1 -0
  91. package/build/types/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationAlreadyConsumedError.d.ts +12 -0
  92. package/build/types/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationAlreadyConsumedError.d.ts.map +1 -0
  93. package/build/types/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationExpiredError.d.ts +12 -0
  94. package/build/types/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationExpiredError.d.ts.map +1 -0
  95. package/build/types/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationRevokedError.d.ts +12 -0
  96. package/build/types/carbonbox/stakeholders/user-invitations/domain/exceptions/UserInvitationRevokedError.d.ts.map +1 -0
  97. package/build/types/carbonbox/stakeholders/user-invitations/domain/repository/IUserInvitationRepository.d.ts +35 -0
  98. package/build/types/carbonbox/stakeholders/user-invitations/domain/repository/IUserInvitationRepository.d.ts.map +1 -0
  99. package/build/types/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationIssueProps.d.ts +36 -0
  100. package/build/types/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationIssueProps.d.ts.map +1 -0
  101. package/build/types/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationPrimitives.d.ts +48 -0
  102. package/build/types/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationPrimitives.d.ts.map +1 -0
  103. package/build/types/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationProps.d.ts +43 -0
  104. package/build/types/carbonbox/stakeholders/user-invitations/domain/types/UserInvitationProps.d.ts.map +1 -0
  105. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationConsumedAt.d.ts +9 -0
  106. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationConsumedAt.d.ts.map +1 -0
  107. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationEmail.d.ts +9 -0
  108. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationEmail.d.ts.map +1 -0
  109. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationEvaluatedAt.d.ts +14 -0
  110. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationEvaluatedAt.d.ts.map +1 -0
  111. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationExpiresAt.d.ts +18 -0
  112. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationExpiresAt.d.ts.map +1 -0
  113. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationId.d.ts +18 -0
  114. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationId.d.ts.map +1 -0
  115. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationInvitedByStakeholder.d.ts +16 -0
  116. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationInvitedByStakeholder.d.ts.map +1 -0
  117. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationIssuedAt.d.ts +9 -0
  118. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationIssuedAt.d.ts.map +1 -0
  119. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationRevokedAt.d.ts +9 -0
  120. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationRevokedAt.d.ts.map +1 -0
  121. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationTokenHash.d.ts +17 -0
  122. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationTokenHash.d.ts.map +1 -0
  123. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationUserId.d.ts +19 -0
  124. package/build/types/carbonbox/stakeholders/user-invitations/domain/value-objects/UserInvitationUserId.d.ts.map +1 -0
  125. package/build/types/main/index.d.ts +27 -0
  126. package/build/types/main/index.d.ts.map +1 -1
  127. package/package.json +1 -1
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PermissionAboveRoleCeilingError = void 0;
4
+ const CodedRootError_1 = require("../../../../shared/domain/exceptions/CodedRootError");
5
+ const ErrorCode_1 = require("../../../../shared/domain/enums/ErrorCode");
6
+ /**
7
+ * AIS-D01: a stakeholder of `role` was given permissions outside the role's ceiling
8
+ * (`RolePermissionCeilingPolicy`). Raised whoever grants them, the host included.
9
+ */
10
+ class PermissionAboveRoleCeilingError extends CodedRootError_1.CodedRootError {
11
+ constructor(role, permissionsAboveCeiling) {
12
+ const technicalMessage = `Permissions outside the ${role} ceiling: ${permissionsAboveCeiling.join(', ')}.`;
13
+ const context = {
14
+ role,
15
+ permissionsAboveCeiling: Array.from(permissionsAboveCeiling),
16
+ timestamp: new Date().toISOString(),
17
+ };
18
+ const suggestions = [
19
+ `Grant only permissions within the ${role} ceiling`,
20
+ 'Remove the listed permissions from the request',
21
+ 'Raising a role ceiling is a product decision that requires publishing the domain package',
22
+ ];
23
+ super(ErrorCode_1.ErrorCode.PERMISSION_ABOVE_ROLE_CEILING, technicalMessage, context, suggestions);
24
+ this.name = 'PermissionAboveRoleCeilingError';
25
+ }
26
+ static create(role, permissionsAboveCeiling) {
27
+ return new PermissionAboveRoleCeilingError(role, permissionsAboveCeiling);
28
+ }
29
+ logError() {
30
+ return `${this.name}: ${this.technicalMessage}`;
31
+ }
32
+ }
33
+ exports.PermissionAboveRoleCeilingError = PermissionAboveRoleCeilingError;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RolePermissionCeilingPolicy = void 0;
4
+ const StakeholderRole_1 = require("../../../../shared/domain/enums/StakeholderRole");
5
+ const CARBON_CLIENT_PERMISSION_CEILING_1 = require("../constants/CARBON_CLIENT_PERMISSION_CEILING");
6
+ const CARBON_COORDINATOR_PERMISSION_CEILING_1 = require("../constants/CARBON_COORDINATOR_PERMISSION_CEILING");
7
+ const CARBON_MANAGER_PERMISSION_CEILING_1 = require("../constants/CARBON_MANAGER_PERMISSION_CEILING");
8
+ const PermissionAboveRoleCeilingError_1 = require("../exceptions/PermissionAboveRoleCeilingError");
9
+ /**
10
+ * Pure domain policy with the permission ceiling of each stakeholder role (AIS-D01, D9).
11
+ *
12
+ * Why this exists: before the ceiling, any actor able to grant permissions could fabricate power
13
+ * (a client with host permissions). The ceiling is the most a role can ever hold; the backend adds
14
+ * the actor-relative rules on top (grantor ⊇ granted, target within the grantor's scope).
15
+ *
16
+ * The validated path of `CarbonClientPermissions`, `CarbonCoordinatorPermissions` and
17
+ * `CarbonManagerPermissions` (`create`) calls `assertWithinCeiling`; `fromPrimitives` does not, so
18
+ * existing records still load. `CARBON_HOST` has no ceiling.
19
+ */
20
+ class RolePermissionCeilingPolicy {
21
+ constructor() {
22
+ // Static-only — not instantiable.
23
+ }
24
+ static hasCeiling(role) {
25
+ return RolePermissionCeilingPolicy.CEILINGS_BY_ROLE.has(role);
26
+ }
27
+ /** The ceiling of the role, or `null` when the role has none (host). */
28
+ static findCeiling(role) {
29
+ return RolePermissionCeilingPolicy.CEILINGS_BY_ROLE.get(role) ?? null;
30
+ }
31
+ /** The given permissions that fall outside the role's ceiling (empty when the role has none). */
32
+ static findPermissionsAboveCeiling(role, permissions) {
33
+ const ceiling = RolePermissionCeilingPolicy.findCeiling(role);
34
+ if (ceiling === null) {
35
+ return [];
36
+ }
37
+ return permissions.filter((permission) => ceiling.includes(permission) === false);
38
+ }
39
+ static isWithinCeiling(role, permissions) {
40
+ return RolePermissionCeilingPolicy.findPermissionsAboveCeiling(role, permissions).length === 0;
41
+ }
42
+ /** Throws `PermissionAboveRoleCeilingError` listing every permission outside the role's ceiling. */
43
+ static assertWithinCeiling(role, permissions) {
44
+ const permissionsAboveCeiling = RolePermissionCeilingPolicy.findPermissionsAboveCeiling(role, permissions);
45
+ if (permissionsAboveCeiling.length > 0) {
46
+ throw PermissionAboveRoleCeilingError_1.PermissionAboveRoleCeilingError.create(role, permissionsAboveCeiling);
47
+ }
48
+ }
49
+ }
50
+ exports.RolePermissionCeilingPolicy = RolePermissionCeilingPolicy;
51
+ RolePermissionCeilingPolicy.CEILINGS_BY_ROLE = new Map([
52
+ [StakeholderRole_1.StakeholderRole.CARBON_CLIENT, CARBON_CLIENT_PERMISSION_CEILING_1.CARBON_CLIENT_PERMISSION_CEILING],
53
+ [StakeholderRole_1.StakeholderRole.CARBON_COORDINATOR, CARBON_COORDINATOR_PERMISSION_CEILING_1.CARBON_COORDINATOR_PERMISSION_CEILING],
54
+ [StakeholderRole_1.StakeholderRole.CARBON_MANAGER, CARBON_MANAGER_PERMISSION_CEILING_1.CARBON_MANAGER_PERMISSION_CEILING],
55
+ ]);
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.USER_INVITATION_VALIDITY_IN_DAYS = void 0;
4
+ /**
5
+ * Days an invitation stays valid after it is issued (AIS-D04, decision D3).
6
+ *
7
+ * The domain does not read the clock: whoever issues the invitation computes
8
+ * `expiresAt = issuedAt + USER_INVITATION_VALIDITY_IN_DAYS` and `UserInvitation.issue`
9
+ * rejects an expiry that is not after the issue moment.
10
+ */
11
+ exports.USER_INVITATION_VALIDITY_IN_DAYS = 7;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _UserInvitation_instances, _UserInvitation_userId, _UserInvitation_email, _UserInvitation_tokenHash, _UserInvitation_issuedAt, _UserInvitation_expiresAt, _UserInvitation_consumedAt, _UserInvitation_revokedAt, _UserInvitation_invitedByStakeholder, _UserInvitation_toProps, _UserInvitation_guardAgainstExpiryNotAfterIssue, _UserInvitation_guardAgainstConsumedAndRevoked;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.UserInvitation = void 0;
16
+ const AggregateRoot_1 = require("../../../../shared/domain/entities/AggregateRoot");
17
+ const InvalidDateRangeError_1 = require("../../../../shared/domain/exceptions/InvalidDateRangeError");
18
+ const InvalidPropertyValueError_1 = require("../../../../shared/domain/exceptions/InvalidPropertyValueError");
19
+ const UserInvitationId_1 = require("../value-objects/UserInvitationId");
20
+ const UserInvitationUserId_1 = require("../value-objects/UserInvitationUserId");
21
+ const UserInvitationEmail_1 = require("../value-objects/UserInvitationEmail");
22
+ const UserInvitationTokenHash_1 = require("../value-objects/UserInvitationTokenHash");
23
+ const UserInvitationIssuedAt_1 = require("../value-objects/UserInvitationIssuedAt");
24
+ const UserInvitationExpiresAt_1 = require("../value-objects/UserInvitationExpiresAt");
25
+ const UserInvitationConsumedAt_1 = require("../value-objects/UserInvitationConsumedAt");
26
+ const UserInvitationRevokedAt_1 = require("../value-objects/UserInvitationRevokedAt");
27
+ const UserInvitationEvaluatedAt_1 = require("../value-objects/UserInvitationEvaluatedAt");
28
+ const UserInvitationInvitedByStakeholder_1 = require("../value-objects/UserInvitationInvitedByStakeholder");
29
+ const UserInvitationExpiredError_1 = require("../exceptions/UserInvitationExpiredError");
30
+ const UserInvitationAlreadyConsumedError_1 = require("../exceptions/UserInvitationAlreadyConsumedError");
31
+ const UserInvitationRevokedError_1 = require("../exceptions/UserInvitationRevokedError");
32
+ /**
33
+ * UserInvitation aggregate (AIS-D04, decision D3): a stakeholder created by someone else sets
34
+ * its own password by accepting a single-use, time-bound invitation. The creator never knows
35
+ * the password.
36
+ *
37
+ * Only the SHA-256 of the token is kept. The domain does not read the clock: issuing, accepting
38
+ * and revoking receive the current moment (`DD/MM/YYYY HH:mm:ss`). Changes return a new instance.
39
+ *
40
+ * Lifecycle: pending → consumed (accepted) | revoked (replaced by a resent invitation). Expiry is
41
+ * not a stored state: it is evaluated against the moment given (`isExpiredAt`).
42
+ */
43
+ class UserInvitation extends AggregateRoot_1.AggregateRoot {
44
+ constructor(props, skipDomainValidation) {
45
+ const id = skipDomainValidation
46
+ ? UserInvitationId_1.UserInvitationId.fromPrimitives(props.id).toPrimitives()
47
+ : UserInvitationId_1.UserInvitationId.create(props.id).toPrimitives();
48
+ super({ id }, skipDomainValidation);
49
+ _UserInvitation_instances.add(this);
50
+ _UserInvitation_userId.set(this, void 0);
51
+ _UserInvitation_email.set(this, void 0);
52
+ _UserInvitation_tokenHash.set(this, void 0);
53
+ _UserInvitation_issuedAt.set(this, void 0);
54
+ _UserInvitation_expiresAt.set(this, void 0);
55
+ _UserInvitation_consumedAt.set(this, void 0);
56
+ _UserInvitation_revokedAt.set(this, void 0);
57
+ _UserInvitation_invitedByStakeholder.set(this, void 0);
58
+ if (skipDomainValidation === false) {
59
+ // Initialize with domain validation
60
+ __classPrivateFieldSet(this, _UserInvitation_userId, UserInvitationUserId_1.UserInvitationUserId.create(props.userId), "f");
61
+ __classPrivateFieldSet(this, _UserInvitation_email, UserInvitationEmail_1.UserInvitationEmail.create(props.email), "f");
62
+ __classPrivateFieldSet(this, _UserInvitation_tokenHash, UserInvitationTokenHash_1.UserInvitationTokenHash.create(props.tokenHash), "f");
63
+ __classPrivateFieldSet(this, _UserInvitation_issuedAt, UserInvitationIssuedAt_1.UserInvitationIssuedAt.create(props.issuedAt), "f");
64
+ __classPrivateFieldSet(this, _UserInvitation_expiresAt, UserInvitationExpiresAt_1.UserInvitationExpiresAt.create(props.expiresAt), "f");
65
+ __classPrivateFieldSet(this, _UserInvitation_consumedAt, UserInvitationConsumedAt_1.UserInvitationConsumedAt.create(props.consumedAt), "f");
66
+ __classPrivateFieldSet(this, _UserInvitation_revokedAt, UserInvitationRevokedAt_1.UserInvitationRevokedAt.create(props.revokedAt), "f");
67
+ __classPrivateFieldSet(this, _UserInvitation_invitedByStakeholder, UserInvitationInvitedByStakeholder_1.UserInvitationInvitedByStakeholder.create(props.invitedByStakeholder), "f");
68
+ __classPrivateFieldGet(this, _UserInvitation_instances, "m", _UserInvitation_guardAgainstExpiryNotAfterIssue).call(this);
69
+ __classPrivateFieldGet(this, _UserInvitation_instances, "m", _UserInvitation_guardAgainstConsumedAndRevoked).call(this);
70
+ }
71
+ else {
72
+ // Initialize from primitives (no domain validation)
73
+ __classPrivateFieldSet(this, _UserInvitation_userId, UserInvitationUserId_1.UserInvitationUserId.fromPrimitives(props.userId), "f");
74
+ __classPrivateFieldSet(this, _UserInvitation_email, UserInvitationEmail_1.UserInvitationEmail.fromPrimitives(props.email), "f");
75
+ __classPrivateFieldSet(this, _UserInvitation_tokenHash, UserInvitationTokenHash_1.UserInvitationTokenHash.fromPrimitives(props.tokenHash), "f");
76
+ __classPrivateFieldSet(this, _UserInvitation_issuedAt, UserInvitationIssuedAt_1.UserInvitationIssuedAt.fromPrimitives(props.issuedAt), "f");
77
+ __classPrivateFieldSet(this, _UserInvitation_expiresAt, UserInvitationExpiresAt_1.UserInvitationExpiresAt.fromPrimitives(props.expiresAt), "f");
78
+ __classPrivateFieldSet(this, _UserInvitation_consumedAt, UserInvitationConsumedAt_1.UserInvitationConsumedAt.fromPrimitives(props.consumedAt), "f");
79
+ __classPrivateFieldSet(this, _UserInvitation_revokedAt, UserInvitationRevokedAt_1.UserInvitationRevokedAt.fromPrimitives(props.revokedAt), "f");
80
+ __classPrivateFieldSet(this, _UserInvitation_invitedByStakeholder, UserInvitationInvitedByStakeholder_1.UserInvitationInvitedByStakeholder.fromPrimitives(props.invitedByStakeholder), "f");
81
+ }
82
+ }
83
+ static create(props) {
84
+ return new UserInvitation(props, false);
85
+ }
86
+ /**
87
+ * Issues a new pending invitation (neither consumed nor revoked). The caller computes
88
+ * `expiresAt = issuedAt + USER_INVITATION_VALIDITY_IN_DAYS`; an expiry that is not after the
89
+ * issue moment is rejected (InvalidDateRangeError).
90
+ */
91
+ static issue(props) {
92
+ return new UserInvitation({
93
+ id: props.id,
94
+ userId: props.userId,
95
+ email: props.email,
96
+ tokenHash: props.tokenHash,
97
+ issuedAt: props.issuedAt,
98
+ expiresAt: props.expiresAt,
99
+ consumedAt: null,
100
+ revokedAt: null,
101
+ invitedByStakeholder: props.invitedByStakeholder,
102
+ }, false);
103
+ }
104
+ static fromPrimitives(primitives) {
105
+ const props = {
106
+ id: primitives.id,
107
+ userId: primitives.userId,
108
+ email: primitives.email,
109
+ tokenHash: primitives.tokenHash,
110
+ issuedAt: primitives.issuedAt,
111
+ expiresAt: primitives.expiresAt,
112
+ consumedAt: primitives.consumedAt,
113
+ revokedAt: primitives.revokedAt,
114
+ invitedByStakeholder: primitives.invitedByStakeholder,
115
+ };
116
+ return new UserInvitation(props, true);
117
+ }
118
+ get toPrimitives() {
119
+ return {
120
+ id: this.id.toPrimitives(),
121
+ userId: __classPrivateFieldGet(this, _UserInvitation_userId, "f").toPrimitives(),
122
+ email: __classPrivateFieldGet(this, _UserInvitation_email, "f").toPrimitives(),
123
+ tokenHash: __classPrivateFieldGet(this, _UserInvitation_tokenHash, "f").toPrimitives(),
124
+ issuedAt: __classPrivateFieldGet(this, _UserInvitation_issuedAt, "f").toPrimitives(),
125
+ expiresAt: __classPrivateFieldGet(this, _UserInvitation_expiresAt, "f").toPrimitives(),
126
+ consumedAt: __classPrivateFieldGet(this, _UserInvitation_consumedAt, "f").toPrimitives(),
127
+ revokedAt: __classPrivateFieldGet(this, _UserInvitation_revokedAt, "f").toPrimitives(),
128
+ invitedByStakeholder: __classPrivateFieldGet(this, _UserInvitation_invitedByStakeholder, "f").toPrimitives(),
129
+ };
130
+ }
131
+ get userId() {
132
+ return __classPrivateFieldGet(this, _UserInvitation_userId, "f");
133
+ }
134
+ get email() {
135
+ return __classPrivateFieldGet(this, _UserInvitation_email, "f");
136
+ }
137
+ get tokenHash() {
138
+ return __classPrivateFieldGet(this, _UserInvitation_tokenHash, "f");
139
+ }
140
+ get issuedAt() {
141
+ return __classPrivateFieldGet(this, _UserInvitation_issuedAt, "f");
142
+ }
143
+ get expiresAt() {
144
+ return __classPrivateFieldGet(this, _UserInvitation_expiresAt, "f");
145
+ }
146
+ get consumedAt() {
147
+ return __classPrivateFieldGet(this, _UserInvitation_consumedAt, "f");
148
+ }
149
+ get revokedAt() {
150
+ return __classPrivateFieldGet(this, _UserInvitation_revokedAt, "f");
151
+ }
152
+ get invitedByStakeholder() {
153
+ return __classPrivateFieldGet(this, _UserInvitation_invitedByStakeholder, "f");
154
+ }
155
+ /**
156
+ * Whether the invitation is neither consumed nor revoked. Expiry is checked separately with
157
+ * `isExpiredAt`, since it depends on the moment.
158
+ */
159
+ isPending() {
160
+ return __classPrivateFieldGet(this, _UserInvitation_consumedAt, "f").hasValue() === false && __classPrivateFieldGet(this, _UserInvitation_revokedAt, "f").hasValue() === false;
161
+ }
162
+ /**
163
+ * Whether the validity ended at the given moment (`DD/MM/YYYY HH:mm:ss`).
164
+ */
165
+ isExpiredAt(now) {
166
+ return __classPrivateFieldGet(this, _UserInvitation_expiresAt, "f").isReachedAt(UserInvitationEvaluatedAt_1.UserInvitationEvaluatedAt.create(now));
167
+ }
168
+ /**
169
+ * Returns the invitation accepted at `now`. Checked in this order: revoked
170
+ * (UserInvitationRevokedError), already consumed (UserInvitationAlreadyConsumedError) and
171
+ * expired (UserInvitationExpiredError).
172
+ */
173
+ consume(now) {
174
+ const evaluatedAt = UserInvitationEvaluatedAt_1.UserInvitationEvaluatedAt.create(now);
175
+ if (__classPrivateFieldGet(this, _UserInvitation_revokedAt, "f").hasValue()) {
176
+ throw UserInvitationRevokedError_1.UserInvitationRevokedError.create();
177
+ }
178
+ if (__classPrivateFieldGet(this, _UserInvitation_consumedAt, "f").hasValue()) {
179
+ throw UserInvitationAlreadyConsumedError_1.UserInvitationAlreadyConsumedError.create();
180
+ }
181
+ if (__classPrivateFieldGet(this, _UserInvitation_expiresAt, "f").isReachedAt(evaluatedAt)) {
182
+ throw UserInvitationExpiredError_1.UserInvitationExpiredError.create();
183
+ }
184
+ return UserInvitation.create({
185
+ ...__classPrivateFieldGet(this, _UserInvitation_instances, "m", _UserInvitation_toProps).call(this),
186
+ consumedAt: evaluatedAt.toPrimitives(),
187
+ });
188
+ }
189
+ /**
190
+ * Returns the invitation revoked at `now` (resending replaces the previous invitation).
191
+ * Revoking an already revoked invitation returns it unchanged; a consumed invitation cannot be
192
+ * revoked (UserInvitationAlreadyConsumedError).
193
+ */
194
+ revoke(now) {
195
+ const evaluatedAt = UserInvitationEvaluatedAt_1.UserInvitationEvaluatedAt.create(now);
196
+ if (__classPrivateFieldGet(this, _UserInvitation_consumedAt, "f").hasValue()) {
197
+ throw UserInvitationAlreadyConsumedError_1.UserInvitationAlreadyConsumedError.create();
198
+ }
199
+ if (__classPrivateFieldGet(this, _UserInvitation_revokedAt, "f").hasValue()) {
200
+ return this;
201
+ }
202
+ return UserInvitation.create({
203
+ ...__classPrivateFieldGet(this, _UserInvitation_instances, "m", _UserInvitation_toProps).call(this),
204
+ revokedAt: evaluatedAt.toPrimitives(),
205
+ });
206
+ }
207
+ }
208
+ exports.UserInvitation = UserInvitation;
209
+ _UserInvitation_userId = new WeakMap(), _UserInvitation_email = new WeakMap(), _UserInvitation_tokenHash = new WeakMap(), _UserInvitation_issuedAt = new WeakMap(), _UserInvitation_expiresAt = new WeakMap(), _UserInvitation_consumedAt = new WeakMap(), _UserInvitation_revokedAt = new WeakMap(), _UserInvitation_invitedByStakeholder = new WeakMap(), _UserInvitation_instances = new WeakSet(), _UserInvitation_toProps = function _UserInvitation_toProps() {
210
+ return {
211
+ id: this.id.toPrimitives(),
212
+ userId: __classPrivateFieldGet(this, _UserInvitation_userId, "f").toPrimitives(),
213
+ email: __classPrivateFieldGet(this, _UserInvitation_email, "f").toPrimitives(),
214
+ tokenHash: __classPrivateFieldGet(this, _UserInvitation_tokenHash, "f").toPrimitives(),
215
+ issuedAt: __classPrivateFieldGet(this, _UserInvitation_issuedAt, "f").toPrimitives(),
216
+ expiresAt: __classPrivateFieldGet(this, _UserInvitation_expiresAt, "f").toPrimitives(),
217
+ consumedAt: __classPrivateFieldGet(this, _UserInvitation_consumedAt, "f").toPrimitives(),
218
+ revokedAt: __classPrivateFieldGet(this, _UserInvitation_revokedAt, "f").toPrimitives(),
219
+ invitedByStakeholder: __classPrivateFieldGet(this, _UserInvitation_invitedByStakeholder, "f").toPrimitives(),
220
+ };
221
+ }, _UserInvitation_guardAgainstExpiryNotAfterIssue = function _UserInvitation_guardAgainstExpiryNotAfterIssue() {
222
+ if (__classPrivateFieldGet(this, _UserInvitation_expiresAt, "f").isAfter(__classPrivateFieldGet(this, _UserInvitation_issuedAt, "f")) === false) {
223
+ throw InvalidDateRangeError_1.InvalidDateRangeError.create(__classPrivateFieldGet(this, _UserInvitation_issuedAt, "f").toPrimitives(), __classPrivateFieldGet(this, _UserInvitation_expiresAt, "f").toPrimitives());
224
+ }
225
+ }, _UserInvitation_guardAgainstConsumedAndRevoked = function _UserInvitation_guardAgainstConsumedAndRevoked() {
226
+ if (__classPrivateFieldGet(this, _UserInvitation_consumedAt, "f").hasValue() && __classPrivateFieldGet(this, _UserInvitation_revokedAt, "f").hasValue()) {
227
+ throw InvalidPropertyValueError_1.InvalidPropertyValueError.create('revokedAt', 'null when the invitation was consumed', 'a revocation moment');
228
+ }
229
+ };
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationAlreadyConsumedError = void 0;
4
+ const CodedRootError_1 = require("../../../../shared/domain/exceptions/CodedRootError");
5
+ const ErrorCode_1 = require("../../../../shared/domain/enums/ErrorCode");
6
+ /**
7
+ * The invitation was already accepted; an invitation is single use.
8
+ * Raised on an anonymous flow: the message and context never identify the invitation, the user
9
+ * or the email (no account enumeration).
10
+ */
11
+ class UserInvitationAlreadyConsumedError extends CodedRootError_1.CodedRootError {
12
+ constructor() {
13
+ const technicalMessage = 'The invitation was already used and cannot be used again.';
14
+ const context = {
15
+ timestamp: new Date().toISOString(),
16
+ };
17
+ const suggestions = [
18
+ 'Sign in with the password you set when accepting the invitation',
19
+ 'Use the forgot password option if you do not remember it',
20
+ ];
21
+ super(ErrorCode_1.ErrorCode.USER_INVITATION_ALREADY_CONSUMED, technicalMessage, context, suggestions);
22
+ this.name = 'UserInvitationAlreadyConsumedError';
23
+ }
24
+ static create() {
25
+ return new UserInvitationAlreadyConsumedError();
26
+ }
27
+ logError() {
28
+ return `${this.name}: ${this.technicalMessage}`;
29
+ }
30
+ }
31
+ exports.UserInvitationAlreadyConsumedError = UserInvitationAlreadyConsumedError;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationExpiredError = void 0;
4
+ const CodedRootError_1 = require("../../../../shared/domain/exceptions/CodedRootError");
5
+ const ErrorCode_1 = require("../../../../shared/domain/enums/ErrorCode");
6
+ /**
7
+ * The invitation can no longer be accepted because its validity ended.
8
+ * Raised on an anonymous flow: the message and context never identify the invitation, the user
9
+ * or the email (no account enumeration).
10
+ */
11
+ class UserInvitationExpiredError extends CodedRootError_1.CodedRootError {
12
+ constructor() {
13
+ const technicalMessage = 'The invitation has expired and can no longer be accepted.';
14
+ const context = {
15
+ timestamp: new Date().toISOString(),
16
+ };
17
+ const suggestions = [
18
+ 'Ask the person who invited you to send a new invitation',
19
+ 'Use the most recent invitation email you received',
20
+ ];
21
+ super(ErrorCode_1.ErrorCode.USER_INVITATION_EXPIRED, technicalMessage, context, suggestions);
22
+ this.name = 'UserInvitationExpiredError';
23
+ }
24
+ static create() {
25
+ return new UserInvitationExpiredError();
26
+ }
27
+ logError() {
28
+ return `${this.name}: ${this.technicalMessage}`;
29
+ }
30
+ }
31
+ exports.UserInvitationExpiredError = UserInvitationExpiredError;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationRevokedError = void 0;
4
+ const CodedRootError_1 = require("../../../../shared/domain/exceptions/CodedRootError");
5
+ const ErrorCode_1 = require("../../../../shared/domain/enums/ErrorCode");
6
+ /**
7
+ * The invitation was revoked (for example, replaced by a newer one when it was resent).
8
+ * Raised on an anonymous flow: the message and context never identify the invitation, the user
9
+ * or the email (no account enumeration).
10
+ */
11
+ class UserInvitationRevokedError extends CodedRootError_1.CodedRootError {
12
+ constructor() {
13
+ const technicalMessage = 'The invitation is no longer valid.';
14
+ const context = {
15
+ timestamp: new Date().toISOString(),
16
+ };
17
+ const suggestions = [
18
+ 'Use the most recent invitation email you received',
19
+ 'Ask the person who invited you to send a new invitation',
20
+ ];
21
+ super(ErrorCode_1.ErrorCode.USER_INVITATION_REVOKED, technicalMessage, context, suggestions);
22
+ this.name = 'UserInvitationRevokedError';
23
+ }
24
+ static create() {
25
+ return new UserInvitationRevokedError();
26
+ }
27
+ logError() {
28
+ return `${this.name}: ${this.technicalMessage}`;
29
+ }
30
+ }
31
+ exports.UserInvitationRevokedError = UserInvitationRevokedError;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationConsumedAt = void 0;
4
+ const NullableDateTimeString_1 = require("../../../../shared/domain/value-objects/NullableDateTimeString");
5
+ class UserInvitationConsumedAt extends NullableDateTimeString_1.NullableDateTimeString {
6
+ constructor(value, skipDomainValidation) {
7
+ super(value, skipDomainValidation, UserInvitationConsumedAt.PROPERTY_NAME);
8
+ }
9
+ static create(value) {
10
+ return new UserInvitationConsumedAt(value, false);
11
+ }
12
+ static fromPrimitives(primitive) {
13
+ const value = primitive;
14
+ return new UserInvitationConsumedAt(value, true);
15
+ }
16
+ toPrimitives() {
17
+ return this.value;
18
+ }
19
+ }
20
+ exports.UserInvitationConsumedAt = UserInvitationConsumedAt;
21
+ UserInvitationConsumedAt.PROPERTY_NAME = 'consumedAt';
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationEmail = void 0;
4
+ const Email_1 = require("../../../../shared/domain/value-objects/Email");
5
+ class UserInvitationEmail extends Email_1.Email {
6
+ constructor(value, skipDomainValidation) {
7
+ super(value, skipDomainValidation, UserInvitationEmail.PROPERTY_NAME);
8
+ }
9
+ static create(value) {
10
+ Email_1.Email.guardAgainstEmptyValue(value, UserInvitationEmail.PROPERTY_NAME);
11
+ Email_1.Email.guardAgainstInvalidType(value, UserInvitationEmail.PROPERTY_NAME);
12
+ Email_1.Email.guardAgainstInvalidEmail(value, UserInvitationEmail.PROPERTY_NAME);
13
+ return new UserInvitationEmail(value, false);
14
+ }
15
+ static fromPrimitives(primitive) {
16
+ const value = primitive;
17
+ return new UserInvitationEmail(value, true);
18
+ }
19
+ toPrimitives() {
20
+ return this.value;
21
+ }
22
+ }
23
+ exports.UserInvitationEmail = UserInvitationEmail;
24
+ UserInvitationEmail.PROPERTY_NAME = 'email';
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationEvaluatedAt = void 0;
4
+ const DateTimeString_1 = require("../../../../shared/domain/value-objects/DateTimeString");
5
+ /**
6
+ * The moment at which an invitation is evaluated (accepted, revoked or checked for expiry).
7
+ * The domain does not read the clock: the caller passes the current moment and this value
8
+ * object validates its format.
9
+ */
10
+ class UserInvitationEvaluatedAt extends DateTimeString_1.DateTimeString {
11
+ constructor(value, skipDomainValidation) {
12
+ super(value, skipDomainValidation, UserInvitationEvaluatedAt.PROPERTY_NAME);
13
+ }
14
+ static create(value) {
15
+ DateTimeString_1.DateTimeString.guardAgainstEmptyValue(value, UserInvitationEvaluatedAt.PROPERTY_NAME);
16
+ DateTimeString_1.DateTimeString.guardAgainstInvalidType(value, UserInvitationEvaluatedAt.PROPERTY_NAME);
17
+ DateTimeString_1.DateTimeString.guardAgainstInvalidDateTimeFormat(value);
18
+ return new UserInvitationEvaluatedAt(value, false);
19
+ }
20
+ static fromPrimitives(primitive) {
21
+ const value = primitive;
22
+ return new UserInvitationEvaluatedAt(value, true);
23
+ }
24
+ toPrimitives() {
25
+ return this.value;
26
+ }
27
+ }
28
+ exports.UserInvitationEvaluatedAt = UserInvitationEvaluatedAt;
29
+ UserInvitationEvaluatedAt.PROPERTY_NAME = 'now';
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationExpiresAt = void 0;
4
+ const DateTimeString_1 = require("../../../../shared/domain/value-objects/DateTimeString");
5
+ class UserInvitationExpiresAt extends DateTimeString_1.DateTimeString {
6
+ constructor(value, skipDomainValidation) {
7
+ super(value, skipDomainValidation, UserInvitationExpiresAt.PROPERTY_NAME);
8
+ }
9
+ static create(value) {
10
+ DateTimeString_1.DateTimeString.guardAgainstEmptyValue(value, UserInvitationExpiresAt.PROPERTY_NAME);
11
+ DateTimeString_1.DateTimeString.guardAgainstInvalidType(value, UserInvitationExpiresAt.PROPERTY_NAME);
12
+ DateTimeString_1.DateTimeString.guardAgainstInvalidDateTimeFormat(value);
13
+ return new UserInvitationExpiresAt(value, false);
14
+ }
15
+ static fromPrimitives(primitive) {
16
+ const value = primitive;
17
+ return new UserInvitationExpiresAt(value, true);
18
+ }
19
+ /**
20
+ * Whether the expiry was reached at the given moment (`DD/MM/YYYY HH:mm:ss`).
21
+ * The expiry moment itself already counts as expired.
22
+ */
23
+ isReachedAt(moment) {
24
+ return moment.toDate().getTime() >= this.toDate().getTime();
25
+ }
26
+ /**
27
+ * Whether the expiry is strictly after the given moment (`DD/MM/YYYY HH:mm:ss`).
28
+ */
29
+ isAfter(moment) {
30
+ return this.toDate().getTime() > moment.toDate().getTime();
31
+ }
32
+ toPrimitives() {
33
+ return this.value;
34
+ }
35
+ }
36
+ exports.UserInvitationExpiresAt = UserInvitationExpiresAt;
37
+ UserInvitationExpiresAt.PROPERTY_NAME = 'expiresAt';
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserInvitationId = void 0;
4
+ const AggregateId_1 = require("../../../../shared/domain/value-objects/AggregateId");
5
+ const SemanticUuidPrefix_1 = require("../../../../shared/domain/enums/SemanticUuidPrefix");
6
+ const InvalidAggregatePrefixError_1 = require("../../../../shared/domain/exceptions/InvalidAggregatePrefixError");
7
+ /**
8
+ * Identity of a UserInvitation aggregate (`USR-INV_<id>`).
9
+ */
10
+ class UserInvitationId extends AggregateId_1.AggregateId {
11
+ constructor(value, skipDomainValidation) {
12
+ super(value, skipDomainValidation, UserInvitationId.PROPERTY_NAME);
13
+ }
14
+ static create(value) {
15
+ AggregateId_1.AggregateId.guardAgainstEmptyValue(value, UserInvitationId.PROPERTY_NAME);
16
+ AggregateId_1.AggregateId.guardAgainstInvalidType(value, UserInvitationId.PROPERTY_NAME);
17
+ AggregateId_1.AggregateId.guardAgainstInvalidId(value, UserInvitationId.PROPERTY_NAME);
18
+ // Validate that the prefix is valid for UserInvitation
19
+ UserInvitationId.guardAgainstInvalidPrefix(value);
20
+ return new UserInvitationId(value, false);
21
+ }
22
+ /**
23
+ * Validates that the id has the UserInvitation prefix.
24
+ * The id format was already validated, so the prefix can be extracted safely.
25
+ */
26
+ static guardAgainstInvalidPrefix(value) {
27
+ const prefix = new UserInvitationId(value, true).extractPrefix();
28
+ if (UserInvitationId.VALID_PREFIXES.includes(prefix) === false) {
29
+ throw InvalidAggregatePrefixError_1.InvalidAggregatePrefixError.create(value, 'UserInvitation', prefix, UserInvitationId.VALID_PREFIXES, UserInvitationId.PROPERTY_NAME);
30
+ }
31
+ }
32
+ static fromPrimitives(primitive) {
33
+ const value = primitive;
34
+ return new UserInvitationId(value, true);
35
+ }
36
+ toPrimitives() {
37
+ return this.value;
38
+ }
39
+ }
40
+ exports.UserInvitationId = UserInvitationId;
41
+ UserInvitationId.PROPERTY_NAME = 'id';
42
+ UserInvitationId.VALID_PREFIXES = [
43
+ SemanticUuidPrefix_1.SemanticUuidPrefix.USR_INVITATION,
44
+ ];