@oneuptime/common 12.0.29 → 12.0.30
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/Index.ts +11 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
- package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
- package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
- package/Server/API/OnCallCalendarAPI.ts +2194 -0
- package/Server/EnvironmentConfig.ts +138 -0
- package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
- package/Server/Services/Index.ts +12 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
- package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
- package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
- package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
- package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
- package/Server/Services/TeamMemberService.ts +489 -1
- package/Server/Services/TeamService.ts +50 -0
- package/Server/Services/UserNotificationSettingService.ts +44 -1
- package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
- package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
- package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
- package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
- package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
- package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
- package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
- package/Server/Utils/Response.ts +134 -0
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
- package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
- package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
- package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
- package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
- package/Tests/Server/API/Helpers.ts +8 -0
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
- package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +369 -0
- package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
- package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
- package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
- package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
- package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
- package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
- package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
- package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
- package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
- package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
- package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
- package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
- package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
- package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
- package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Types/Calendar/ICalendar.ts +442 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
- package/Types/OnCallDutyPolicy/Layer.ts +190 -35
- package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
- package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
- package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
- package/build/dist/Models/DatabaseModels/Index.js +11 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +102 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
- package/build/dist/Server/Services/Index.js +12 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/TeamMemberService.js +396 -1
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +43 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +97 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +9 -1
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Types/Calendar/ICalendar.js +290 -0
- package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import DatabaseService from "./DatabaseService";
|
|
11
|
+
import OnCallDutyPolicyScheduleService from "./OnCallDutyPolicyScheduleService";
|
|
12
|
+
import CalendarFeedToken from "../Utils/OnCall/CalendarFeedToken";
|
|
13
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
14
|
+
import Model from "../../Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed";
|
|
15
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
16
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
17
|
+
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
18
|
+
import CalendarFeedWindow from "../../Types/OnCallDutyPolicy/CalendarFeedWindow";
|
|
19
|
+
/*
|
|
20
|
+
* Bounds for the coverage-gap threshold: a gap shorter than a minute is a
|
|
21
|
+
* seam artefact, and a threshold longer than a week would never emit.
|
|
22
|
+
*/
|
|
23
|
+
export const MIN_MINIMUM_GAP_MINUTES = 1;
|
|
24
|
+
export const MAX_MINIMUM_GAP_MINUTES = 7 * 24 * 60;
|
|
25
|
+
/*
|
|
26
|
+
* The shared, project-owned calendar feed of one on-call schedule.
|
|
27
|
+
*
|
|
28
|
+
* WHAT THE HOOKS GUARANTEE
|
|
29
|
+
*
|
|
30
|
+
* - The schedule exists in the caller's project. The foreign key alone
|
|
31
|
+
* would accept a schedule from another project (the FK does not know
|
|
32
|
+
* about tenants), and a feed that renders another project's roster to
|
|
33
|
+
* whoever holds this project's link is exactly the leak the tenant column
|
|
34
|
+
* exists to prevent.
|
|
35
|
+
* - One feed per schedule. The unique index enforces it at the database;
|
|
36
|
+
* the hook turns the constraint violation into a message a person can
|
|
37
|
+
* act on.
|
|
38
|
+
* - The token is minted HERE, on every create, whatever the request
|
|
39
|
+
* carried. Publishing a feed is a normal, permission-checked create
|
|
40
|
+
* (the schedule's Edit list), and the plaintext is then read back by the
|
|
41
|
+
* calendar API's `/current` route through the encrypted `token` column.
|
|
42
|
+
* - pastDays / futureDays are clamped and minimumGapMinutes is bounded on
|
|
43
|
+
* every write.
|
|
44
|
+
*
|
|
45
|
+
* rotateTokenById and rotateFeedsForMemberLeave are root writes for the
|
|
46
|
+
* calendar API and the team-member cleanup respectively; cache purging stays
|
|
47
|
+
* with the caller.
|
|
48
|
+
*/
|
|
49
|
+
export class Service extends DatabaseService {
|
|
50
|
+
constructor() {
|
|
51
|
+
super(Model);
|
|
52
|
+
}
|
|
53
|
+
async onBeforeCreate(createBy) {
|
|
54
|
+
const projectId = createBy.data.projectId || createBy.props.tenantId;
|
|
55
|
+
if (!projectId) {
|
|
56
|
+
throw new BadDataException("projectId is required");
|
|
57
|
+
}
|
|
58
|
+
const scheduleId = createBy.data.onCallDutyPolicyScheduleId;
|
|
59
|
+
if (!scheduleId) {
|
|
60
|
+
throw new BadDataException("onCallDutyPolicyScheduleId is required");
|
|
61
|
+
}
|
|
62
|
+
createBy.data.projectId = projectId;
|
|
63
|
+
const schedule = await OnCallDutyPolicyScheduleService.findOneBy({
|
|
64
|
+
query: {
|
|
65
|
+
_id: scheduleId,
|
|
66
|
+
projectId: projectId,
|
|
67
|
+
},
|
|
68
|
+
select: {
|
|
69
|
+
_id: true,
|
|
70
|
+
},
|
|
71
|
+
props: {
|
|
72
|
+
isRoot: true,
|
|
73
|
+
ignoreHooks: true,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
if (!schedule) {
|
|
77
|
+
throw new BadDataException("On-call schedule not found in this project.");
|
|
78
|
+
}
|
|
79
|
+
const existing = await this.countBy({
|
|
80
|
+
query: {
|
|
81
|
+
onCallDutyPolicyScheduleId: scheduleId,
|
|
82
|
+
},
|
|
83
|
+
props: {
|
|
84
|
+
isRoot: true,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
if (existing.toNumber() > 0) {
|
|
88
|
+
throw new BadDataException("This schedule already has a shared calendar feed. Regenerate or edit the existing one instead.");
|
|
89
|
+
}
|
|
90
|
+
/*
|
|
91
|
+
* A request body never chooses the secret. Root callers (the calendar
|
|
92
|
+
* API) may pass a token they minted so they can answer with the URL in
|
|
93
|
+
* the same response; everyone else gets a fresh mint.
|
|
94
|
+
*/
|
|
95
|
+
CalendarFeedToken.applyTokenColumnsOnCreate(createBy.data, {
|
|
96
|
+
trustSuppliedToken: createBy.props.isRoot === true,
|
|
97
|
+
});
|
|
98
|
+
createBy.data.pastDays = CalendarFeedWindow.clampPastDays(createBy.data.pastDays);
|
|
99
|
+
createBy.data.futureDays = CalendarFeedWindow.clampFutureDays(createBy.data.futureDays);
|
|
100
|
+
if (createBy.data.minimumGapMinutes !== undefined) {
|
|
101
|
+
createBy.data.minimumGapMinutes = Service.validateMinimumGapMinutes(createBy.data.minimumGapMinutes);
|
|
102
|
+
}
|
|
103
|
+
return { createBy, carryForward: null };
|
|
104
|
+
}
|
|
105
|
+
async onBeforeUpdate(updateBy) {
|
|
106
|
+
if (updateBy.data.pastDays !== undefined) {
|
|
107
|
+
updateBy.data.pastDays = CalendarFeedWindow.clampPastDays(updateBy.data.pastDays);
|
|
108
|
+
}
|
|
109
|
+
if (updateBy.data.futureDays !== undefined) {
|
|
110
|
+
updateBy.data.futureDays = CalendarFeedWindow.clampFutureDays(updateBy.data.futureDays);
|
|
111
|
+
}
|
|
112
|
+
if (updateBy.data.minimumGapMinutes !== undefined) {
|
|
113
|
+
updateBy.data.minimumGapMinutes = Service.validateMinimumGapMinutes(updateBy.data.minimumGapMinutes);
|
|
114
|
+
}
|
|
115
|
+
return { updateBy, carryForward: null };
|
|
116
|
+
}
|
|
117
|
+
/*
|
|
118
|
+
* A whole number of minutes between MIN_MINIMUM_GAP_MINUTES and
|
|
119
|
+
* MAX_MINIMUM_GAP_MINUTES. Numeric strings are accepted because a root
|
|
120
|
+
* caller may hand over what a form posted; anything else is a 400.
|
|
121
|
+
*/
|
|
122
|
+
static validateMinimumGapMinutes(value) {
|
|
123
|
+
const parsed = typeof value === "string" && value.trim() !== ""
|
|
124
|
+
? Number(value)
|
|
125
|
+
: value;
|
|
126
|
+
if (typeof parsed !== "number" ||
|
|
127
|
+
!Number.isInteger(parsed) ||
|
|
128
|
+
parsed < MIN_MINIMUM_GAP_MINUTES ||
|
|
129
|
+
parsed > MAX_MINIMUM_GAP_MINUTES) {
|
|
130
|
+
throw new BadDataException(`Minimum gap must be a whole number of minutes between ${MIN_MINIMUM_GAP_MINUTES} and ${MAX_MINIMUM_GAP_MINUTES}.`);
|
|
131
|
+
}
|
|
132
|
+
return parsed;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Rotate the token of an existing feed: mint a new one, move the current
|
|
136
|
+
* hash into the 30-day grace slot, stamp rotatedAt. Returns the new
|
|
137
|
+
* plaintext token ONCE. Root write; the caller purges caches.
|
|
138
|
+
*/
|
|
139
|
+
async rotateTokenById(data) {
|
|
140
|
+
const existing = await this.findOneBy({
|
|
141
|
+
query: { _id: data.id },
|
|
142
|
+
select: { _id: true, tokenHash: true },
|
|
143
|
+
props: { isRoot: true, ignoreHooks: true },
|
|
144
|
+
});
|
|
145
|
+
if (!existing) {
|
|
146
|
+
throw new NotFoundException("Calendar feed not found.");
|
|
147
|
+
}
|
|
148
|
+
const rotation = CalendarFeedToken.buildRotation({
|
|
149
|
+
currentTokenHash: existing.tokenHash,
|
|
150
|
+
});
|
|
151
|
+
await this.updateOneById({
|
|
152
|
+
id: data.id,
|
|
153
|
+
data: CalendarFeedToken.toRotationUpdateData(rotation),
|
|
154
|
+
props: { isRoot: true },
|
|
155
|
+
});
|
|
156
|
+
return rotation;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Rotate every ENABLED feed in the project that opted into
|
|
160
|
+
* rotateWhenMemberLeaves. Called by the team-member cleanup when a user's
|
|
161
|
+
* last team membership in the project goes away. Returns the ids rotated
|
|
162
|
+
* so the caller can purge their caches. A disabled feed is left alone: it
|
|
163
|
+
* already serves an empty calendar, and rotating it would only reset the
|
|
164
|
+
* grace clock on a link nobody should be refreshing anyway.
|
|
165
|
+
*/
|
|
166
|
+
async rotateFeedsForMemberLeave(data) {
|
|
167
|
+
const feeds = await this.findBy({
|
|
168
|
+
query: {
|
|
169
|
+
projectId: data.projectId,
|
|
170
|
+
isEnabled: true,
|
|
171
|
+
rotateWhenMemberLeaves: true,
|
|
172
|
+
},
|
|
173
|
+
select: {
|
|
174
|
+
_id: true,
|
|
175
|
+
},
|
|
176
|
+
limit: LIMIT_MAX,
|
|
177
|
+
skip: 0,
|
|
178
|
+
props: {
|
|
179
|
+
isRoot: true,
|
|
180
|
+
ignoreHooks: true,
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
const rotated = [];
|
|
184
|
+
for (const feed of feeds) {
|
|
185
|
+
if (!feed.id) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
await this.rotateTokenById({ id: feed.id });
|
|
189
|
+
rotated.push(feed.id);
|
|
190
|
+
}
|
|
191
|
+
return rotated;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
__decorate([
|
|
195
|
+
CaptureSpan(),
|
|
196
|
+
__metadata("design:type", Function),
|
|
197
|
+
__metadata("design:paramtypes", [Object]),
|
|
198
|
+
__metadata("design:returntype", Promise)
|
|
199
|
+
], Service.prototype, "onBeforeCreate", null);
|
|
200
|
+
__decorate([
|
|
201
|
+
CaptureSpan(),
|
|
202
|
+
__metadata("design:type", Function),
|
|
203
|
+
__metadata("design:paramtypes", [Object]),
|
|
204
|
+
__metadata("design:returntype", Promise)
|
|
205
|
+
], Service.prototype, "onBeforeUpdate", null);
|
|
206
|
+
__decorate([
|
|
207
|
+
CaptureSpan(),
|
|
208
|
+
__metadata("design:type", Function),
|
|
209
|
+
__metadata("design:paramtypes", [Object]),
|
|
210
|
+
__metadata("design:returntype", Promise)
|
|
211
|
+
], Service.prototype, "rotateTokenById", null);
|
|
212
|
+
__decorate([
|
|
213
|
+
CaptureSpan(),
|
|
214
|
+
__metadata("design:type", Function),
|
|
215
|
+
__metadata("design:paramtypes", [Object]),
|
|
216
|
+
__metadata("design:returntype", Promise)
|
|
217
|
+
], Service.prototype, "rotateFeedsForMemberLeave", null);
|
|
218
|
+
export default new Service();
|
|
219
|
+
//# sourceMappingURL=OnCallDutyPolicyScheduleCalendarFeedService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnCallDutyPolicyScheduleCalendarFeedService.js","sourceRoot":"","sources":["../../../../Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,10 +18,48 @@ import OneUptimeDate from "../../Types/Date";
|
|
|
18
18
|
import Model from "../../Models/DatabaseModels/OnCallDutyPolicyScheduleLayer";
|
|
19
19
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
20
20
|
import OnCallDutyPolicyScheduleService from "./OnCallDutyPolicyScheduleService";
|
|
21
|
+
import { OnCallShiftChangeReason } from "../Utils/OnCall/OnCallShiftChangeListeners";
|
|
22
|
+
import logger from "../Utils/Logger";
|
|
21
23
|
export class Service extends DatabaseService {
|
|
22
24
|
constructor() {
|
|
23
25
|
super(Model);
|
|
24
26
|
}
|
|
27
|
+
/*
|
|
28
|
+
* A layer edit changes who is on call and when for the whole schedule:
|
|
29
|
+
* bump its shiftConfigVersion, drop the calendar-feed caches and let the
|
|
30
|
+
* shift-change listeners re-plan. Runs AFTER the roster refresh so a
|
|
31
|
+
* listener that re-materializes sees the new configuration. Best-effort by
|
|
32
|
+
* construction (propagateShiftConfigChange never throws).
|
|
33
|
+
*/
|
|
34
|
+
async propagateLayerChange(scheduleId, projectId) {
|
|
35
|
+
if (!scheduleId) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await OnCallDutyPolicyScheduleService.propagateShiftConfigChange({
|
|
39
|
+
scheduleIds: [scheduleId],
|
|
40
|
+
projectId: projectId || null,
|
|
41
|
+
reason: OnCallShiftChangeReason.LayerChanged,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Re-resolve and persist the schedule's roster after a layer change.
|
|
46
|
+
* Best-effort: the row is already committed when the success hooks run, so
|
|
47
|
+
* a throwing refresh (a concurrently-deleted schedule, a transient
|
|
48
|
+
* persistence or notification failure) must not abort the hook before
|
|
49
|
+
* propagateLayerChange bumps the shiftConfigVersion and purges the feed
|
|
50
|
+
* caches — otherwise the caches would keep serving the pre-edit roster for
|
|
51
|
+
* up to their TTL and the reminder change pass would be skipped. Mirrors
|
|
52
|
+
* OnCallDutyPolicyEscalationRuleScheduleService.refreshScheduleRoster.
|
|
53
|
+
*/
|
|
54
|
+
async refreshScheduleRosterBestEffort(scheduleId) {
|
|
55
|
+
try {
|
|
56
|
+
await OnCallDutyPolicyScheduleService.refreshCurrentUserIdAndHandoffTimeInSchedule(scheduleId);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
logger.error("Error refreshing the schedule roster after a layer change (best-effort).");
|
|
60
|
+
logger.error(err);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
25
63
|
/*
|
|
26
64
|
* A rotation interval count of 0 / NaN / negative breaks the handoff math
|
|
27
65
|
* (division by zero, Invalid Date), so reject it at the persistence boundary.
|
|
@@ -114,6 +152,7 @@ export class Service extends DatabaseService {
|
|
|
114
152
|
id: createdItem.id,
|
|
115
153
|
select: {
|
|
116
154
|
onCallDutyPolicyScheduleId: true,
|
|
155
|
+
projectId: true,
|
|
117
156
|
},
|
|
118
157
|
props: {
|
|
119
158
|
isRoot: true,
|
|
@@ -122,7 +161,8 @@ export class Service extends DatabaseService {
|
|
|
122
161
|
if (!resource || !resource.onCallDutyPolicyScheduleId) {
|
|
123
162
|
return createdItem;
|
|
124
163
|
}
|
|
125
|
-
await
|
|
164
|
+
await this.refreshScheduleRosterBestEffort(resource.onCallDutyPolicyScheduleId);
|
|
165
|
+
await this.propagateLayerChange(resource.onCallDutyPolicyScheduleId, resource.projectId);
|
|
126
166
|
return createdItem;
|
|
127
167
|
}
|
|
128
168
|
async onBeforeUpdate(updateBy) {
|
|
@@ -139,6 +179,7 @@ export class Service extends DatabaseService {
|
|
|
139
179
|
id: item,
|
|
140
180
|
select: {
|
|
141
181
|
onCallDutyPolicyScheduleId: true,
|
|
182
|
+
projectId: true,
|
|
142
183
|
},
|
|
143
184
|
props: {
|
|
144
185
|
isRoot: true,
|
|
@@ -147,7 +188,8 @@ export class Service extends DatabaseService {
|
|
|
147
188
|
if (!resource || !resource.onCallDutyPolicyScheduleId) {
|
|
148
189
|
continue;
|
|
149
190
|
}
|
|
150
|
-
await
|
|
191
|
+
await this.refreshScheduleRosterBestEffort(resource.onCallDutyPolicyScheduleId);
|
|
192
|
+
await this.propagateLayerChange(resource.onCallDutyPolicyScheduleId, resource.projectId);
|
|
151
193
|
}
|
|
152
194
|
return {
|
|
153
195
|
updateBy: _onUpdate.updateBy,
|
|
@@ -179,6 +221,7 @@ export class Service extends DatabaseService {
|
|
|
179
221
|
select: {
|
|
180
222
|
order: true,
|
|
181
223
|
onCallDutyPolicyScheduleId: true,
|
|
224
|
+
projectId: true,
|
|
182
225
|
},
|
|
183
226
|
});
|
|
184
227
|
}
|
|
@@ -193,7 +236,8 @@ export class Service extends DatabaseService {
|
|
|
193
236
|
if (!deleteBy.props.isRoot && resource) {
|
|
194
237
|
if (resource && resource.order && resource.onCallDutyPolicyScheduleId) {
|
|
195
238
|
await this.rearrangeOrder(resource.order, resource.onCallDutyPolicyScheduleId, false);
|
|
196
|
-
await
|
|
239
|
+
await this.refreshScheduleRosterBestEffort(resource.onCallDutyPolicyScheduleId);
|
|
240
|
+
await this.propagateLayerChange(resource.onCallDutyPolicyScheduleId, resource.projectId);
|
|
197
241
|
}
|
|
198
242
|
}
|
|
199
243
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OnCallDutyPolicyScheduleLayerService.js","sourceRoot":"","sources":["../../../../Server/Services/OnCallDutyPolicyScheduleLayerService.ts"],"names":[],"mappings":";;;;;;;;;AAGA,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,SAAS,MAAM,oCAAoC,CAAC;AAC3D,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AAGtE,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,gBAAgB,EAAE,EACvB,eAAe,GAChB,MAAM,+CAA+C,CAAC;AACvD,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,MAAM,2DAA2D,CAAC;AAC9E,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,+BAA+B,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"OnCallDutyPolicyScheduleLayerService.js","sourceRoot":"","sources":["../../../../Server/Services/OnCallDutyPolicyScheduleLayerService.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,13 +12,107 @@ import DatabaseService from "./DatabaseService";
|
|
|
12
12
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
13
13
|
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
14
14
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
15
|
+
import ObjectID from "../../Types/ObjectID";
|
|
15
16
|
import Model from "../../Models/DatabaseModels/OnCallDutyPolicyScheduleLayerUser";
|
|
16
17
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
17
18
|
import OnCallDutyPolicyScheduleService from "./OnCallDutyPolicyScheduleService";
|
|
19
|
+
import { OnCallShiftChangeReason } from "../Utils/OnCall/OnCallShiftChangeListeners";
|
|
20
|
+
import logger from "../Utils/Logger";
|
|
18
21
|
export class Service extends DatabaseService {
|
|
19
22
|
constructor() {
|
|
20
23
|
super(Model);
|
|
21
24
|
}
|
|
25
|
+
/*
|
|
26
|
+
* Adding, removing or re-ordering a layer user rewrites the rotation of the
|
|
27
|
+
* whole schedule (the engine derives every position from the current user
|
|
28
|
+
* list), so the schedule's shiftConfigVersion is bumped, its feed caches
|
|
29
|
+
* dropped, and the listeners told — naming the user the row belongs to so
|
|
30
|
+
* their personal feed and reminders are refreshed even when they are no
|
|
31
|
+
* longer a member. Runs after the roster refresh; never throws.
|
|
32
|
+
*/
|
|
33
|
+
async propagateLayerUserChange(scheduleId, projectId, userId) {
|
|
34
|
+
if (!scheduleId) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
await OnCallDutyPolicyScheduleService.propagateShiftConfigChange({
|
|
38
|
+
scheduleIds: [scheduleId],
|
|
39
|
+
projectId: projectId || null,
|
|
40
|
+
userIds: userId ? [userId] : [],
|
|
41
|
+
reason: OnCallShiftChangeReason.LayerUserChanged,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Re-resolve and persist the schedule's roster after a layer-user change.
|
|
46
|
+
* Best-effort: the row is already committed when the success hooks run, so
|
|
47
|
+
* a throwing refresh (a concurrently-deleted schedule, a transient
|
|
48
|
+
* persistence or notification failure) must not abort the hook before
|
|
49
|
+
* propagateLayerUserChange bumps the shiftConfigVersion and purges the
|
|
50
|
+
* feed caches — otherwise the caches would keep serving the pre-edit
|
|
51
|
+
* roster for up to their TTL and the reminder change pass would be
|
|
52
|
+
* skipped. Mirrors
|
|
53
|
+
* OnCallDutyPolicyEscalationRuleScheduleService.refreshScheduleRoster.
|
|
54
|
+
*/
|
|
55
|
+
async refreshScheduleRosterBestEffort(scheduleId) {
|
|
56
|
+
try {
|
|
57
|
+
await OnCallDutyPolicyScheduleService.refreshCurrentUserIdAndHandoffTimeInSchedule(scheduleId);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
logger.error("Error refreshing the schedule roster after a layer-user change (best-effort).");
|
|
61
|
+
logger.error(err);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Renumber the users of a layer 1..n by their current order. Used by the
|
|
66
|
+
* team-member cleanup, which deletes layer-user rows as root (the per-row
|
|
67
|
+
* re-sequencing in onDeleteSuccess only runs for non-root deletes) and
|
|
68
|
+
* must restore the contiguous 1-based order the create-default (count + 1)
|
|
69
|
+
* and delete paths rely on. Idempotent.
|
|
70
|
+
*/
|
|
71
|
+
async resequenceOrderInLayer(onCallDutyPolicyScheduleLayerId) {
|
|
72
|
+
const rows = await this.findBy({
|
|
73
|
+
query: {
|
|
74
|
+
onCallDutyPolicyScheduleLayerId: onCallDutyPolicyScheduleLayerId,
|
|
75
|
+
},
|
|
76
|
+
select: {
|
|
77
|
+
_id: true,
|
|
78
|
+
order: true,
|
|
79
|
+
},
|
|
80
|
+
sort: {
|
|
81
|
+
order: SortOrder.Ascending,
|
|
82
|
+
},
|
|
83
|
+
limit: LIMIT_MAX,
|
|
84
|
+
skip: 0,
|
|
85
|
+
props: {
|
|
86
|
+
isRoot: true,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
let expectedOrder = 1;
|
|
90
|
+
for (const row of rows) {
|
|
91
|
+
if (row.order !== expectedOrder && row._id) {
|
|
92
|
+
/*
|
|
93
|
+
* ignoreHooks: renumbering is bookkeeping, not a roster change — the
|
|
94
|
+
* caller (the team-member cleanup) refreshes and propagates once per
|
|
95
|
+
* schedule itself. With hooks on, every renumbered row would run a
|
|
96
|
+
* full onUpdateSuccess (semaphore-locked roster refresh + version
|
|
97
|
+
* bump + cache purge + listener pass), i.e. N-1 redundant refreshes
|
|
98
|
+
* per layer, and any hook throw would abort the remaining renumbering.
|
|
99
|
+
*/
|
|
100
|
+
await this.updateOneBy({
|
|
101
|
+
query: {
|
|
102
|
+
_id: row._id,
|
|
103
|
+
},
|
|
104
|
+
data: {
|
|
105
|
+
order: expectedOrder,
|
|
106
|
+
},
|
|
107
|
+
props: {
|
|
108
|
+
isRoot: true,
|
|
109
|
+
ignoreHooks: true,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
expectedOrder++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
22
116
|
async onBeforeCreate(createBy) {
|
|
23
117
|
var _a;
|
|
24
118
|
if (!createBy.data.onCallDutyPolicyScheduleLayerId) {
|
|
@@ -55,7 +149,8 @@ export class Service extends DatabaseService {
|
|
|
55
149
|
resource.onCallDutyPolicyScheduleLayerId) {
|
|
56
150
|
await this.rearrangeOrder(resource.order, resource.onCallDutyPolicyScheduleLayerId, false);
|
|
57
151
|
if (resource.onCallDutyPolicyScheduleId) {
|
|
58
|
-
await
|
|
152
|
+
await this.refreshScheduleRosterBestEffort(resource.onCallDutyPolicyScheduleId);
|
|
153
|
+
await this.propagateLayerUserChange(resource.onCallDutyPolicyScheduleId, resource.projectId, resource.userId);
|
|
59
154
|
}
|
|
60
155
|
}
|
|
61
156
|
}
|
|
@@ -79,6 +174,8 @@ export class Service extends DatabaseService {
|
|
|
79
174
|
order: true,
|
|
80
175
|
onCallDutyPolicyScheduleLayerId: true,
|
|
81
176
|
onCallDutyPolicyScheduleId: true,
|
|
177
|
+
projectId: true,
|
|
178
|
+
userId: true,
|
|
82
179
|
},
|
|
83
180
|
});
|
|
84
181
|
}
|
|
@@ -92,6 +189,8 @@ export class Service extends DatabaseService {
|
|
|
92
189
|
id: createdItem.id,
|
|
93
190
|
select: {
|
|
94
191
|
onCallDutyPolicyScheduleId: true,
|
|
192
|
+
projectId: true,
|
|
193
|
+
userId: true,
|
|
95
194
|
},
|
|
96
195
|
props: {
|
|
97
196
|
isRoot: true,
|
|
@@ -100,7 +199,8 @@ export class Service extends DatabaseService {
|
|
|
100
199
|
if (!resource || !resource.onCallDutyPolicyScheduleId) {
|
|
101
200
|
return createdItem;
|
|
102
201
|
}
|
|
103
|
-
await
|
|
202
|
+
await this.refreshScheduleRosterBestEffort(resource.onCallDutyPolicyScheduleId);
|
|
203
|
+
await this.propagateLayerUserChange(resource.onCallDutyPolicyScheduleId, resource.projectId, resource.userId);
|
|
104
204
|
return createdItem;
|
|
105
205
|
}
|
|
106
206
|
async onUpdateSuccess(_onUpdate, updatedItemIds) {
|
|
@@ -109,6 +209,8 @@ export class Service extends DatabaseService {
|
|
|
109
209
|
id: item,
|
|
110
210
|
select: {
|
|
111
211
|
onCallDutyPolicyScheduleId: true,
|
|
212
|
+
projectId: true,
|
|
213
|
+
userId: true,
|
|
112
214
|
},
|
|
113
215
|
props: {
|
|
114
216
|
isRoot: true,
|
|
@@ -117,7 +219,8 @@ export class Service extends DatabaseService {
|
|
|
117
219
|
if (!resource || !resource.onCallDutyPolicyScheduleId) {
|
|
118
220
|
continue;
|
|
119
221
|
}
|
|
120
|
-
await
|
|
222
|
+
await this.refreshScheduleRosterBestEffort(resource.onCallDutyPolicyScheduleId);
|
|
223
|
+
await this.propagateLayerUserChange(resource.onCallDutyPolicyScheduleId, resource.projectId, resource.userId);
|
|
121
224
|
}
|
|
122
225
|
return {
|
|
123
226
|
updateBy: _onUpdate.updateBy,
|
|
@@ -248,6 +351,12 @@ export class Service extends DatabaseService {
|
|
|
248
351
|
}
|
|
249
352
|
}
|
|
250
353
|
}
|
|
354
|
+
__decorate([
|
|
355
|
+
CaptureSpan(),
|
|
356
|
+
__metadata("design:type", Function),
|
|
357
|
+
__metadata("design:paramtypes", [ObjectID]),
|
|
358
|
+
__metadata("design:returntype", Promise)
|
|
359
|
+
], Service.prototype, "resequenceOrderInLayer", null);
|
|
251
360
|
__decorate([
|
|
252
361
|
CaptureSpan(),
|
|
253
362
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OnCallDutyPolicyScheduleLayerUserService.js","sourceRoot":"","sources":["../../../../Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts"],"names":[],"mappings":";;;;;;;;;AAGA,OAAO,WAAW,MAAM,+BAA+B,CAAC;AAExD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,SAAS,MAAM,oCAAoC,CAAC;AAC3D,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"OnCallDutyPolicyScheduleLayerUserService.js","sourceRoot":"","sources":["../../../../Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts"],"names":[],"mappings":"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"}
|