@oneuptime/common 11.3.26 → 11.3.28
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/Models/DatabaseModels/IncidentEpisodeRoleMember.ts +1 -1
- package/Models/DatabaseModels/IncidentMember.ts +1 -1
- package/Models/DatabaseModels/IncomingCallPolicy.ts +13 -0
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/MigrationFailure.ts +170 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +51 -2
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +44 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer.ts +6 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser.ts +6 -0
- package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +1 -1
- package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +2 -2
- package/Server/API/AlertAPI.ts +1 -1
- package/Server/API/IncidentAPI.ts +2 -2
- package/Server/API/IncidentEpisodeAPI.ts +1 -1
- package/Server/API/LlmProviderAPI.ts +1 -0
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783470000000-AddIncomingCallPolicyRoutingPhoneNumberUnique.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783510935686-FixNotNullForeignKeysOnDelete.ts +81 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783515836148-MigrationName.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783523076215-AddMigrationFailureTable.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/PostgresDatabase.ts +11 -0
- package/Server/Services/AIService.ts +74 -2
- package/Server/Services/AnalyticsDatabaseService.ts +10 -1
- package/Server/Services/DatabaseService.ts +10 -1
- package/Server/Services/IncidentService.ts +1 -1
- package/Server/Services/IncomingCallPolicyEscalationRuleService.ts +75 -2
- package/Server/Services/IncomingCallPolicyService.ts +42 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MigrationFailureService.ts +9 -0
- package/Server/Services/MonitorProbeService.ts +33 -7
- package/Server/Services/MonitorService.ts +19 -7
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +185 -41
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +23 -15
- package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +39 -0
- package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +148 -0
- package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +11 -2
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +502 -26
- package/Server/Services/OnCallDutyPolicyTimeLogService.ts +49 -7
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +218 -4
- package/Server/Services/ProjectCallSMSConfigService.ts +82 -1
- package/Server/Services/TeamMemberService.ts +6 -0
- package/Server/Services/UserNotificationRuleService.ts +13 -42
- package/Server/Services/UserOnCallLogService.ts +90 -0
- package/Server/Services/UserOnCallLogTimelineService.ts +43 -1
- package/Server/Types/Database/QueryUtil.ts +57 -0
- package/Server/Utils/AI/AlertAIContextBuilder.ts +6 -1
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +14 -2
- package/Server/Utils/AI/IncidentAIContextBuilder.ts +18 -3
- package/Server/Utils/AI/IncidentEpisodeAIContextBuilder.ts +6 -1
- package/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.ts +12 -2
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +183 -1
- package/Server/Utils/AI/Toolbox/Index.ts +4 -1
- package/Server/Utils/AI/Toolbox/RecentChangesTools.ts +208 -0
- package/Server/Utils/AI/Toolbox/Serializer.ts +42 -0
- package/Server/Utils/Database/MigrationFailureLog.ts +240 -0
- package/Server/Utils/IncomingCallPhoneNumber.ts +41 -0
- package/Server/Utils/LLM/LLMService.ts +110 -11
- package/Server/Utils/Telemetry/IoTSnapshotScan.ts +12 -9
- package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +12 -9
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +0 -8
- package/Tests/Server/Services/OnCallDutyPolicyScheduleLayerUserReorder.test.ts +233 -0
- package/Tests/Server/Services/OnCallDutyPolicyTimeLogServiceScoping.test.ts +242 -0
- package/Tests/Server/Services/OnCallDutyPolicyUserOverrideEdit.test.ts +198 -0
- package/Tests/Server/Services/UserOnCallLogClaimNotificationRule.test.ts +495 -0
- package/Tests/Server/Types/Database/QueryUtil.test.ts +74 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +78 -0
- package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +68 -0
- package/Tests/Types/DateExhaustiveTimezone.test.ts +700 -0
- package/Tests/Types/DateTimezoneWallClock.test.ts +99 -0
- package/Tests/Types/Events/Recurring.test.ts +22 -9
- package/Tests/Types/OnCallDutyPolicy/LayerUtilAuditFixes.test.ts +291 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilAuditFixesRound2.test.ts +398 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilDSTWeekendGap.test.ts +114 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilDSTWeeklyDayShift.test.ts +76 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilDailyMutation.test.ts +128 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilDailyProbe.test.ts +203 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilDiffFuzz.test.ts +322 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilEdgeCases.test.ts +280 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveCurrentUser.test.ts +863 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveDaily.test.ts +900 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveMultiLayer.test.ts +1104 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveRotation.test.ts +957 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveWeekly.test.ts +1095 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilInvariants.test.ts +232 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeAudit.test.ts +227 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMonthYearAudit.test.ts +255 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMultiLayerAudit.test.ts +388 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMultiLayerEdge.test.ts +300 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilOvernightDSTAudit.test.ts +158 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilRestrictedGapFix.test.ts +253 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilRestrictedGapRepro.test.ts +157 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilRotationFixes.test.ts +414 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilTimezone.test.ts +243 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilWeekendGapRepro.test.ts +112 -0
- package/Tests/Types/OnCallDutyPolicy/OverrideLensAudit.test.ts +117 -0
- package/Tests/Types/OnCallDutyPolicy/RestrictionTimes.test.ts +8 -6
- package/Tests/Types/OnCallDutyPolicy/RestrictionTimesDefaultDayAudit.test.ts +112 -0
- package/Tests/Types/OnCallDutyPolicy/RestrictionTimesExhaustive.test.ts +821 -0
- package/Tests/Types/OnCallDutyPolicy/RestrictionTimesMutationInvariant.test.ts +886 -0
- package/Tests/Types/OnCallDutyPolicy/UserOverrideUtil.test.ts +255 -0
- package/Tests/Types/OnCallDutyPolicy/UserOverrideUtilExhaustive.test.ts +1126 -0
- package/Types/Date.ts +200 -15
- package/Types/OnCallDutyPolicy/Layer.ts +790 -260
- package/Types/OnCallDutyPolicy/RestrictionTimes.ts +39 -13
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +21 -5
- package/UI/Components/Events/RecurringFieldElement.tsx +16 -0
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +8 -0
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeRoleMember.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeRoleMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentMember.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +10 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MigrationFailure.js +196 -0
- package/build/dist/Models/DatabaseModels/MigrationFailure.js.map +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +52 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +45 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer.js +6 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser.js +6 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +1 -0
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783470000000-AddIncomingCallPolicyRoutingPhoneNumberUnique.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783470000000-AddIncomingCallPolicyRoutingPhoneNumberUnique.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783510935686-FixNotNullForeignKeysOnDelete.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783510935686-FixNotNullForeignKeysOnDelete.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783515836148-MigrationName.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783515836148-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783523076215-AddMigrationFailureTable.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783523076215-AddMigrationFailureTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/PostgresDatabase.js +9 -0
- package/build/dist/Server/Infrastructure/PostgresDatabase.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +53 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +10 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +10 -1
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js +55 -2
- package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyService.js +40 -0
- package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MigrationFailureService.js +9 -0
- package/build/dist/Server/Services/MigrationFailureService.js.map +1 -0
- package/build/dist/Server/Services/MonitorProbeService.js +33 -7
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +12 -5
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +81 -22
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +134 -31
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +21 -13
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +36 -0
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +121 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +11 -2
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +409 -36
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyTimeLogService.js +52 -8
- package/build/dist/Server/Services/OnCallDutyPolicyTimeLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +170 -3
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +72 -0
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +6 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +12 -30
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallLogService.js +75 -0
- package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallLogTimelineService.js +31 -1
- package/build/dist/Server/Services/UserOnCallLogTimelineService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +45 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +6 -1
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +13 -2
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +18 -3
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js +6 -1
- package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js +12 -2
- package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +152 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +4 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/RecentChangesTools.js +165 -0
- package/build/dist/Server/Utils/AI/Toolbox/RecentChangesTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +40 -0
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
- package/build/dist/Server/Utils/Database/MigrationFailureLog.js +174 -0
- package/build/dist/Server/Utils/Database/MigrationFailureLog.js.map +1 -0
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +30 -0
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +81 -5
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js +11 -8
- package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +11 -8
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
- package/build/dist/Types/Date.js +153 -15
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +602 -171
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/RestrictionTimes.js +27 -13
- package/build/dist/Types/OnCallDutyPolicy/RestrictionTimes.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +20 -5
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/UI/Components/Events/RecurringFieldElement.js +13 -0
- package/build/dist/UI/Components/Events/RecurringFieldElement.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/package.json +1 -1
package/Types/Date.ts
CHANGED
|
@@ -85,8 +85,20 @@ export default class OneUptimeDate {
|
|
|
85
85
|
return new Date(timestamp * 1000);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
public static getStartOfTheWeek(
|
|
88
|
+
public static getStartOfTheWeek(
|
|
89
|
+
date: Date,
|
|
90
|
+
timezone?: string | undefined,
|
|
91
|
+
): Date {
|
|
89
92
|
date = this.fromString(date);
|
|
93
|
+
if (timezone) {
|
|
94
|
+
/*
|
|
95
|
+
* Timezone-aware start of week so on-call weekly-restriction boundaries
|
|
96
|
+
* anchor to the schedule's zone, consistent with the other boundary
|
|
97
|
+
* computations (keepTimeButMoveDay / getStartOfDay). Without a timezone
|
|
98
|
+
* the boundary is taken in the server's local zone (legacy behavior).
|
|
99
|
+
*/
|
|
100
|
+
return moment.tz(date, timezone).startOf("week").toDate();
|
|
101
|
+
}
|
|
90
102
|
return moment(date).startOf("week").toDate();
|
|
91
103
|
}
|
|
92
104
|
|
|
@@ -211,15 +223,16 @@ export default class OneUptimeDate {
|
|
|
211
223
|
date: Date,
|
|
212
224
|
moveToWeek: Date,
|
|
213
225
|
dayOfWeek: DayOfWeek,
|
|
226
|
+
timezone?: string | undefined,
|
|
214
227
|
): Date {
|
|
215
228
|
// date will be moved to the week of "moveToWeek" and then to the day of week "dayOfWeek"
|
|
216
229
|
|
|
217
230
|
date = this.fromString(date);
|
|
218
|
-
date = this.keepTimeButMoveDay(date, moveToWeek);
|
|
231
|
+
date = this.keepTimeButMoveDay(date, moveToWeek, timezone);
|
|
219
232
|
|
|
220
233
|
// now move the date to the day of week
|
|
221
234
|
|
|
222
|
-
const dateDayOfWeek: DayOfWeek = this.getDayOfWeek(date);
|
|
235
|
+
const dateDayOfWeek: DayOfWeek = this.getDayOfWeek(date, timezone);
|
|
223
236
|
|
|
224
237
|
if (dateDayOfWeek === dayOfWeek) {
|
|
225
238
|
return date;
|
|
@@ -237,7 +250,15 @@ export default class OneUptimeDate {
|
|
|
237
250
|
return date;
|
|
238
251
|
}
|
|
239
252
|
|
|
240
|
-
|
|
253
|
+
/*
|
|
254
|
+
* Forward the timezone to the final day-shift too. The first two steps
|
|
255
|
+
* (keepTimeButMoveDay, getDayOfWeek) are already timezone-aware; without
|
|
256
|
+
* the timezone here this last shift used the process zone, so a shift that
|
|
257
|
+
* straddles a DST transition in the target zone (but not the process zone)
|
|
258
|
+
* drifted the resolved weekly-restriction boundary by the DST offset
|
|
259
|
+
* (audit F9).
|
|
260
|
+
*/
|
|
261
|
+
return this.addRemoveDays(date, difference, timezone);
|
|
241
262
|
}
|
|
242
263
|
|
|
243
264
|
public static getDayOfTheWeekIndex(date: Date): number {
|
|
@@ -245,6 +266,76 @@ export default class OneUptimeDate {
|
|
|
245
266
|
return moment(date).weekday();
|
|
246
267
|
}
|
|
247
268
|
|
|
269
|
+
/**
|
|
270
|
+
* Format the wall-clock time (HH:mm, respecting the 12/24h preference) of an
|
|
271
|
+
* instant AS SEEN IN `timezone`. With no timezone, falls back to the
|
|
272
|
+
* process/browser local wall-clock. Used to show on-call restriction hours in
|
|
273
|
+
* the schedule's timezone rather than the viewer's browser zone (audit F10).
|
|
274
|
+
*/
|
|
275
|
+
public static getHourAndMinuteInTimezoneString(
|
|
276
|
+
date: Date | string,
|
|
277
|
+
timezone?: string | undefined,
|
|
278
|
+
): string {
|
|
279
|
+
date = this.fromString(date);
|
|
280
|
+
if (!timezone) {
|
|
281
|
+
return this.getLocalHourAndMinuteFromDate(date);
|
|
282
|
+
}
|
|
283
|
+
const use12HourFormat: boolean = this.getUserPrefers12HourFormat();
|
|
284
|
+
return moment
|
|
285
|
+
.tz(date, timezone)
|
|
286
|
+
.format(use12HourFormat ? "h:mm A" : "HH:mm");
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Reinterpret the wall-clock components of `date` — read in the process /
|
|
291
|
+
* browser local zone — as the SAME wall-clock in `timezone`, and return that
|
|
292
|
+
* instant. Used to store a time the user typed for the schedule's timezone
|
|
293
|
+
* even though the time picker captured it in the browser's local zone (audit
|
|
294
|
+
* F1). Inverse of getLocalDateFromWallClockInTimezone.
|
|
295
|
+
*/
|
|
296
|
+
public static getInstantFromLocalWallClockInTimezone(
|
|
297
|
+
date: Date | string,
|
|
298
|
+
timezone: string,
|
|
299
|
+
): Date {
|
|
300
|
+
date = this.fromString(date);
|
|
301
|
+
const local: moment.Moment = moment(date);
|
|
302
|
+
return moment
|
|
303
|
+
.tz(
|
|
304
|
+
{
|
|
305
|
+
year: local.year(),
|
|
306
|
+
month: local.month(),
|
|
307
|
+
day: local.date(),
|
|
308
|
+
hour: local.hour(),
|
|
309
|
+
minute: local.minute(),
|
|
310
|
+
second: local.second(),
|
|
311
|
+
},
|
|
312
|
+
timezone,
|
|
313
|
+
)
|
|
314
|
+
.toDate();
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Inverse of getInstantFromLocalWallClockInTimezone: return a process /
|
|
319
|
+
* browser local Date whose LOCAL wall-clock equals `date`'s wall-clock as seen
|
|
320
|
+
* in `timezone`. Used to display a stored schedule-timezone time inside a
|
|
321
|
+
* browser-local time picker (audit F1).
|
|
322
|
+
*/
|
|
323
|
+
public static getLocalDateFromWallClockInTimezone(
|
|
324
|
+
date: Date | string,
|
|
325
|
+
timezone: string,
|
|
326
|
+
): Date {
|
|
327
|
+
date = this.fromString(date);
|
|
328
|
+
const zoned: moment.Moment = moment.tz(date, timezone);
|
|
329
|
+
return moment({
|
|
330
|
+
year: zoned.year(),
|
|
331
|
+
month: zoned.month(),
|
|
332
|
+
day: zoned.date(),
|
|
333
|
+
hour: zoned.hour(),
|
|
334
|
+
minute: zoned.minute(),
|
|
335
|
+
second: zoned.second(),
|
|
336
|
+
}).toDate();
|
|
337
|
+
}
|
|
338
|
+
|
|
248
339
|
public static isOverlapping(
|
|
249
340
|
start: Date,
|
|
250
341
|
end: Date,
|
|
@@ -435,9 +526,34 @@ export default class OneUptimeDate {
|
|
|
435
526
|
return moment();
|
|
436
527
|
}
|
|
437
528
|
|
|
438
|
-
public static keepTimeButMoveDay(
|
|
529
|
+
public static keepTimeButMoveDay(
|
|
530
|
+
keepTimeFor: Date,
|
|
531
|
+
moveDayTo: Date,
|
|
532
|
+
timezone?: string | undefined,
|
|
533
|
+
): Date {
|
|
439
534
|
keepTimeFor = this.fromString(keepTimeFor);
|
|
440
535
|
moveDayTo = this.fromString(moveDayTo);
|
|
536
|
+
|
|
537
|
+
if (timezone) {
|
|
538
|
+
/*
|
|
539
|
+
* Timezone-aware: keep the wall-clock time of `keepTimeFor` AS SEEN IN
|
|
540
|
+
* `timezone`, and place it on the day of `moveDayTo` (also in `timezone`).
|
|
541
|
+
* This is what makes an on-call restriction like "09:00-17:00" resolve to
|
|
542
|
+
* 09:00 in the schedule's zone regardless of the server's zone, and lets
|
|
543
|
+
* moment-timezone handle DST transitions correctly.
|
|
544
|
+
*/
|
|
545
|
+
const src: moment.Moment = moment.tz(keepTimeFor, timezone);
|
|
546
|
+
return moment
|
|
547
|
+
.tz(moveDayTo, timezone)
|
|
548
|
+
.set({
|
|
549
|
+
hour: src.hour(),
|
|
550
|
+
minute: src.minute(),
|
|
551
|
+
second: src.second(),
|
|
552
|
+
millisecond: src.millisecond(),
|
|
553
|
+
})
|
|
554
|
+
.toDate();
|
|
555
|
+
}
|
|
556
|
+
|
|
441
557
|
return moment(moveDayTo)
|
|
442
558
|
.set({
|
|
443
559
|
hour: keepTimeFor.getHours(),
|
|
@@ -456,7 +572,24 @@ export default class OneUptimeDate {
|
|
|
456
572
|
return this.getSomeDaysAgo(new PositiveNumber(1));
|
|
457
573
|
}
|
|
458
574
|
|
|
459
|
-
public static fromUnixNano(timestamp: number): Date {
|
|
575
|
+
public static fromUnixNano(timestamp: string | number): Date {
|
|
576
|
+
/*
|
|
577
|
+
* Nanosecond epoch values are far larger than Number.MAX_SAFE_INTEGER, so
|
|
578
|
+
* parsing them as a float (or dividing that float by 1e6) silently drops
|
|
579
|
+
* up to a full millisecond of precision. When the raw value is an integer
|
|
580
|
+
* string, divide with BigInt to keep exact millisecond precision; fall
|
|
581
|
+
* back to numeric division for number inputs and non-integer strings.
|
|
582
|
+
*/
|
|
583
|
+
if (typeof timestamp === "string") {
|
|
584
|
+
const trimmed: string = timestamp.trim();
|
|
585
|
+
const integerPattern: RegExp = /^[+-]?\d+$/;
|
|
586
|
+
if (integerPattern.test(trimmed)) {
|
|
587
|
+
const nanosPerMilli: bigint = BigInt(1000000);
|
|
588
|
+
const millis: number = Number(BigInt(trimmed) / nanosPerMilli);
|
|
589
|
+
return moment(millis).toDate();
|
|
590
|
+
}
|
|
591
|
+
return moment(Number(trimmed) / 1000000).toDate();
|
|
592
|
+
}
|
|
460
593
|
return moment(timestamp / 1000000).toDate();
|
|
461
594
|
}
|
|
462
595
|
|
|
@@ -610,8 +743,24 @@ export default class OneUptimeDate {
|
|
|
610
743
|
return moment(date).add(minutes, "minutes").toDate();
|
|
611
744
|
}
|
|
612
745
|
|
|
613
|
-
|
|
746
|
+
/*
|
|
747
|
+
* Calendar-unit arithmetic. When `timezone` is provided the step preserves
|
|
748
|
+
* the wall-clock time in that zone across DST transitions (e.g. an on-call
|
|
749
|
+
* handoff/restriction authored for 09:00 stays at 09:00 local after
|
|
750
|
+
* spring-forward/fall-back). Without a timezone the step is taken in the
|
|
751
|
+
* server's local zone — fully backward compatible for existing callers.
|
|
752
|
+
* Hours/minutes/seconds are absolute units and intentionally have no
|
|
753
|
+
* timezone-aware variant.
|
|
754
|
+
*/
|
|
755
|
+
public static addRemoveDays(
|
|
756
|
+
date: Date,
|
|
757
|
+
days: number,
|
|
758
|
+
timezone?: string | undefined,
|
|
759
|
+
): Date {
|
|
614
760
|
date = this.fromString(date);
|
|
761
|
+
if (timezone) {
|
|
762
|
+
return moment.tz(date, timezone).add(days, "days").toDate();
|
|
763
|
+
}
|
|
615
764
|
return moment(date).add(days, "days").toDate();
|
|
616
765
|
}
|
|
617
766
|
|
|
@@ -620,18 +769,39 @@ export default class OneUptimeDate {
|
|
|
620
769
|
return moment(date).add(hours, "hours").toDate();
|
|
621
770
|
}
|
|
622
771
|
|
|
623
|
-
public static addRemoveYears(
|
|
772
|
+
public static addRemoveYears(
|
|
773
|
+
date: Date,
|
|
774
|
+
years: number,
|
|
775
|
+
timezone?: string | undefined,
|
|
776
|
+
): Date {
|
|
624
777
|
date = this.fromString(date);
|
|
778
|
+
if (timezone) {
|
|
779
|
+
return moment.tz(date, timezone).add(years, "years").toDate();
|
|
780
|
+
}
|
|
625
781
|
return moment(date).add(years, "years").toDate();
|
|
626
782
|
}
|
|
627
783
|
|
|
628
|
-
public static addRemoveMonths(
|
|
784
|
+
public static addRemoveMonths(
|
|
785
|
+
date: Date,
|
|
786
|
+
months: number,
|
|
787
|
+
timezone?: string | undefined,
|
|
788
|
+
): Date {
|
|
629
789
|
date = this.fromString(date);
|
|
790
|
+
if (timezone) {
|
|
791
|
+
return moment.tz(date, timezone).add(months, "months").toDate();
|
|
792
|
+
}
|
|
630
793
|
return moment(date).add(months, "months").toDate();
|
|
631
794
|
}
|
|
632
795
|
|
|
633
|
-
public static addRemoveWeeks(
|
|
796
|
+
public static addRemoveWeeks(
|
|
797
|
+
date: Date,
|
|
798
|
+
weeks: number,
|
|
799
|
+
timezone?: string | undefined,
|
|
800
|
+
): Date {
|
|
634
801
|
date = this.fromString(date);
|
|
802
|
+
if (timezone) {
|
|
803
|
+
return moment.tz(date, timezone).add(weeks, "weeks").toDate();
|
|
804
|
+
}
|
|
635
805
|
return moment(date).add(weeks, "weeks").toDate();
|
|
636
806
|
}
|
|
637
807
|
|
|
@@ -941,13 +1111,19 @@ export default class OneUptimeDate {
|
|
|
941
1111
|
return moment().year();
|
|
942
1112
|
}
|
|
943
1113
|
|
|
944
|
-
public static getStartOfDay(date: Date): Date {
|
|
1114
|
+
public static getStartOfDay(date: Date, timezone?: string | undefined): Date {
|
|
945
1115
|
date = this.fromString(date);
|
|
1116
|
+
if (timezone) {
|
|
1117
|
+
return moment.tz(date, timezone).startOf("day").toDate();
|
|
1118
|
+
}
|
|
946
1119
|
return moment(date).startOf("day").toDate();
|
|
947
1120
|
}
|
|
948
1121
|
|
|
949
|
-
public static getEndOfDay(date: Date): Date {
|
|
1122
|
+
public static getEndOfDay(date: Date, timezone?: string | undefined): Date {
|
|
950
1123
|
date = this.fromString(date);
|
|
1124
|
+
if (timezone) {
|
|
1125
|
+
return moment.tz(date, timezone).endOf("day").toDate();
|
|
1126
|
+
}
|
|
951
1127
|
return moment(date).endOf("day").toDate();
|
|
952
1128
|
}
|
|
953
1129
|
|
|
@@ -970,8 +1146,11 @@ export default class OneUptimeDate {
|
|
|
970
1146
|
return moment(date).isSameOrAfter(startDate, "seconds");
|
|
971
1147
|
}
|
|
972
1148
|
|
|
973
|
-
public static getDayOfWeek(
|
|
974
|
-
|
|
1149
|
+
public static getDayOfWeek(
|
|
1150
|
+
date: Date,
|
|
1151
|
+
timezone?: string | undefined,
|
|
1152
|
+
): DayOfWeek {
|
|
1153
|
+
const dayOfWeek: number = this.geyDayOfWeekAsNumber(date, timezone);
|
|
975
1154
|
|
|
976
1155
|
if (dayOfWeek === 1) {
|
|
977
1156
|
return DayOfWeek.Monday;
|
|
@@ -992,8 +1171,14 @@ export default class OneUptimeDate {
|
|
|
992
1171
|
throw new BadDataException("Invalid day of week");
|
|
993
1172
|
}
|
|
994
1173
|
|
|
995
|
-
public static geyDayOfWeekAsNumber(
|
|
1174
|
+
public static geyDayOfWeekAsNumber(
|
|
1175
|
+
date: Date,
|
|
1176
|
+
timezone?: string | undefined,
|
|
1177
|
+
): number {
|
|
996
1178
|
date = this.fromString(date);
|
|
1179
|
+
if (timezone) {
|
|
1180
|
+
return moment.tz(date, timezone).isoWeekday();
|
|
1181
|
+
}
|
|
997
1182
|
return moment(date).isoWeekday();
|
|
998
1183
|
}
|
|
999
1184
|
|