@carbonbox/domain 0.3.6 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/build/carbonbox/shared/domain/authorization/enums/Permission.js +1 -0
  2. package/build/carbonbox/shared/domain/authorization/value-objects/SecurityContext.js +12 -3
  3. package/build/carbonbox/shared/domain/entities/User.js +26 -144
  4. package/build/carbonbox/shared/domain/services/contracts/IDateTimeFormattingDomainService.js +2 -0
  5. package/build/carbonbox/shared/domain/services/implementations/DateTimeFormattingDomainService.js +280 -0
  6. package/build/carbonbox/shared/domain/value-objects/UserPermissions.js +284 -566
  7. package/build/carbonbox/stakeholders/carbon-clients/domain/entity/CarbonClient.js +3 -3
  8. package/build/carbonbox/stakeholders/carbon-clients/domain/value-objects/CarbonClientPermissions.js +3 -72
  9. package/build/carbonbox/stakeholders/carbon-coordinators/domain/entity/CarbonCoordinator.js +3 -3
  10. package/build/carbonbox/stakeholders/carbon-coordinators/domain/value-objects/CarbonCoordinatorPermissions.js +3 -72
  11. package/build/carbonbox/stakeholders/carbon-host/domain/entity/CarbonHost.js +4 -4
  12. package/build/carbonbox/stakeholders/carbon-host/domain/value-objects/CarbonHostPermissions.js +3 -65
  13. package/build/carbonbox/stakeholders/carbon-managers/domain/entity/CarbonManager.js +3 -3
  14. package/build/carbonbox/stakeholders/carbon-managers/domain/value-objects/CarbonManagerPermissions.js +3 -74
  15. package/build/carbonbox/stakeholders/shared/domain/entity/Stakeholder.js +2 -2
  16. package/build/main/index.js +1 -1
  17. package/build/types/carbonbox/shared/domain/authorization/enums/Permission.d.ts +2 -1
  18. package/build/types/carbonbox/shared/domain/authorization/enums/Permission.d.ts.map +1 -1
  19. package/build/types/carbonbox/shared/domain/authorization/value-objects/SecurityContext.d.ts.map +1 -1
  20. package/build/types/carbonbox/shared/domain/entities/IUser.d.ts +3 -0
  21. package/build/types/carbonbox/shared/domain/entities/IUser.d.ts.map +1 -1
  22. package/build/types/carbonbox/shared/domain/entities/User.d.ts +17 -1
  23. package/build/types/carbonbox/shared/domain/entities/User.d.ts.map +1 -1
  24. package/build/types/carbonbox/shared/domain/services/contracts/IDateTimeFormattingDomainService.d.ts +92 -0
  25. package/build/types/carbonbox/shared/domain/services/contracts/IDateTimeFormattingDomainService.d.ts.map +1 -0
  26. package/build/types/carbonbox/shared/domain/services/implementations/DateTimeFormattingDomainService.d.ts +105 -0
  27. package/build/types/carbonbox/shared/domain/services/implementations/DateTimeFormattingDomainService.d.ts.map +1 -0
  28. package/build/types/carbonbox/shared/domain/types/UserPrimitives.d.ts +2 -2
  29. package/build/types/carbonbox/shared/domain/types/UserPrimitives.d.ts.map +1 -1
  30. package/build/types/carbonbox/shared/domain/types/UserProps.d.ts +2 -2
  31. package/build/types/carbonbox/shared/domain/types/UserProps.d.ts.map +1 -1
  32. package/build/types/carbonbox/shared/domain/value-objects/UserPermissions.d.ts +26 -67
  33. package/build/types/carbonbox/shared/domain/value-objects/UserPermissions.d.ts.map +1 -1
  34. package/build/types/carbonbox/stakeholders/carbon-clients/domain/value-objects/CarbonClientPermissions.d.ts.map +1 -1
  35. package/build/types/carbonbox/stakeholders/carbon-coordinators/domain/value-objects/CarbonCoordinatorPermissions.d.ts.map +1 -1
  36. package/build/types/carbonbox/stakeholders/carbon-host/domain/entity/CarbonHost.d.ts.map +1 -1
  37. package/build/types/carbonbox/stakeholders/carbon-host/domain/value-objects/CarbonHostPermissions.d.ts.map +1 -1
  38. package/build/types/carbonbox/stakeholders/carbon-managers/domain/value-objects/CarbonManagerPermissions.d.ts.map +1 -1
  39. package/build/types/carbonbox/stakeholders/shared/domain/entity/Stakeholder.d.ts.map +1 -1
  40. package/build/types/main/index.d.ts +2 -3
  41. package/build/types/main/index.d.ts.map +1 -1
  42. package/package.json +1 -1
