@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.
- package/build/carbonbox/shared/domain/authorization/enums/Permission.js +1 -0
- package/build/carbonbox/shared/domain/authorization/value-objects/SecurityContext.js +12 -3
- package/build/carbonbox/shared/domain/entities/User.js +26 -144
- package/build/carbonbox/shared/domain/services/contracts/IDateTimeFormattingDomainService.js +2 -0
- package/build/carbonbox/shared/domain/services/implementations/DateTimeFormattingDomainService.js +280 -0
- package/build/carbonbox/shared/domain/value-objects/UserPermissions.js +284 -566
- package/build/carbonbox/stakeholders/carbon-clients/domain/entity/CarbonClient.js +3 -3
- package/build/carbonbox/stakeholders/carbon-clients/domain/value-objects/CarbonClientPermissions.js +3 -72
- package/build/carbonbox/stakeholders/carbon-coordinators/domain/entity/CarbonCoordinator.js +3 -3
- package/build/carbonbox/stakeholders/carbon-coordinators/domain/value-objects/CarbonCoordinatorPermissions.js +3 -72
- package/build/carbonbox/stakeholders/carbon-host/domain/entity/CarbonHost.js +4 -4
- package/build/carbonbox/stakeholders/carbon-host/domain/value-objects/CarbonHostPermissions.js +3 -65
- package/build/carbonbox/stakeholders/carbon-managers/domain/entity/CarbonManager.js +3 -3
- package/build/carbonbox/stakeholders/carbon-managers/domain/value-objects/CarbonManagerPermissions.js +3 -74
- package/build/carbonbox/stakeholders/shared/domain/entity/Stakeholder.js +2 -2
- package/build/main/index.js +1 -1
- package/build/types/carbonbox/shared/domain/authorization/enums/Permission.d.ts +2 -1
- package/build/types/carbonbox/shared/domain/authorization/enums/Permission.d.ts.map +1 -1
- package/build/types/carbonbox/shared/domain/authorization/value-objects/SecurityContext.d.ts.map +1 -1
- package/build/types/carbonbox/shared/domain/entities/IUser.d.ts +3 -0
- package/build/types/carbonbox/shared/domain/entities/IUser.d.ts.map +1 -1
- package/build/types/carbonbox/shared/domain/entities/User.d.ts +17 -1
- package/build/types/carbonbox/shared/domain/entities/User.d.ts.map +1 -1
- package/build/types/carbonbox/shared/domain/services/contracts/IDateTimeFormattingDomainService.d.ts +92 -0
- package/build/types/carbonbox/shared/domain/services/contracts/IDateTimeFormattingDomainService.d.ts.map +1 -0
- package/build/types/carbonbox/shared/domain/services/implementations/DateTimeFormattingDomainService.d.ts +105 -0
- package/build/types/carbonbox/shared/domain/services/implementations/DateTimeFormattingDomainService.d.ts.map +1 -0
- package/build/types/carbonbox/shared/domain/types/UserPrimitives.d.ts +2 -2
- package/build/types/carbonbox/shared/domain/types/UserPrimitives.d.ts.map +1 -1
- package/build/types/carbonbox/shared/domain/types/UserProps.d.ts +2 -2
- package/build/types/carbonbox/shared/domain/types/UserProps.d.ts.map +1 -1
- package/build/types/carbonbox/shared/domain/value-objects/UserPermissions.d.ts +26 -67
- package/build/types/carbonbox/shared/domain/value-objects/UserPermissions.d.ts.map +1 -1
- package/build/types/carbonbox/stakeholders/carbon-clients/domain/value-objects/CarbonClientPermissions.d.ts.map +1 -1
- package/build/types/carbonbox/stakeholders/carbon-coordinators/domain/value-objects/CarbonCoordinatorPermissions.d.ts.map +1 -1
- package/build/types/carbonbox/stakeholders/carbon-host/domain/entity/CarbonHost.d.ts.map +1 -1
- package/build/types/carbonbox/stakeholders/carbon-host/domain/value-objects/CarbonHostPermissions.d.ts.map +1 -1
- package/build/types/carbonbox/stakeholders/carbon-managers/domain/value-objects/CarbonManagerPermissions.d.ts.map +1 -1
- package/build/types/carbonbox/stakeholders/shared/domain/entity/Stakeholder.d.ts.map +1 -1
- package/build/types/main/index.d.ts +2 -3
- package/build/types/main/index.d.ts.map +1 -1
- 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
|
|
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
|
-
|
|
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
|
|
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,
|
|
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()
|
|
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();
|
package/build/carbonbox/shared/domain/services/implementations/DateTimeFormattingDomainService.js
ADDED
|
@@ -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;
|