@oneuptime/common 9.5.2 → 9.5.4
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/Alert.ts +28 -0
- package/Models/DatabaseModels/AlertEpisode.ts +27 -0
- package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Incident.ts +28 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +182 -0
- package/Models/DatabaseModels/IncidentEpisodeFeed.ts +2 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +611 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +84 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +36 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +1 -0
- package/Models/DatabaseModels/Project.ts +252 -1
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +28 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -0
- package/Models/DatabaseModels/StatusPage.ts +120 -0
- package/Server/API/IncidentEpisodePublicNoteAPI.ts +98 -0
- package/Server/API/StatusPageAPI.ts +1092 -45
- package/Server/Infrastructure/Postgres/SchemaMigrations/1770232207959-MigrationName.ts +181 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1770237245069-MigrationName.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1770237245070-MigrationName.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1770407024682-MigrationName.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Services/AlertEpisodeMemberService.ts +6 -3
- package/Server/Services/AlertEpisodeService.ts +45 -97
- package/Server/Services/AlertEpisodeStateTimelineService.ts +4 -2
- package/Server/Services/AlertInternalNoteService.ts +5 -2
- package/Server/Services/AlertOwnerTeamService.ts +10 -4
- package/Server/Services/AlertOwnerUserService.ts +10 -4
- package/Server/Services/AlertService.ts +24 -38
- package/Server/Services/AlertStateTimelineService.ts +6 -3
- package/Server/Services/DatabaseService.ts +12 -0
- package/Server/Services/IncidentEpisodeMemberService.ts +8 -4
- package/Server/Services/IncidentEpisodePublicNoteService.ts +257 -0
- package/Server/Services/IncidentEpisodeService.ts +67 -93
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +4 -2
- package/Server/Services/IncidentInternalNoteService.ts +10 -5
- package/Server/Services/IncidentMemberService.ts +20 -10
- package/Server/Services/IncidentOwnerTeamService.ts +20 -10
- package/Server/Services/IncidentOwnerUserService.ts +20 -10
- package/Server/Services/IncidentPublicNoteService.ts +10 -5
- package/Server/Services/IncidentService.ts +34 -110
- package/Server/Services/IncidentStateTimelineService.ts +11 -6
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +61 -39
- package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +31 -19
- package/Server/Services/ProjectService.ts +227 -0
- package/Server/Services/ScheduledMaintenanceInternalNoteService.ts +9 -6
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +9 -6
- package/Server/Services/ScheduledMaintenanceService.ts +27 -39
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +8 -6
- package/Server/Services/UserNotificationRuleService.ts +32 -21
- package/Server/Utils/AI/IncidentEpisodeAIContextBuilder.ts +4 -2
- package/Server/Utils/Browser.ts +28 -20
- package/Server/Utils/Monitor/MonitorAlert.ts +5 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +13 -0
- package/Server/Utils/PushNotificationUtil.ts +69 -26
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +8 -4
- package/Server/Utils/Workspace/Slack/Actions/Alert.ts +20 -8
- package/Server/Utils/Workspace/Slack/Actions/Incident.ts +42 -22
- package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +23 -17
- package/Server/Utils/Workspace/WorkspaceMessages/Alert.ts +1 -0
- package/Server/Utils/Workspace/WorkspaceMessages/Incident.ts +1 -0
- package/Server/Utils/Workspace/WorkspaceMessages/ScheduledMaintenance.ts +1 -0
- package/Types/Email/EmailTemplateType.ts +4 -0
- package/Types/Icon/IconProp.ts +172 -0
- package/Types/Monitor/CriteriaIncident.ts +2 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +2 -0
- package/Types/Permission.ts +40 -0
- package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +5 -0
- package/UI/Components/Icon/Icon.tsx +1333 -1
- package/Utils/Analytics.ts +11 -0
- package/build/dist/Models/DatabaseModels/Alert.js +30 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisode.js +29 -0
- package/build/dist/Models/DatabaseModels/AlertEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +30 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +189 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +626 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +86 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +37 -0
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.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/MonitorStatusTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +267 -1
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +1 -0
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +29 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +126 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodePublicNoteAPI.js +68 -0
- package/build/dist/Server/API/IncidentEpisodePublicNoteAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +874 -47
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770232207959-MigrationName.js +68 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770232207959-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245069-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245069-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245070-MigrationName.js +27 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245070-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770407024682-MigrationName.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770407024682-MigrationName.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/Services/AlertEpisodeMemberService.js +6 -3
- package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +33 -90
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +3 -2
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AlertInternalNoteService.js +2 -2
- package/build/dist/Server/Services/AlertInternalNoteService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerTeamService.js +4 -4
- package/build/dist/Server/Services/AlertOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerUserService.js +4 -4
- package/build/dist/Server/Services/AlertOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +16 -34
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +3 -3
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +9 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +224 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js +47 -82
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +3 -2
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentInternalNoteService.js +4 -2
- package/build/dist/Server/Services/IncidentInternalNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentMemberService.js +8 -4
- package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerTeamService.js +8 -4
- package/build/dist/Server/Services/IncidentOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerUserService.js +8 -4
- package/build/dist/Server/Services/IncidentOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +4 -2
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +24 -94
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +5 -3
- package/build/dist/Server/Services/IncidentStateTimelineService.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/OnCallDutyPolicyExecutionLogService.js +20 -16
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +10 -8
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +207 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js +4 -3
- package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +4 -3
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +16 -37
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +3 -3
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +33 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js +4 -2
- package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Browser.js +19 -12
- package/build/dist/Server/Utils/Browser.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +4 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/PushNotificationUtil.js +36 -28
- package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +8 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +8 -8
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +18 -10
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +8 -8
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +3 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +172 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaIncident.js +1 -0
- package/build/dist/Types/Monitor/CriteriaIncident.js.map +1 -1
- package/build/dist/Types/Permission.js +34 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +502 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/Utils/Analytics.js +5 -0
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/package.json +1 -1
|
@@ -1690,4 +1690,40 @@ export default class IncidentGroupingRule extends BaseModel {
|
|
|
1690
1690
|
transformer: ObjectID.getDatabaseTransformer(),
|
|
1691
1691
|
})
|
|
1692
1692
|
public deletedByUserId?: ObjectID = undefined;
|
|
1693
|
+
|
|
1694
|
+
@ColumnAccessControl({
|
|
1695
|
+
create: [
|
|
1696
|
+
Permission.ProjectOwner,
|
|
1697
|
+
Permission.ProjectAdmin,
|
|
1698
|
+
Permission.CreateIncidentGroupingRule,
|
|
1699
|
+
],
|
|
1700
|
+
read: [
|
|
1701
|
+
Permission.ProjectOwner,
|
|
1702
|
+
Permission.ProjectAdmin,
|
|
1703
|
+
Permission.ProjectMember,
|
|
1704
|
+
Permission.ReadIncidentGroupingRule,
|
|
1705
|
+
Permission.ReadAllProjectResources,
|
|
1706
|
+
],
|
|
1707
|
+
update: [
|
|
1708
|
+
Permission.ProjectOwner,
|
|
1709
|
+
Permission.ProjectAdmin,
|
|
1710
|
+
Permission.EditIncidentGroupingRule,
|
|
1711
|
+
],
|
|
1712
|
+
})
|
|
1713
|
+
@Index()
|
|
1714
|
+
@TableColumn({
|
|
1715
|
+
required: true,
|
|
1716
|
+
type: TableColumnType.Boolean,
|
|
1717
|
+
title: "Show Episodes on Status Page",
|
|
1718
|
+
description:
|
|
1719
|
+
"Should episodes created by this rule be shown on the status page?",
|
|
1720
|
+
defaultValue: false,
|
|
1721
|
+
isDefaultValueColumn: true,
|
|
1722
|
+
})
|
|
1723
|
+
@Column({
|
|
1724
|
+
type: ColumnType.Boolean,
|
|
1725
|
+
nullable: false,
|
|
1726
|
+
default: false,
|
|
1727
|
+
})
|
|
1728
|
+
public showEpisodeOnStatusPage?: boolean = undefined;
|
|
1693
1729
|
}
|
|
@@ -210,6 +210,7 @@ import IncidentEpisodeOwnerUser from "./IncidentEpisodeOwnerUser";
|
|
|
210
210
|
import IncidentEpisodeOwnerTeam from "./IncidentEpisodeOwnerTeam";
|
|
211
211
|
import IncidentEpisodeInternalNote from "./IncidentEpisodeInternalNote";
|
|
212
212
|
import IncidentEpisodeFeed from "./IncidentEpisodeFeed";
|
|
213
|
+
import IncidentEpisodePublicNote from "./IncidentEpisodePublicNote";
|
|
213
214
|
import IncidentGroupingRule from "./IncidentGroupingRule";
|
|
214
215
|
import IncidentSlaRule from "./IncidentSlaRule";
|
|
215
216
|
import IncidentSla from "./IncidentSla";
|
|
@@ -318,6 +319,7 @@ const AllModelTypes: Array<{
|
|
|
318
319
|
IncidentEpisodeOwnerTeam,
|
|
319
320
|
IncidentEpisodeInternalNote,
|
|
320
321
|
IncidentEpisodeFeed,
|
|
322
|
+
IncidentEpisodePublicNote,
|
|
321
323
|
IncidentGroupingRule,
|
|
322
324
|
IncidentSlaRule,
|
|
323
325
|
IncidentSla,
|
|
@@ -584,7 +584,7 @@ export default class Project extends TenantModel {
|
|
|
584
584
|
read: [],
|
|
585
585
|
update: [],
|
|
586
586
|
})
|
|
587
|
-
@TableColumn({ type: TableColumnType.SmallPositiveNumber })
|
|
587
|
+
@TableColumn({ type: TableColumnType.SmallPositiveNumber, computed: true })
|
|
588
588
|
@Column({
|
|
589
589
|
type: ColumnType.SmallPositiveNumber,
|
|
590
590
|
nullable: true,
|
|
@@ -709,6 +709,7 @@ export default class Project extends TenantModel {
|
|
|
709
709
|
@TableColumn({
|
|
710
710
|
type: TableColumnType.Number,
|
|
711
711
|
hideColumnInDocumentation: true,
|
|
712
|
+
computed: true,
|
|
712
713
|
})
|
|
713
714
|
@Column({
|
|
714
715
|
type: ColumnType.Number,
|
|
@@ -717,6 +718,256 @@ export default class Project extends TenantModel {
|
|
|
717
718
|
})
|
|
718
719
|
public currentActiveMonitorsCount?: number = undefined;
|
|
719
720
|
|
|
721
|
+
@ColumnAccessControl({
|
|
722
|
+
create: [],
|
|
723
|
+
read: [],
|
|
724
|
+
update: [],
|
|
725
|
+
})
|
|
726
|
+
@TableColumn({
|
|
727
|
+
type: TableColumnType.Number,
|
|
728
|
+
isDefaultValueColumn: true,
|
|
729
|
+
required: true,
|
|
730
|
+
hideColumnInDocumentation: true,
|
|
731
|
+
computed: true,
|
|
732
|
+
})
|
|
733
|
+
@Column({
|
|
734
|
+
type: ColumnType.Number,
|
|
735
|
+
nullable: false,
|
|
736
|
+
unique: false,
|
|
737
|
+
default: 0,
|
|
738
|
+
})
|
|
739
|
+
public incidentCounter?: number = undefined;
|
|
740
|
+
|
|
741
|
+
@ColumnAccessControl({
|
|
742
|
+
create: [],
|
|
743
|
+
read: [],
|
|
744
|
+
update: [],
|
|
745
|
+
})
|
|
746
|
+
@TableColumn({
|
|
747
|
+
type: TableColumnType.Number,
|
|
748
|
+
isDefaultValueColumn: true,
|
|
749
|
+
required: true,
|
|
750
|
+
hideColumnInDocumentation: true,
|
|
751
|
+
computed: true,
|
|
752
|
+
})
|
|
753
|
+
@Column({
|
|
754
|
+
type: ColumnType.Number,
|
|
755
|
+
nullable: false,
|
|
756
|
+
unique: false,
|
|
757
|
+
default: 0,
|
|
758
|
+
})
|
|
759
|
+
public alertCounter?: number = undefined;
|
|
760
|
+
|
|
761
|
+
@ColumnAccessControl({
|
|
762
|
+
create: [],
|
|
763
|
+
read: [],
|
|
764
|
+
update: [],
|
|
765
|
+
})
|
|
766
|
+
@TableColumn({
|
|
767
|
+
type: TableColumnType.Number,
|
|
768
|
+
isDefaultValueColumn: true,
|
|
769
|
+
required: true,
|
|
770
|
+
hideColumnInDocumentation: true,
|
|
771
|
+
computed: true,
|
|
772
|
+
})
|
|
773
|
+
@Column({
|
|
774
|
+
type: ColumnType.Number,
|
|
775
|
+
nullable: false,
|
|
776
|
+
unique: false,
|
|
777
|
+
default: 0,
|
|
778
|
+
})
|
|
779
|
+
public scheduledMaintenanceCounter?: number = undefined;
|
|
780
|
+
|
|
781
|
+
@ColumnAccessControl({
|
|
782
|
+
create: [],
|
|
783
|
+
read: [],
|
|
784
|
+
update: [],
|
|
785
|
+
})
|
|
786
|
+
@TableColumn({
|
|
787
|
+
type: TableColumnType.Number,
|
|
788
|
+
isDefaultValueColumn: true,
|
|
789
|
+
required: true,
|
|
790
|
+
hideColumnInDocumentation: true,
|
|
791
|
+
computed: true,
|
|
792
|
+
})
|
|
793
|
+
@Column({
|
|
794
|
+
type: ColumnType.Number,
|
|
795
|
+
nullable: false,
|
|
796
|
+
unique: false,
|
|
797
|
+
default: 0,
|
|
798
|
+
})
|
|
799
|
+
public incidentEpisodeCounter?: number = undefined;
|
|
800
|
+
|
|
801
|
+
@ColumnAccessControl({
|
|
802
|
+
create: [],
|
|
803
|
+
read: [],
|
|
804
|
+
update: [],
|
|
805
|
+
})
|
|
806
|
+
@TableColumn({
|
|
807
|
+
type: TableColumnType.Number,
|
|
808
|
+
isDefaultValueColumn: true,
|
|
809
|
+
required: true,
|
|
810
|
+
hideColumnInDocumentation: true,
|
|
811
|
+
computed: true,
|
|
812
|
+
})
|
|
813
|
+
@Column({
|
|
814
|
+
type: ColumnType.Number,
|
|
815
|
+
nullable: false,
|
|
816
|
+
unique: false,
|
|
817
|
+
default: 0,
|
|
818
|
+
})
|
|
819
|
+
public alertEpisodeCounter?: number = undefined;
|
|
820
|
+
|
|
821
|
+
@ColumnAccessControl({
|
|
822
|
+
create: [Permission.User],
|
|
823
|
+
read: [
|
|
824
|
+
Permission.ProjectOwner,
|
|
825
|
+
Permission.ProjectAdmin,
|
|
826
|
+
Permission.ProjectMember,
|
|
827
|
+
Permission.ReadProject,
|
|
828
|
+
Permission.UnAuthorizedSsoUser,
|
|
829
|
+
Permission.ReadAllProjectResources,
|
|
830
|
+
],
|
|
831
|
+
update: [
|
|
832
|
+
Permission.ProjectOwner,
|
|
833
|
+
Permission.ProjectAdmin,
|
|
834
|
+
Permission.EditProject,
|
|
835
|
+
],
|
|
836
|
+
})
|
|
837
|
+
@TableColumn({
|
|
838
|
+
type: TableColumnType.ShortText,
|
|
839
|
+
required: false,
|
|
840
|
+
title: "Incident Number Prefix",
|
|
841
|
+
description:
|
|
842
|
+
"Custom prefix for incident numbers (e.g., 'INC-'). If empty, '#' is used.",
|
|
843
|
+
})
|
|
844
|
+
@Column({
|
|
845
|
+
type: ColumnType.ShortText,
|
|
846
|
+
length: ColumnLength.ShortText,
|
|
847
|
+
nullable: true,
|
|
848
|
+
})
|
|
849
|
+
public incidentNumberPrefix?: string = undefined;
|
|
850
|
+
|
|
851
|
+
@ColumnAccessControl({
|
|
852
|
+
create: [Permission.User],
|
|
853
|
+
read: [
|
|
854
|
+
Permission.ProjectOwner,
|
|
855
|
+
Permission.ProjectAdmin,
|
|
856
|
+
Permission.ProjectMember,
|
|
857
|
+
Permission.ReadProject,
|
|
858
|
+
Permission.UnAuthorizedSsoUser,
|
|
859
|
+
Permission.ReadAllProjectResources,
|
|
860
|
+
],
|
|
861
|
+
update: [
|
|
862
|
+
Permission.ProjectOwner,
|
|
863
|
+
Permission.ProjectAdmin,
|
|
864
|
+
Permission.EditProject,
|
|
865
|
+
],
|
|
866
|
+
})
|
|
867
|
+
@TableColumn({
|
|
868
|
+
type: TableColumnType.ShortText,
|
|
869
|
+
required: false,
|
|
870
|
+
title: "Alert Number Prefix",
|
|
871
|
+
description:
|
|
872
|
+
"Custom prefix for alert numbers (e.g., 'ALT-'). If empty, '#' is used.",
|
|
873
|
+
})
|
|
874
|
+
@Column({
|
|
875
|
+
type: ColumnType.ShortText,
|
|
876
|
+
length: ColumnLength.ShortText,
|
|
877
|
+
nullable: true,
|
|
878
|
+
})
|
|
879
|
+
public alertNumberPrefix?: string = undefined;
|
|
880
|
+
|
|
881
|
+
@ColumnAccessControl({
|
|
882
|
+
create: [Permission.User],
|
|
883
|
+
read: [
|
|
884
|
+
Permission.ProjectOwner,
|
|
885
|
+
Permission.ProjectAdmin,
|
|
886
|
+
Permission.ProjectMember,
|
|
887
|
+
Permission.ReadProject,
|
|
888
|
+
Permission.UnAuthorizedSsoUser,
|
|
889
|
+
Permission.ReadAllProjectResources,
|
|
890
|
+
],
|
|
891
|
+
update: [
|
|
892
|
+
Permission.ProjectOwner,
|
|
893
|
+
Permission.ProjectAdmin,
|
|
894
|
+
Permission.EditProject,
|
|
895
|
+
],
|
|
896
|
+
})
|
|
897
|
+
@TableColumn({
|
|
898
|
+
type: TableColumnType.ShortText,
|
|
899
|
+
required: false,
|
|
900
|
+
title: "Scheduled Maintenance Number Prefix",
|
|
901
|
+
description:
|
|
902
|
+
"Custom prefix for scheduled maintenance numbers (e.g., 'SM-'). If empty, '#' is used.",
|
|
903
|
+
})
|
|
904
|
+
@Column({
|
|
905
|
+
type: ColumnType.ShortText,
|
|
906
|
+
length: ColumnLength.ShortText,
|
|
907
|
+
nullable: true,
|
|
908
|
+
})
|
|
909
|
+
public scheduledMaintenanceNumberPrefix?: string = undefined;
|
|
910
|
+
|
|
911
|
+
@ColumnAccessControl({
|
|
912
|
+
create: [Permission.User],
|
|
913
|
+
read: [
|
|
914
|
+
Permission.ProjectOwner,
|
|
915
|
+
Permission.ProjectAdmin,
|
|
916
|
+
Permission.ProjectMember,
|
|
917
|
+
Permission.ReadProject,
|
|
918
|
+
Permission.UnAuthorizedSsoUser,
|
|
919
|
+
Permission.ReadAllProjectResources,
|
|
920
|
+
],
|
|
921
|
+
update: [
|
|
922
|
+
Permission.ProjectOwner,
|
|
923
|
+
Permission.ProjectAdmin,
|
|
924
|
+
Permission.EditProject,
|
|
925
|
+
],
|
|
926
|
+
})
|
|
927
|
+
@TableColumn({
|
|
928
|
+
type: TableColumnType.ShortText,
|
|
929
|
+
required: false,
|
|
930
|
+
title: "Incident Episode Number Prefix",
|
|
931
|
+
description:
|
|
932
|
+
"Custom prefix for incident episode numbers (e.g., 'IE-'). If empty, '#' is used.",
|
|
933
|
+
})
|
|
934
|
+
@Column({
|
|
935
|
+
type: ColumnType.ShortText,
|
|
936
|
+
length: ColumnLength.ShortText,
|
|
937
|
+
nullable: true,
|
|
938
|
+
})
|
|
939
|
+
public incidentEpisodeNumberPrefix?: string = undefined;
|
|
940
|
+
|
|
941
|
+
@ColumnAccessControl({
|
|
942
|
+
create: [Permission.User],
|
|
943
|
+
read: [
|
|
944
|
+
Permission.ProjectOwner,
|
|
945
|
+
Permission.ProjectAdmin,
|
|
946
|
+
Permission.ProjectMember,
|
|
947
|
+
Permission.ReadProject,
|
|
948
|
+
Permission.UnAuthorizedSsoUser,
|
|
949
|
+
Permission.ReadAllProjectResources,
|
|
950
|
+
],
|
|
951
|
+
update: [
|
|
952
|
+
Permission.ProjectOwner,
|
|
953
|
+
Permission.ProjectAdmin,
|
|
954
|
+
Permission.EditProject,
|
|
955
|
+
],
|
|
956
|
+
})
|
|
957
|
+
@TableColumn({
|
|
958
|
+
type: TableColumnType.ShortText,
|
|
959
|
+
required: false,
|
|
960
|
+
title: "Alert Episode Number Prefix",
|
|
961
|
+
description:
|
|
962
|
+
"Custom prefix for alert episode numbers (e.g., 'AE-'). If empty, '#' is used.",
|
|
963
|
+
})
|
|
964
|
+
@Column({
|
|
965
|
+
type: ColumnType.ShortText,
|
|
966
|
+
length: ColumnLength.ShortText,
|
|
967
|
+
nullable: true,
|
|
968
|
+
})
|
|
969
|
+
public alertEpisodeNumberPrefix?: string = undefined;
|
|
970
|
+
|
|
720
971
|
@ColumnAccessControl({
|
|
721
972
|
create: [],
|
|
722
973
|
read: [
|
|
@@ -181,6 +181,7 @@ export default class ProjectCallSMSConfig extends BaseModel {
|
|
|
181
181
|
required: true,
|
|
182
182
|
unique: true,
|
|
183
183
|
type: TableColumnType.Slug,
|
|
184
|
+
computed: true,
|
|
184
185
|
title: "Slug",
|
|
185
186
|
description: "Friendly globally unique name for your object",
|
|
186
187
|
example: "production-twilio-config",
|
|
@@ -253,6 +253,7 @@ export default class ScheduledMaintenance extends BaseModel {
|
|
|
253
253
|
required: true,
|
|
254
254
|
unique: true,
|
|
255
255
|
type: TableColumnType.Slug,
|
|
256
|
+
computed: true,
|
|
256
257
|
title: "Slug",
|
|
257
258
|
description: "Friendly globally unique name for your object",
|
|
258
259
|
})
|
|
@@ -1072,6 +1073,33 @@ export default class ScheduledMaintenance extends BaseModel {
|
|
|
1072
1073
|
})
|
|
1073
1074
|
public scheduledMaintenanceNumber?: number = undefined;
|
|
1074
1075
|
|
|
1076
|
+
@ColumnAccessControl({
|
|
1077
|
+
create: [],
|
|
1078
|
+
read: [
|
|
1079
|
+
Permission.ProjectOwner,
|
|
1080
|
+
Permission.ProjectAdmin,
|
|
1081
|
+
Permission.ProjectMember,
|
|
1082
|
+
Permission.ReadProjectScheduledMaintenance,
|
|
1083
|
+
Permission.ReadAllProjectResources,
|
|
1084
|
+
],
|
|
1085
|
+
update: [],
|
|
1086
|
+
})
|
|
1087
|
+
@TableColumn({
|
|
1088
|
+
isDefaultValueColumn: false,
|
|
1089
|
+
required: false,
|
|
1090
|
+
type: TableColumnType.ShortText,
|
|
1091
|
+
title: "Scheduled Maintenance Number With Prefix",
|
|
1092
|
+
description:
|
|
1093
|
+
"Scheduled maintenance number with prefix (e.g., 'SM-42' or '#42')",
|
|
1094
|
+
computed: true,
|
|
1095
|
+
})
|
|
1096
|
+
@Column({
|
|
1097
|
+
type: ColumnType.ShortText,
|
|
1098
|
+
length: ColumnLength.ShortText,
|
|
1099
|
+
nullable: true,
|
|
1100
|
+
})
|
|
1101
|
+
public scheduledMaintenanceNumberWithPrefix?: string = undefined;
|
|
1102
|
+
|
|
1075
1103
|
@ColumnAccessControl({
|
|
1076
1104
|
create: [],
|
|
1077
1105
|
read: [],
|
|
@@ -865,6 +865,7 @@ export default class ScheduledMaintenanceTemplate extends BaseModel {
|
|
|
865
865
|
@TableColumn({
|
|
866
866
|
isDefaultValueColumn: false,
|
|
867
867
|
type: TableColumnType.Date,
|
|
868
|
+
computed: true,
|
|
868
869
|
title: "Schedule Next Event At",
|
|
869
870
|
description: "When is the next event scheduled?",
|
|
870
871
|
example: "2024-03-29T02:00:00.000Z",
|
|
@@ -2357,6 +2357,126 @@ export default class StatusPage extends BaseModel {
|
|
|
2357
2357
|
})
|
|
2358
2358
|
public showAnnouncementsOnStatusPage?: boolean = undefined;
|
|
2359
2359
|
|
|
2360
|
+
@ColumnAccessControl({
|
|
2361
|
+
create: [
|
|
2362
|
+
Permission.ProjectOwner,
|
|
2363
|
+
Permission.ProjectAdmin,
|
|
2364
|
+
Permission.ProjectMember,
|
|
2365
|
+
Permission.CreateProjectStatusPage,
|
|
2366
|
+
],
|
|
2367
|
+
read: [
|
|
2368
|
+
Permission.ProjectOwner,
|
|
2369
|
+
Permission.ProjectAdmin,
|
|
2370
|
+
Permission.ProjectMember,
|
|
2371
|
+
Permission.ReadProjectStatusPage,
|
|
2372
|
+
Permission.ReadAllProjectResources,
|
|
2373
|
+
],
|
|
2374
|
+
update: [
|
|
2375
|
+
Permission.ProjectOwner,
|
|
2376
|
+
Permission.ProjectAdmin,
|
|
2377
|
+
Permission.ProjectMember,
|
|
2378
|
+
Permission.EditProjectStatusPage,
|
|
2379
|
+
],
|
|
2380
|
+
})
|
|
2381
|
+
@TableColumn({
|
|
2382
|
+
isDefaultValueColumn: true,
|
|
2383
|
+
type: TableColumnType.Boolean,
|
|
2384
|
+
title: "Show Incident Episodes on Status Page",
|
|
2385
|
+
description: "Show Incident Episodes on Status Page?",
|
|
2386
|
+
defaultValue: true,
|
|
2387
|
+
})
|
|
2388
|
+
@Column({
|
|
2389
|
+
type: ColumnType.Boolean,
|
|
2390
|
+
default: true,
|
|
2391
|
+
nullable: false,
|
|
2392
|
+
})
|
|
2393
|
+
@ColumnBillingAccessControl({
|
|
2394
|
+
read: PlanType.Free,
|
|
2395
|
+
update: PlanType.Growth,
|
|
2396
|
+
create: PlanType.Free,
|
|
2397
|
+
})
|
|
2398
|
+
public showEpisodesOnStatusPage?: boolean = undefined;
|
|
2399
|
+
|
|
2400
|
+
@ColumnAccessControl({
|
|
2401
|
+
create: [
|
|
2402
|
+
Permission.ProjectOwner,
|
|
2403
|
+
Permission.ProjectAdmin,
|
|
2404
|
+
Permission.ProjectMember,
|
|
2405
|
+
Permission.CreateProjectStatusPage,
|
|
2406
|
+
],
|
|
2407
|
+
read: [
|
|
2408
|
+
Permission.ProjectOwner,
|
|
2409
|
+
Permission.ProjectAdmin,
|
|
2410
|
+
Permission.ProjectMember,
|
|
2411
|
+
Permission.ReadProjectStatusPage,
|
|
2412
|
+
Permission.ReadAllProjectResources,
|
|
2413
|
+
],
|
|
2414
|
+
update: [
|
|
2415
|
+
Permission.ProjectOwner,
|
|
2416
|
+
Permission.ProjectAdmin,
|
|
2417
|
+
Permission.ProjectMember,
|
|
2418
|
+
Permission.EditProjectStatusPage,
|
|
2419
|
+
],
|
|
2420
|
+
})
|
|
2421
|
+
@TableColumn({
|
|
2422
|
+
isDefaultValueColumn: true,
|
|
2423
|
+
type: TableColumnType.Number,
|
|
2424
|
+
title: "Show Episode History In Days",
|
|
2425
|
+
description: "How many days of episode history to show on the status page",
|
|
2426
|
+
defaultValue: 14,
|
|
2427
|
+
})
|
|
2428
|
+
@Column({
|
|
2429
|
+
type: ColumnType.Number,
|
|
2430
|
+
default: 14,
|
|
2431
|
+
nullable: false,
|
|
2432
|
+
})
|
|
2433
|
+
@ColumnBillingAccessControl({
|
|
2434
|
+
read: PlanType.Free,
|
|
2435
|
+
update: PlanType.Growth,
|
|
2436
|
+
create: PlanType.Free,
|
|
2437
|
+
})
|
|
2438
|
+
public showEpisodeHistoryInDays?: number = undefined;
|
|
2439
|
+
|
|
2440
|
+
@ColumnAccessControl({
|
|
2441
|
+
create: [
|
|
2442
|
+
Permission.ProjectOwner,
|
|
2443
|
+
Permission.ProjectAdmin,
|
|
2444
|
+
Permission.ProjectMember,
|
|
2445
|
+
Permission.CreateProjectStatusPage,
|
|
2446
|
+
],
|
|
2447
|
+
read: [
|
|
2448
|
+
Permission.ProjectOwner,
|
|
2449
|
+
Permission.ProjectAdmin,
|
|
2450
|
+
Permission.ProjectMember,
|
|
2451
|
+
Permission.ReadProjectStatusPage,
|
|
2452
|
+
Permission.ReadAllProjectResources,
|
|
2453
|
+
],
|
|
2454
|
+
update: [
|
|
2455
|
+
Permission.ProjectOwner,
|
|
2456
|
+
Permission.ProjectAdmin,
|
|
2457
|
+
Permission.ProjectMember,
|
|
2458
|
+
Permission.EditProjectStatusPage,
|
|
2459
|
+
],
|
|
2460
|
+
})
|
|
2461
|
+
@TableColumn({
|
|
2462
|
+
isDefaultValueColumn: true,
|
|
2463
|
+
type: TableColumnType.Boolean,
|
|
2464
|
+
title: "Show Episode Labels on Status Page",
|
|
2465
|
+
description: "Show Episode Labels on Status Page?",
|
|
2466
|
+
defaultValue: false,
|
|
2467
|
+
})
|
|
2468
|
+
@Column({
|
|
2469
|
+
type: ColumnType.Boolean,
|
|
2470
|
+
default: false,
|
|
2471
|
+
nullable: false,
|
|
2472
|
+
})
|
|
2473
|
+
@ColumnBillingAccessControl({
|
|
2474
|
+
read: PlanType.Free,
|
|
2475
|
+
update: PlanType.Growth,
|
|
2476
|
+
create: PlanType.Free,
|
|
2477
|
+
})
|
|
2478
|
+
public showEpisodeLabelsOnStatusPage?: boolean = undefined;
|
|
2479
|
+
|
|
2360
2480
|
@ColumnAccessControl({
|
|
2361
2481
|
create: [
|
|
2362
2482
|
Permission.ProjectOwner,
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import IncidentEpisodePublicNote from "../../Models/DatabaseModels/IncidentEpisodePublicNote";
|
|
2
|
+
import File from "../../Models/DatabaseModels/File";
|
|
3
|
+
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
4
|
+
import ObjectID from "../../Types/ObjectID";
|
|
5
|
+
import IncidentEpisodePublicNoteService, {
|
|
6
|
+
Service as IncidentEpisodePublicNoteServiceType,
|
|
7
|
+
} from "../Services/IncidentEpisodePublicNoteService";
|
|
8
|
+
import Response from "../Utils/Response";
|
|
9
|
+
import BaseAPI from "./BaseAPI";
|
|
10
|
+
import UserMiddleware from "../Middleware/UserAuthorization";
|
|
11
|
+
import {
|
|
12
|
+
ExpressRequest,
|
|
13
|
+
ExpressResponse,
|
|
14
|
+
NextFunction,
|
|
15
|
+
} from "../Utils/Express";
|
|
16
|
+
import CommonAPI from "./CommonAPI";
|
|
17
|
+
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
18
|
+
|
|
19
|
+
export default class IncidentEpisodePublicNoteAPI extends BaseAPI<
|
|
20
|
+
IncidentEpisodePublicNote,
|
|
21
|
+
IncidentEpisodePublicNoteServiceType
|
|
22
|
+
> {
|
|
23
|
+
public constructor() {
|
|
24
|
+
super(IncidentEpisodePublicNote, IncidentEpisodePublicNoteService);
|
|
25
|
+
|
|
26
|
+
this.router.get(
|
|
27
|
+
`${new this.entityType().getCrudApiPath()?.toString()}/attachment/:projectId/:noteId/:fileId`,
|
|
28
|
+
UserMiddleware.getUserMiddleware,
|
|
29
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
30
|
+
try {
|
|
31
|
+
await this.getAttachment(req, res);
|
|
32
|
+
} catch (err) {
|
|
33
|
+
next(err);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private async getAttachment(
|
|
40
|
+
req: ExpressRequest,
|
|
41
|
+
res: ExpressResponse,
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
const noteIdParam: string | undefined = req.params["noteId"];
|
|
44
|
+
const fileIdParam: string | undefined = req.params["fileId"];
|
|
45
|
+
|
|
46
|
+
if (!noteIdParam || !fileIdParam) {
|
|
47
|
+
throw new NotFoundException("Attachment not found");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let noteId: ObjectID;
|
|
51
|
+
let fileId: ObjectID;
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
noteId = new ObjectID(noteIdParam);
|
|
55
|
+
fileId = new ObjectID(fileIdParam);
|
|
56
|
+
} catch {
|
|
57
|
+
throw new NotFoundException("Attachment not found");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const props: DatabaseCommonInteractionProps =
|
|
61
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
62
|
+
|
|
63
|
+
const note: IncidentEpisodePublicNote | null = await this.service.findOneBy(
|
|
64
|
+
{
|
|
65
|
+
query: {
|
|
66
|
+
_id: noteId,
|
|
67
|
+
},
|
|
68
|
+
select: {
|
|
69
|
+
attachments: {
|
|
70
|
+
_id: true,
|
|
71
|
+
file: true,
|
|
72
|
+
fileType: true,
|
|
73
|
+
name: true,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
props,
|
|
77
|
+
},
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const attachment: File | undefined = note?.attachments?.find(
|
|
81
|
+
(file: File) => {
|
|
82
|
+
const attachmentId: string | null = file._id
|
|
83
|
+
? file._id.toString()
|
|
84
|
+
: file.id
|
|
85
|
+
? file.id.toString()
|
|
86
|
+
: null;
|
|
87
|
+
return attachmentId === fileId.toString();
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
if (!attachment || !attachment.file) {
|
|
92
|
+
throw new NotFoundException("Attachment not found");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
Response.setNoCacheHeaders(res);
|
|
96
|
+
return Response.sendFileResponse(req, res, attachment);
|
|
97
|
+
}
|
|
98
|
+
}
|