@@ -74,4 +74,5 @@ var Permission;
74
74
  Permission["CAN_MANAGE_CARBON_HOSTS"] = "CAN_MANAGE_CARBON_HOSTS";
75
75
  Permission["CAN_VIEW_STAKEHOLDER_HIERARCHY"] = "CAN_VIEW_STAKEHOLDER_HIERARCHY";
76
76
  Permission["CAN_ASSIGN_STAKEHOLDER_ROLES"] = "CAN_ASSIGN_STAKEHOLDER_ROLES";
77
+ Permission["CAN_MANAGE_STAKEHOLDER_ROLES"] = "CAN_MANAGE_STAKEHOLDER_ROLES";
77
78
  })(Permission || (exports.Permission = Permission = {}));
@@ -16,7 +16,7 @@ exports.SecurityContext = void 0;
16
16
  const InvalidPropertyTypeError_1 = require("../../exceptions/InvalidPropertyTypeError");
17
17
  const SecurityContextReconstructionError_1 = require("../../exceptions/SecurityContextReconstructionError");
18
18
  const ObjectValueObject_1 = require("../../value-objects/ObjectValueObject");
19
- const DateTimeFormattingDomainService_1 = require("../../services/DateTimeFormattingDomainService");
19
+ const DateTimeFormattingDomainService_1 = require("../../services/implementations/DateTimeFormattingDomainService");
20
20
  class SecurityContext extends ObjectValueObject_1.ObjectValueObject {
21
21
  constructor(value, skipDomainValidation) {
22
22
  const primitives = {
@@ -62,11 +62,15 @@ class SecurityContext extends ObjectValueObject_1.ObjectValueObject {
62
62
  return __classPrivateFieldGet(this, _SecurityContext_environment, "f");
63
63
  }
64
64
  static fromUser(user, resource = null) {
65
+ // Use instance methods that handle Either pattern
66
+ const service = DateTimeFormattingDomainService_1.DateTimeFormattingDomainService.create();
67
+ const currentDateTimeResult = service.getCurrentDateTimeString();
68
+ const timestamp = currentDateTimeResult.fold(() => { throw new Error('Failed to get current datetime string'); }, (dateTimeString) => dateTimeString);
65
69
  return SecurityContext.create({
66
70
  user,
67
71
  resource,
68
72
  environment: {
69
- timestamp: DateTimeFormattingDomainService_1.DateTimeFormattingDomainService.getCurrentDateTimeString(),
73
+ timestamp,
70
74
  ipAddress: null,
71
75
  },
72
76
  });
@@ -98,7 +102,12 @@ _SecurityContext_user = new WeakMap(), _SecurityContext_resource = new WeakMap()
98
102
  if (typeof environment.timestamp !== 'string') {
99
103
  throw InvalidPropertyTypeError_1.InvalidPropertyTypeError.create('securityContext.environment.timestamp', 'string', typeof environment.timestamp);
100
104
  }
101
- if (!DateTimeFormattingDomainService_1.DateTimeFormattingDomainService.isValidDateTime(environment.timestamp)) {
105
+ // Use static methods that handle Either pattern internally
106
+ const service = DateTimeFormattingDomainService_1.DateTimeFormattingDomainService.create();
107
+ const isValidResult = service.isValidDateTime(environment.timestamp);
108
+ const isValid = isValidResult.fold(() => false, // Left case: error, consider invalid
109
+ (valid) => valid);
110
+ if (isValid === false) {
102
111
  throw InvalidPropertyTypeError_1.InvalidPropertyTypeError.create('securityContext.environment.timestamp', 'valid datetime format (DD/MM/YYYY HH:mm:ss)', environment.timestamp);
103
112
  }
104
113
  };
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
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
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _User_instances, _User_displayName, _User_avatar, _User_email, _User_password, _User_businessStatus, _User_userType, _User_lastAccessAt, _User_permissions, _User_mapPermissionToBoolean;
13
+ var _User_displayName, _User_avatar, _User_email, _User_password, _User_businessStatus, _User_userType, _User_lastAccessAt, _User_permissions;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.User = void 0;
16
16
  const UserAvatar_1 = require("../value-objects/UserAvatar");
@@ -22,7 +22,6 @@ const UserLastAccessAt_1 = require("../value-objects/UserLastAccessAt");
22
22
  const UserPassword_1 = require("../value-objects/UserPassword");
23
23
  const UserType_1 = require("../value-objects/UserType");
24
24
  const AggregateRoot_1 = require("./AggregateRoot");
25
- const Permission_1 = require("../authorization/enums/Permission");
26
25
  const UserPermissions_1 = require("../value-objects/UserPermissions");
27
26
  class User extends AggregateRoot_1.AggregateRoot {
28
27
  constructor(props, skipDomainValidation) {
@@ -30,7 +29,6 @@ class User extends AggregateRoot_1.AggregateRoot {
30
29
  ? UserId_1.UserId.fromPrimitives(props.id).toPrimitives()
31
30
  : UserId_1.UserId.create(props.id).toPrimitives();
32
31
  super({ id }, skipDomainValidation);
33
- _User_instances.add(this);
34
32
  _User_displayName.set(this, void 0);
35
33
  _User_avatar.set(this, void 0);
36
34
  _User_email.set(this, void 0);
@@ -88,151 +86,35 @@ class User extends AggregateRoot_1.AggregateRoot {
88
86
  }
89
87
  /**
90
88
  * Verifica si el usuario tiene un permiso específico.
91
- * Mapea los enum Permission a las propiedades boolean del sistema existente.
92
89
  * @param permission - El permiso a verificar
93
90
  * @returns true si el usuario tiene el permiso, false en caso contrario
94
91
  */
95
92
  hasPermission(permission) {
96
- return __classPrivateFieldGet(this, _User_instances, "m", _User_mapPermissionToBoolean).call(this, permission);
93
+ return __classPrivateFieldGet(this, _User_permissions, "f").hasPermission(permission);
94
+ }
95
+ /**
96
+ * Verifica si el usuario tiene alguno de los permisos especificados.
97
+ * @param permissions - Array de permisos a verificar
98
+ * @returns true si el usuario tiene al menos uno de los permisos, false en caso contrario
99
+ */
100
+ hasAnyPermission(permissions) {
101
+ return __classPrivateFieldGet(this, _User_permissions, "f").hasAnyPermission(permissions);
102
+ }
103
+ /**
104
+ * Verifica si el usuario tiene todos los permisos especificados.
105
+ * @param permissions - Array de permisos a verificar
106
+ * @returns true si el usuario tiene todos los permisos, false en caso contrario
107
+ */
108
+ hasAllPermissions(permissions) {
109
+ return __classPrivateFieldGet(this, _User_permissions, "f").hasAllPermissions(permissions);
110
+ }
111
+ /**
112
+ * Obtiene todos los permisos del usuario como array de enums.
113
+ * @returns Array de permisos del usuario
114
+ */
115
+ getAllPermissions() {
116
+ return __classPrivateFieldGet(this, _User_permissions, "f").getAllPermissions();
97
117
  }
98
118
  }
99
119
  exports.User = User;
100
- _User_displayName = new WeakMap(), _User_avatar = new WeakMap(), _User_email = new WeakMap(), _User_password = new WeakMap(), _User_businessStatus = new WeakMap(), _User_userType = new WeakMap(), _User_lastAccessAt = new WeakMap(), _User_permissions = new WeakMap(), _User_instances = new WeakSet(), _User_mapPermissionToBoolean = function _User_mapPermissionToBoolean(permission) {
101
- const permissions = __classPrivateFieldGet(this, _User_permissions, "f");
102
- switch (permission) {
103
- // System Administration
104
- case Permission_1.Permission.CAN_ACCESS_ALL_MODULES:
105
- return permissions.canAccessAllModules ?? false;
106
- case Permission_1.Permission.CAN_MANAGE_SYSTEM_CONFIGURATION:
107
- return permissions.canManageSystemConfiguration ?? false;
108
- // User Management
109
- case Permission_1.Permission.CAN_MANAGE_ALL_USERS:
110
- return permissions.canManageAllUsers ?? false;
111
- case Permission_1.Permission.CAN_MANAGE_COMPANIES:
112
- return permissions.canManageCompanies ?? false;
113
- case Permission_1.Permission.CAN_ASSIGN_HOST_MANAGERS:
114
- return permissions.canAssignHostManagers ?? false;
115
- case Permission_1.Permission.CAN_ASSIGN_COORDINATORS:
116
- return permissions.canAssignCoordinators ?? false;
117
- case Permission_1.Permission.CAN_ASSIGN_COMPANIES_TO_HOST_MANAGERS:
118
- return permissions.canAssignCompaniesToHostManagers ?? false;
119
- case Permission_1.Permission.CAN_ASSIGN_COMPANIES_TO_COORDINATORS:
120
- return permissions.canAssignCompaniesToCoordinators ?? false;
121
- // Carbon Footprint Configuration
122
- case Permission_1.Permission.CAN_MANAGE_CORPORATE_CARBON_FOOTPRINT_CONFIGURATIONS:
123
- return permissions.canManageCorporateCarbonFootprintConfigurations ?? false;
124
- case Permission_1.Permission.CAN_MANAGE_CORPORATE_SEGMENT_CONFIGURATIONS:
125
- return permissions.canManageCorporateSegmentConfigurations ?? false;
126
- case Permission_1.Permission.CAN_MANAGE_EVENT_CARBON_FOOTPRINT_CONFIGURATIONS:
127
- return permissions.canManageEventCarbonFootprintConfigurations ?? false;
128
- case Permission_1.Permission.CAN_MANAGE_EVENT_LIFECYCLE_STAGE_CONFIGURATIONS:
129
- return permissions.canManageEventLifecycleStageConfigurations ?? false;
130
- case Permission_1.Permission.CAN_MANAGE_PRODUCT_CARBON_FOOTPRINT_CONFIGURATIONS:
131
- return permissions.canManageProductCarbonFootprintConfigurations ?? false;
132
- case Permission_1.Permission.CAN_MANAGE_PRODUCT_SEGMENT_CONFIGURATIONS:
133
- return permissions.canManageProductSegmentConfigurations ?? false;
134
- case Permission_1.Permission.CAN_MANAGE_PRODUCT_SYSTEM_BOUNDARIES:
135
- return permissions.canManageProductSystemBoundaries ?? false;
136
- case Permission_1.Permission.CAN_MANAGE_INTENSITY_INDICATORS:
137
- return permissions.canManageIntensityIndicators ?? false;
138
- // Activity Data Collection
139
- case Permission_1.Permission.CAN_MANAGE_COLLECTION_FIELDS:
140
- return permissions.canManageCollectionFields ?? false;
141
- case Permission_1.Permission.CAN_MANAGE_DYNAMIC_FORMS:
142
- return permissions.canManageDynamicForms ?? false;
143
- case Permission_1.Permission.CAN_MANAGE_CONDITIONAL_LOGIC:
144
- return permissions.canManageConditionalLogic ?? false;
145
- case Permission_1.Permission.CAN_MANAGE_CONTEXTUAL_LABELS:
146
- return permissions.canManageContextualLabels ?? false;
147
- case Permission_1.Permission.CAN_MANAGE_STAKEHOLDER_ADAPTATIONS:
148
- return permissions.canManageStakeholderAdaptations ?? false;
149
- case Permission_1.Permission.CAN_MANAGE_ACTIVITY_DATA_SUBMISSIONS:
150
- return permissions.canManageActivityDataSubmissions ?? false;
151
- case Permission_1.Permission.CAN_APPROVE_ACTIVITY_DATA_SUBMISSIONS:
152
- return permissions.canApproveActivityDataSubmissions ?? false;
153
- case Permission_1.Permission.CAN_REJECT_ACTIVITY_DATA_SUBMISSIONS:
154
- return permissions.canRejectActivityDataSubmissions ?? false;
155
- // Emission Calculation Formula
156
- case Permission_1.Permission.CAN_MANAGE_FORMULAS:
157
- return permissions.canManageFormulas ?? false;
158
- case Permission_1.Permission.CAN_MANAGE_EMISSION_FACTORS:
159
- return permissions.canManageEmissionFactors ?? false;
160
- case Permission_1.Permission.CAN_MANAGE_CALCULATION_VARIABLES:
161
- return permissions.canManageCalculationVariables ?? false;
162
- case Permission_1.Permission.CAN_MANAGE_CONSTANTS:
163
- return permissions.canManageConstants ?? false;
164
- case Permission_1.Permission.CAN_MANAGE_GLOBAL_WARMING_POTENTIALS:
165
- return permissions.canManageGlobalWarmingPotentials ?? false;
166
- // Emission Calculation Process
167
- case Permission_1.Permission.CAN_MANAGE_CALCULATION_PROCESSES:
168
- return permissions.canManageCalculationProcesses ?? false;
169
- case Permission_1.Permission.CAN_MANAGE_CALCULATION_WORKFLOWS:
170
- return permissions.canManageCalculationWorkflows ?? false;
171
- case Permission_1.Permission.CAN_MANAGE_CALCULATION_JOBS:
172
- return permissions.canManageCalculationJobs ?? false;
173
- case Permission_1.Permission.CAN_EXECUTE_CALCULATION_JOBS:
174
- return permissions.canExecuteCalculationJobs ?? false;
175
- case Permission_1.Permission.CAN_MONITOR_CALCULATION_PROCESSES:
176
- return permissions.canMonitorCalculationProcesses ?? false;
177
- case Permission_1.Permission.CAN_CANCEL_CALCULATION_JOBS:
178
- return permissions.canCancelCalculationJobs ?? false;
179
- case Permission_1.Permission.CAN_RETRY_FAILED_CALCULATIONS:
180
- return permissions.canRetryFailedCalculations ?? false;
181
- // Emission Calculation Results
182
- case Permission_1.Permission.CAN_VIEW_EMISSION_CALCULATION_RESULTS:
183
- return permissions.canViewEmissionCalculationResults ?? false;
184
- case Permission_1.Permission.CAN_MANAGE_EMISSION_CALCULATION_RESULTS:
185
- return permissions.canManageEmissionCalculationResults ?? false;
186
- case Permission_1.Permission.CAN_VIEW_EMISSION_AGGREGATIONS:
187
- return permissions.canViewEmissionAggregations ?? false;
188
- case Permission_1.Permission.CAN_MANAGE_EMISSION_AGGREGATIONS:
189
- return permissions.canManageEmissionAggregations ?? false;
190
- case Permission_1.Permission.CAN_VIEW_GHG_EMISSION_RESULTS:
191
- return permissions.canViewGHGEmissionResults ?? false;
192
- case Permission_1.Permission.CAN_MANAGE_GHG_EMISSION_RESULTS:
193
- return permissions.canManageGHGEmissionResults ?? false;
194
- case Permission_1.Permission.CAN_EXPORT_CALCULATION_RESULTS:
195
- return permissions.canExportCalculationResults ?? false;
196
- case Permission_1.Permission.CAN_GENERATE_EMISSION_REPORTS:
197
- return permissions.canGenerateEmissionReports ?? false;
198
- // Company Resources
199
- case Permission_1.Permission.CAN_MANAGE_EVENTS:
200
- return permissions.canManageEvents ?? false;
201
- case Permission_1.Permission.CAN_MANAGE_EVENT_EDITIONS:
202
- return permissions.canManageEventEditions ?? false;
203
- case Permission_1.Permission.CAN_MANAGE_FACILITIES:
204
- return permissions.canManageFacilities ?? false;
205
- case Permission_1.Permission.CAN_MANAGE_PRODUCTS:
206
- return permissions.canManageProducts ?? false;
207
- case Permission_1.Permission.CAN_VIEW_COMPANY_RESOURCES:
208
- return permissions.canViewCompanyResources ?? false;
209
- // Purchase Management
210
- case Permission_1.Permission.CAN_VIEW_PURCHASES:
211
- return permissions.canViewPurchases ?? false;
212
- case Permission_1.Permission.CAN_CREATE_PURCHASE_ORDERS:
213
- return permissions.canCreatePurchaseOrders ?? false;
214
- case Permission_1.Permission.CAN_UPDATE_PURCHASE_ORDERS:
215
- return permissions.canUpdatePurchaseOrders ?? false;
216
- case Permission_1.Permission.CAN_DELETE_PURCHASE_ORDERS:
217
- return permissions.canDeletePurchaseOrders ?? false;
218
- case Permission_1.Permission.CAN_MANAGE_PURCHASE_CONTRACTS:
219
- return permissions.canManagePurchaseContracts ?? false;
220
- case Permission_1.Permission.CAN_CONFIGURE_SERVICE_PRICING:
221
- return permissions.canConfigureServicePricing ?? false;
222
- // Stakeholder Management
223
- case Permission_1.Permission.CAN_MANAGE_CARBON_CLIENTS:
224
- return permissions.canManageCarbonClients ?? false;
225
- case Permission_1.Permission.CAN_MANAGE_CARBON_COORDINATORS:
226
- return permissions.canManageCarbonCoordinators ?? false;
227
- case Permission_1.Permission.CAN_MANAGE_CARBON_MANAGERS:
228
- return permissions.canManageCarbonManagers ?? false;
229
- case Permission_1.Permission.CAN_MANAGE_CARBON_HOSTS:
230
- return permissions.canManageCarbonHosts ?? false;
231
- case Permission_1.Permission.CAN_VIEW_STAKEHOLDER_HIERARCHY:
232
- return permissions.canViewStakeholderHierarchy ?? false;
233
- case Permission_1.Permission.CAN_ASSIGN_STAKEHOLDER_ROLES:
234
- return permissions.canAssignStakeholderRoles ?? false;
235
- default:
236
- return false;
237
- }
238
- };
120
+ _User_displayName = new WeakMap(), _User_avatar = new WeakMap(), _User_email = new WeakMap(), _User_password = new WeakMap(), _User_businessStatus = new WeakMap(), _User_userType = new WeakMap(), _User_lastAccessAt = new WeakMap(), _User_permissions = new WeakMap();
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DateTimeFormattingDomainService = void 0;
4
+ const either_1 = require("../../../either");
5
+ const InvalidDateFormatError_1 = require("../../exceptions/InvalidDateFormatError");
6
+ const DateString_1 = require("../../value-objects/DateString");
7
+ const DateTimeString_1 = require("../../value-objects/DateTimeString");
8
+ /**
9
+ * Domain Service for date and datetime formatting and validation operations.
10
+ * Provides centralized business logic for date/datetime handling across the domain.
11
+ * Refactored to support dependency injection and Either pattern for error handling.
12
+ */
13
+ class DateTimeFormattingDomainService {
14
+ constructor() {
15
+ this.DATE_REGEX = /^([0-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/\d{4}$/;
16
+ this.DATETIME_REGEX = /^([0-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/\d{4} ([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/;
17
+ // Private constructor to enforce factory pattern
18
+ }
19
+ static create() {
20
+ return new DateTimeFormattingDomainService();
21
+ }
22
+ /**
23
+ * Validates if a date string has the correct format (DD/MM/YYYY)
24
+ * @param dateValue The date string to validate
25
+ * @returns Either with validation result or error
26
+ */
27
+ isValidDateFormat(dateValue) {
28
+ return either_1.EitherFactory.fromTryCatch(() => {
29
+ if (typeof dateValue !== 'string') {
30
+ throw InvalidDateFormatError_1.InvalidDateFormatError.create(dateValue, this.getDateFormat());
31
+ }
32
+ return this.DATE_REGEX.test(dateValue);
33
+ }, (error) => {
34
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
35
+ return error;
36
+ }
37
+ return InvalidDateFormatError_1.InvalidDateFormatError.create(dateValue, this.getDateFormat());
38
+ });
39
+ }
40
+ /**
41
+ * Validates if a datetime string has the correct format (DD/MM/YYYY HH:mm:ss)
42
+ * @param dateTimeValue The datetime string to validate
43
+ * @returns Either with validation result or error
44
+ */
45
+ isValidDateTimeFormat(dateTimeValue) {
46
+ return either_1.EitherFactory.fromTryCatch(() => {
47
+ if (typeof dateTimeValue !== 'string') {
48
+ throw InvalidDateFormatError_1.InvalidDateFormatError.create(dateTimeValue, this.getDateTimeFormat());
49
+ }
50
+ return this.DATETIME_REGEX.test(dateTimeValue);
51
+ }, (error) => {
52
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
53
+ return error;
54
+ }
55
+ return InvalidDateFormatError_1.InvalidDateFormatError.create(dateTimeValue, this.getDateTimeFormat());
56
+ });
57
+ }
58
+ /**
59
+ * Formats a Date object to a date string (DD/MM/YYYY)
60
+ * @param date The Date object to format
61
+ * @returns Either with formatted date string or error
62
+ */
63
+ formatDateToString(date) {
64
+ return either_1.EitherFactory.fromTryCatch(() => {
65
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
66
+ throw InvalidDateFormatError_1.InvalidDateFormatError.create('Invalid Date object', this.getDateFormat());
67
+ }
68
+ const day = String(date.getDate()).padStart(2, '0');
69
+ const month = String(date.getMonth() + 1).padStart(2, '0');
70
+ const year = date.getFullYear();
71
+ return `${day}/${month}/${year}`;
72
+ }, (error) => {
73
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
74
+ return error;
75
+ }
76
+ return InvalidDateFormatError_1.InvalidDateFormatError.create('Failed to format date', this.getDateFormat());
77
+ });
78
+ }
79
+ /**
80
+ * Formats a Date object to a datetime string (DD/MM/YYYY HH:mm:ss)
81
+ * @param date The Date object to format
82
+ * @returns Either with formatted datetime string or error
83
+ */
84
+ formatDateTimeToString(date) {
85
+ return either_1.EitherFactory.fromTryCatch(() => {
86
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
87
+ throw InvalidDateFormatError_1.InvalidDateFormatError.create('Invalid Date object', this.getDateTimeFormat());
88
+ }
89
+ const day = String(date.getDate()).padStart(2, '0');
90
+ const month = String(date.getMonth() + 1).padStart(2, '0');
91
+ const year = date.getFullYear();
92
+ const hours = String(date.getHours()).padStart(2, '0');
93
+ const minutes = String(date.getMinutes()).padStart(2, '0');
94
+ const seconds = String(date.getSeconds()).padStart(2, '0');
95
+ return `${day}/${month}/${year} ${hours}:${minutes}:${seconds}`;
96
+ }, (error) => {
97
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
98
+ return error;
99
+ }
100
+ return InvalidDateFormatError_1.InvalidDateFormatError.create('Failed to format datetime', this.getDateTimeFormat());
101
+ });
102
+ }
103
+ /**
104
+ * Gets the current date formatted as a string (DD/MM/YYYY)
105
+ * @returns Either with current date string or error
106
+ */
107
+ getCurrentDateString() {
108
+ return this.formatDateToString(new Date());
109
+ }
110
+ /**
111
+ * Gets the current datetime formatted as a string (DD/MM/YYYY HH:mm:ss)
112
+ * @returns Either with current datetime string or error
113
+ */
114
+ getCurrentDateTimeString() {
115
+ return this.formatDateTimeToString(new Date());
116
+ }
117
+ /**
118
+ * Parses a date string (DD/MM/YYYY) to a Date object
119
+ * @param dateString The date string to parse
120
+ * @returns Either with parsed Date object or error
121
+ */
122
+ parseDateString(dateString) {
123
+ return either_1.EitherFactory.fromTryCatch(() => {
124
+ const isValidResult = this.isValidDateFormat(dateString);
125
+ const isValid = isValidResult.fold((error) => { throw error; }, (valid) => valid);
126
+ if (isValid === false) {
127
+ throw InvalidDateFormatError_1.InvalidDateFormatError.create(dateString, this.getDateFormat());
128
+ }
129
+ const [day, month, year] = dateString.split('/').map(Number);
130
+ return new Date(year, month - 1, day);
131
+ }, (error) => {
132
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
133
+ return error;
134
+ }
135
+ return InvalidDateFormatError_1.InvalidDateFormatError.create(dateString, this.getDateFormat());
136
+ });
137
+ }
138
+ /**
139
+ * Parses a datetime string (DD/MM/YYYY HH:mm:ss) to a Date object
140
+ * @param dateTimeString The datetime string to parse
141
+ * @returns Either with parsed Date object or error
142
+ */
143
+ parseDateTimeString(dateTimeString) {
144
+ return either_1.EitherFactory.fromTryCatch(() => {
145
+ const isValidResult = this.isValidDateTimeFormat(dateTimeString);
146
+ const isValid = isValidResult.fold((error) => { throw error; }, (valid) => valid);
147
+ if (isValid === false) {
148
+ throw InvalidDateFormatError_1.InvalidDateFormatError.create(dateTimeString, this.getDateTimeFormat());
149
+ }
150
+ const [datePart, timePart] = dateTimeString.split(' ');
151
+ const [day, month, year] = datePart.split('/').map(Number);
152
+ const [hours, minutes, seconds] = timePart.split(':').map(Number);
153
+ return new Date(year, month - 1, day, hours, minutes, seconds);
154
+ }, (error) => {
155
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
156
+ return error;
157
+ }
158
+ return InvalidDateFormatError_1.InvalidDateFormatError.create(dateTimeString, this.getDateTimeFormat());
159
+ });
160
+ }
161
+ /**
162
+ * Validates if a date string represents a valid calendar date
163
+ * @param dateString The date string to validate
164
+ * @returns Either with validation result or error
165
+ */
166
+ isValidDate(dateString) {
167
+ return either_1.EitherFactory.fromTryCatch(() => {
168
+ const isValidFormatResult = this.isValidDateFormat(dateString);
169
+ const isValidFormat = isValidFormatResult.fold(() => false, (valid) => valid);
170
+ if (isValidFormat === false) {
171
+ return false;
172
+ }
173
+ const dateResult = this.parseDateString(dateString);
174
+ const date = dateResult.fold((error) => { throw error; }, (parsedDate) => parsedDate);
175
+ const reformattedResult = this.formatDateToString(date);
176
+ const reformattedDate = reformattedResult.fold((error) => { throw error; }, (formatted) => formatted);
177
+ return reformattedDate === dateString;
178
+ }, (error) => {
179
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
180
+ return error;
181
+ }
182
+ return InvalidDateFormatError_1.InvalidDateFormatError.create(dateString, this.getDateFormat());
183
+ });
184
+ }
185
+ /**
186
+ * Validates if a datetime string represents a valid calendar datetime
187
+ * @param dateTimeString The datetime string to validate
188
+ * @returns Either with validation result or error
189
+ */
190
+ isValidDateTime(dateTimeString) {
191
+ return either_1.EitherFactory.fromTryCatch(() => {
192
+ const isValidFormatResult = this.isValidDateTimeFormat(dateTimeString);
193
+ const isValidFormat = isValidFormatResult.fold(() => false, (valid) => valid);
194
+ if (isValidFormat === false) {
195
+ return false;
196
+ }
197
+ const dateResult = this.parseDateTimeString(dateTimeString);
198
+ const date = dateResult.fold((error) => { throw error; }, (parsedDate) => parsedDate);
199
+ const reformattedResult = this.formatDateTimeToString(date);
200
+ const reformattedDateTime = reformattedResult.fold((error) => { throw error; }, (formatted) => formatted);
201
+ return reformattedDateTime === dateTimeString;
202
+ }, (error) => {
203
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
204
+ return error;
205
+ }
206
+ return InvalidDateFormatError_1.InvalidDateFormatError.create(dateTimeString, this.getDateTimeFormat());
207
+ });
208
+ }
209
+ /**
210
+ * Compares two date strings
211
+ * @param dateString1 First date string
212
+ * @param dateString2 Second date string
213
+ * @returns Either with comparison result (negative if first is earlier, positive if later, 0 if equal) or error
214
+ */
215
+ compareDates(dateString1, dateString2) {
216
+ return either_1.EitherFactory.fromTryCatch(() => {
217
+ const date1Result = this.parseDateString(dateString1);
218
+ const date1 = date1Result.fold((error) => { throw error; }, (date) => date);
219
+ const date2Result = this.parseDateString(dateString2);
220
+ const date2 = date2Result.fold((error) => { throw error; }, (date) => date);
221
+ return date1.getTime() - date2.getTime();
222
+ }, (error) => {
223
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
224
+ return error;
225
+ }
226
+ return InvalidDateFormatError_1.InvalidDateFormatError.create('Failed to compare dates', this.getDateFormat());
227
+ });
228
+ }
229
+ /**
230
+ * Compares two datetime strings
231
+ * @param dateTimeString1 First datetime string
232
+ * @param dateTimeString2 Second datetime string
233
+ * @returns Either with comparison result (negative if first is earlier, positive if later, 0 if equal) or error
234
+ */
235
+ compareDateTimes(dateTimeString1, dateTimeString2) {
236
+ return either_1.EitherFactory.fromTryCatch(() => {
237
+ const date1Result = this.parseDateTimeString(dateTimeString1);
238
+ const date1 = date1Result.fold((error) => { throw error; }, (date) => date);
239
+ const date2Result = this.parseDateTimeString(dateTimeString2);
240
+ const date2 = date2Result.fold((error) => { throw error; }, (date) => date);
241
+ return date1.getTime() - date2.getTime();
242
+ }, (error) => {
243
+ if (error instanceof InvalidDateFormatError_1.InvalidDateFormatError) {
244
+ return error;
245
+ }
246
+ return InvalidDateFormatError_1.InvalidDateFormatError.create('Failed to compare datetimes', this.getDateTimeFormat());
247
+ });
248
+ }
249
+ /**
250
+ * Gets the supported date format string
251
+ * @returns The date format string
252
+ */
253
+ getDateFormat() {
254
+ return DateString_1.DateString.getDateFormat();
255
+ }
256
+ /**
257
+ * Gets the supported datetime format string
258
+ * @returns The datetime format string
259
+ */
260
+ getDateTimeFormat() {
261
+ return DateTimeString_1.DateTimeString.getDateTimeFormat();
262
+ }
263
+ // ===== DEPRECATED STATIC METHODS - FOR BACKWARD COMPATIBILITY =====
264
+ // These will be removed in future versions. Use instance methods instead.
265
+ /**
266
+ * @deprecated Use instance method instead
267
+ */
268
+ static getCurrentDateString() {
269
+ const service = DateTimeFormattingDomainService.create();
270
+ return service.getCurrentDateString().fold((error) => { throw error; }, (dateString) => dateString);
271
+ }
272
+ /**
273
+ * @deprecated Use instance method instead
274
+ */
275
+ static formatDateToString(date) {
276
+ const service = DateTimeFormattingDomainService.create();
277
+ return service.formatDateToString(date).fold((error) => { throw error; }, (dateString) => dateString);
278
+ }
279
+ }
280
+ exports.DateTimeFormattingDomainService = DateTimeFormattingDomainService;