Compare commits

...

2 Commits

Author SHA1 Message Date
Simon Larsen
71a0edb7dd ```text
refactor: Update MonitorReport API endpoint route

This commit updates the API endpoint route for the MonitorReport model. The route is changed from "/status-page" to "/monitor-report" in the MonitorReport.ts file. This change ensures consistency and clarity in the API routes, aligning them with the model name.
2024-07-23 10:42:20 -06:00
Simon Larsen
a53b24ed05 refactor: Add Monitor Reports to SideMenu
This commit adds the "Monitor Reports" option to the SideMenu in the Monitor page. It includes the necessary code changes in the MonitorReports.tsx, MonitorReport/View/Index.tsx, MonitorReport/View/Delete.tsx, MonitorReport/View/Settings.tsx, and SideMenu.tsx files. The new option allows users to access and manage monitor reports directly from the SideMenu, improving the navigation and usability of the Monitor page.
2024-07-23 10:25:33 -06:00
15 changed files with 1476 additions and 12 deletions

View File

@@ -124,6 +124,7 @@ enum IconProp {
NoSignal = "NoSignal",
EyeSlash = "EyeSlash",
SquareStack3D = "SquareStack3D",
DocumentText = "DocumentText",
}
export default IconProp;

View File

@@ -89,6 +89,21 @@ enum Permission {
EditMonitorGroupResource = "EditMonitorGroupResource",
ReadMonitorGroupResource = "ReadMonitorGroupResource",
CreateMonitorReport = "CreateMonitorReport",
DeleteMonitorReport = "DeleteMonitorReport",
EditMonitorReport = "EditMonitorReport",
ReadMonitorReport = "ReadMonitorReport",
CreateMonitorReportSubscriber = "CreateMonitorReportSubscriber",
DeleteMonitorReportSubscriber = "DeleteMonitorReportSubscriber",
EditMonitorReportSubscriber = "EditMonitorReportSubscriber",
ReadMonitorReportSubscriber = "ReadMonitorReportSubscriber",
CreateMonitorReportMonitor = "CreateMonitorReportMonitor",
DeleteMonitorReportMonitor = "DeleteMonitorReportMonitor",
EditMonitorReportMonitor = "EditMonitorReportMonitor",
ReadMonitorReportMonitor = "ReadMonitorReportMonitor",
CreateMonitorCustomField = "CreateMonitorCustomField",
DeleteMonitorCustomField = "DeleteMonitorCustomField",
EditMonitorCustomField = "EditMonitorCustomField",
@@ -2069,30 +2084,88 @@ export class PermissionHelper {
},
{
permission: Permission.CreateMonitorGroupResource,
title: "Create Monitor Group Resource",
description: "This permission can create monitor group resource.",
permission: Permission.CreateMonitorReport,
title: "Create Monitor Report",
description: "This permission can create Monitor Report.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.DeleteMonitorGroupResource,
title: "Delete Monitor Group Resource",
description: "This permission can delete monitor group resource.",
permission: Permission.DeleteMonitorReport,
title: "Delete Monitor Report",
description: "This permission can delete Monitor Report.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.EditMonitorGroupResource,
title: "Edit Monitor Group Resource",
description: "This permission can edit monitor group resource.",
permission: Permission.EditMonitorReport,
title: "Edit Monitor Report",
description: "This permission can edit Monitor Report.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.ReadMonitorGroupResource,
title: "Read Monitor Group Resource",
description: "This permission can read monitor group resource.",
permission: Permission.ReadMonitorReport,
title: "Read Monitor Report",
description: "This permission can read Monitor Report.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CreateMonitorReportSubscriber,
title: "Create Monitor Report Subscriber",
description: "This permission can create Monitor Report Subscriber.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.DeleteMonitorReportSubscriber,
title: "Delete Monitor Report Subscriber",
description: "This permission can delete Monitor Report Subscriber.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.EditMonitorReportSubscriber,
title: "Edit Monitor Report Subscriber",
description: "This permission can edit Monitor Report Subscriber.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.ReadMonitorReportSubscriber,
title: "Read Monitor Report Subscriber",
description: "This permission can read Monitor Report Subscriber.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.CreateMonitorReportMonitor,
title: "Create Monitor Report Monitor",
description: "This permission can create Monitor Report Monitor.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.DeleteMonitorReportMonitor,
title: "Delete Monitor Report Monitor",
description: "This permission can delete Monitor Report Monitor.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.EditMonitorReportMonitor,
title: "Edit Monitor Report Monitor",
description: "This permission can edit Monitor Report Monitor.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},
{
permission: Permission.ReadMonitorReportMonitor,
title: "Read Monitor Report Monitor",
description: "This permission can read Monitor Report Monitor.",
isAssignableToTenant: true,
isAccessControlPermission: false,
},

View File

@@ -0,0 +1,11 @@
import PostgresDatabase from "../Infrastructure/PostgresDatabase";
import DatabaseService from "./DatabaseService";
import Model from "Model/Models/MonitorReport";
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {
super(Model, postgresDatabase);
}
}
export default new Service();

View File

@@ -138,6 +138,14 @@ const Icon: FunctionComponent<ComponentProps> = ({
d="m3 3 8.735 8.735m0 0a.374.374 0 1 1 .53.53m-.53-.53.53.53m0 0L21 21M14.652 9.348a3.75 3.75 0 0 1 0 5.304m2.121-7.425a6.75 6.75 0 0 1 0 9.546m2.121-11.667c3.808 3.807 3.808 9.98 0 13.788m-9.546-4.242a3.733 3.733 0 0 1-1.06-2.122m-1.061 4.243a6.75 6.75 0 0 1-1.625-6.929m-.496 9.05c-3.068-3.067-3.664-7.67-1.79-11.334M12 12h.008v.008H12V12Z"
/>,
);
} else if (icon === IconProp.DocumentText) {
return getSvgWrapper(
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"
/>,
);
} else if (icon === IconProp.EyeSlash) {
return getSvgWrapper(
<path

View File

@@ -115,6 +115,18 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
}}
/>
</SideMenuSection>
<SideMenuSection title="More">
<SideMenuItem
link={{
title: "Monitor Reports",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.MONITOR_REPORTS] as Route,
),
}}
icon={IconProp.DocumentText}
/>
</SideMenuSection>
</SideMenu>
);
};

View File

@@ -79,6 +79,14 @@ enum PageMap {
SCHEDULED_MAINTENANCE_VIEW_OWNERS = "SCHEDULED_MAINTENANCE_VIEW_OWNERS",
MONITORS = "MONITORS",
MONITOR_REPORTS_ROOT = "MONITOR_REPORTS_ROOT",
MONITOR_REPORTS = "MONITOR_REPORTS",
MONITOR_REPORT_VIEW = "MONITOR_REPORT_VIEW",
MONITOR_REPORT_VIEW_DELETE = "MONITOR_REPORT_VIEW_DELETE",
MONITOR_REPORT_VIEW_SETTINGS = "MONITOR_REPORT_VIEW_SETTINGS",
MONITOR_REPORT_VIEW_MONITORS = "MONITOR_REPORT_VIEW_MONITORS",
MONITORS_ROOT = "MONITORS_ROOT",
MONITORS_INOPERATIONAL = "MONITORS_INOPERATIONAL",
MONITORS_DISABLED = "MONITORS_DISABLED",

View File

@@ -228,6 +228,33 @@ const RouteMap: Dictionary<Route> = {
[PageMap.MONITORS_ROOT]: new Route(
`/dashboard/${RouteParams.ProjectID}/monitors/*`,
),
[PageMap.MONITOR_REPORTS]: new Route(
`/dashboard/${RouteParams.ProjectID}/monitors/reports`,
),
[PageMap.MONITOR_REPORTS_ROOT]: new Route(
`/dashboard/${RouteParams.ProjectID}/monitors/reports`,
),
[PageMap.MONITOR_REPORT_VIEW]: new Route(
`/dashboard/${RouteParams.ProjectID}/monitors/reports/${
RouteParams.ModelID
}`,
),
[PageMap.MONITOR_REPORT_VIEW_DELETE]: new Route(
`/dashboard/${RouteParams.ProjectID}/monitors/reports/${
RouteParams.ModelID
}/delete`,
),
[PageMap.MONITOR_REPORT_VIEW_SETTINGS]: new Route(
`/dashboard/${RouteParams.ProjectID}/monitors/reports/${
RouteParams.ModelID
}/settings`,
),
[PageMap.MONITORS]: new Route(`/dashboard/${RouteParams.ProjectID}/monitors`),
[PageMap.MONITORS_INOPERATIONAL]: new Route(

View File

@@ -131,6 +131,10 @@ import ServiceCatalogDependency from "./ServiceCatalogDependency";
import ServiceCatalogMonitor from "./ServiceCatalogMonitor";
import ServiceCatalogTelemetryService from "./ServiceCatalogTelemetryService";
// Monitor Report.
import MonitorReport from "./MonitorReport";
export default [
User,
Probe,
@@ -281,4 +285,6 @@ export default [
ProbeOwnerTeam,
ProbeOwnerUser,
MonitorReport
];

View File

@@ -0,0 +1,638 @@
import File from "./File";
import Label from "./Label";
import MonitorStatus from "./MonitorStatus";
import Project from "./Project";
import ProjectSmtpConfig from "./ProjectSmtpConfig";
import User from "./User";
import BaseModel from "Common/Models/BaseModel";
import Route from "Common/Types/API/Route";
import ColumnAccessControl from "Common/Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "Common/Types/Database/AccessControl/TableAccessControl";
import AccessControlColumn from "Common/Types/Database/AccessControlColumn";
import ColumnLength from "Common/Types/Database/ColumnLength";
import ColumnType from "Common/Types/Database/ColumnType";
import CrudApiEndpoint from "Common/Types/Database/CrudApiEndpoint";
import EnableDocumentation from "Common/Types/Database/EnableDocumentation";
import EnableWorkflow from "Common/Types/Database/EnableWorkflow";
import SlugifyColumn from "Common/Types/Database/SlugifyColumn";
import TableColumn from "Common/Types/Database/TableColumn";
import TableColumnType from "Common/Types/Database/TableColumnType";
import TableMetadata from "Common/Types/Database/TableMetadata";
import TenantColumn from "Common/Types/Database/TenantColumn";
import UniqueColumnBy from "Common/Types/Database/UniqueColumnBy";
import IconProp from "Common/Types/Icon/IconProp";
import { JSONObject } from "Common/Types/JSON";
import ObjectID from "Common/Types/ObjectID";
import Permission from "Common/Types/Permission";
import {
Column,
Entity,
Index,
JoinColumn,
JoinTable,
ManyToMany,
ManyToOne,
} from "typeorm";
@EnableDocumentation()
@AccessControlColumn("labels")
@TenantColumn("projectId")
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
delete: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.DeleteMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@EnableWorkflow({
create: true,
delete: true,
update: true,
read: true,
})
@CrudApiEndpoint(new Route("/monitor-report"))
@SlugifyColumn("name", "slug")
@Entity({
name: "MonitorReport",
})
@TableMetadata({
tableName: "MonitorReport",
singularName: "Monitor Report",
pluralName: "Monitor Reports",
icon: IconProp.DocumentText,
tableDescription: "Manage Reports for your Monitors",
})
export default class MonitorReport extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@UniqueColumnBy("projectId")
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@Index()
@TableColumn({
required: true,
type: TableColumnType.ShortText,
title: "Name",
description: "Any friendly name of this object",
canReadOnRelationQuery: true,
})
@Column({
nullable: false,
type: ColumnType.ShortText,
length: ColumnLength.ShortText,
})
public name?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@TableColumn({
required: false,
type: TableColumnType.LongText,
title: "Description",
description: "Friendly description that will help you remember",
})
@Column({
nullable: true,
type: ColumnType.LongText,
length: ColumnLength.LongText,
})
public description?: string = undefined;
@Index()
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [],
})
@TableColumn({
required: true,
unique: true,
type: TableColumnType.Slug,
title: "Slug",
description: "Friendly globally unique name for your object",
})
@Column({
nullable: false,
type: ColumnType.Slug,
length: ColumnLength.Slug,
unique: true,
})
public slug?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@TableColumn({
required: false,
type: TableColumnType.EntityArray,
modelType: Label,
title: "Labels",
description:
"Relation to Labels Array where this object is categorized in.",
})
@ManyToMany(
() => {
return Label;
},
{ eager: false },
)
@JoinTable({
name: "MonitorReportLabel",
inverseJoinColumn: {
name: "labelId",
referencedColumnName: "_id",
},
joinColumn: {
name: "monitorReportId",
referencedColumnName: "_id",
},
})
public labels?: Array<Label> = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@TableColumn({
manyToOneRelationColumn: "logoFileId",
type: TableColumnType.Entity,
modelType: File,
title: "Logo",
description: "Monitor Report Logo",
})
@ManyToOne(
() => {
return File;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "delete",
},
)
@JoinColumn({ name: "logoFileId" })
public logoFile?: File = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Logo",
description: "Monitor Report Logo File ID",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public logoFileId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@TableColumn({
isDefaultValueColumn: false,
required: false,
type: TableColumnType.JSON,
title: "Custom Fields",
description: "Custom Fields on this resource.",
})
@Column({
type: ColumnType.JSON,
nullable: true,
})
public customFields?: JSONObject = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@TableColumn({
manyToOneRelationColumn: "smtpConfigId",
type: TableColumnType.Entity,
modelType: ProjectSmtpConfig,
title: "SMTP Config",
description:
"Relation to SMTP Config Resource which is used to send email to subscribers.",
})
@ManyToOne(
() => {
return ProjectSmtpConfig;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "smtpConfigId" })
public smtpConfig?: ProjectSmtpConfig = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
canReadOnRelationQuery: true,
title: "SMTP Config ID",
description:
"ID of your SMTP Config Resource which is used to send email to subscribers.",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public smtpConfigId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReport,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReport,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReport,
],
})
@TableColumn({
required: false,
type: TableColumnType.EntityArray,
modelType: MonitorStatus,
title: "Downtime Monitor Statuses",
description:
'List of monitors statuses that are considered as "down" for this status page.',
})
@ManyToMany(
() => {
return MonitorStatus;
},
{ eager: false },
)
@JoinTable({
name: "MonitorReportDownMonitorStatus",
inverseJoinColumn: {
name: "monitorStatusId",
referencedColumnName: "_id",
},
joinColumn: {
name: "monitorReportId",
referencedColumnName: "_id",
},
})
public downtimeMonitorStatuses?: Array<MonitorStatus> = undefined;
}

View File

@@ -0,0 +1,680 @@
import Monitor from "./Monitor";
import MonitorGroup from "./MonitorGroup";
import Project from "./Project";
import MonitorReport from "./MonitorReport";
import User from "./User";
import BaseModel from "Common/Models/BaseModel";
import Route from "Common/Types/API/Route";
import ColumnAccessControl from "Common/Types/Database/AccessControl/ColumnAccessControl";
import TableAccessControl from "Common/Types/Database/AccessControl/TableAccessControl";
import CanAccessIfCanReadOn from "Common/Types/Database/CanAccessIfCanReadOn";
import ColumnLength from "Common/Types/Database/ColumnLength";
import ColumnType from "Common/Types/Database/ColumnType";
import CrudApiEndpoint from "Common/Types/Database/CrudApiEndpoint";
import EnableDocumentation from "Common/Types/Database/EnableDocumentation";
import EnableWorkflow from "Common/Types/Database/EnableWorkflow";
import SlugifyColumn from "Common/Types/Database/SlugifyColumn";
import TableColumn from "Common/Types/Database/TableColumn";
import TableColumnType from "Common/Types/Database/TableColumnType";
import TableMetadata from "Common/Types/Database/TableMetadata";
import TenantColumn from "Common/Types/Database/TenantColumn";
import IconProp from "Common/Types/Icon/IconProp";
import ObjectID from "Common/Types/ObjectID";
import Permission from "Common/Types/Permission";
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
export enum UptimePrecision {
NO_DECIMAL = "99% (No Decimal)",
ONE_DECIMAL = "99.9% (One Decimal)",
TWO_DECIMAL = "99.99% (Two Decimal)",
THREE_DECIMAL = "99.999% (Three Decimal)",
}
@EnableDocumentation()
@CanAccessIfCanReadOn("monitorReport")
@TenantColumn("projectId")
@TableAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
delete: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.DeleteMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@EnableWorkflow({
create: true,
delete: true,
update: true,
read: true,
})
@CrudApiEndpoint(new Route("/monitor-report-monitor"))
@SlugifyColumn("name", "slug")
@TableMetadata({
tableName: "MonitorReportMonitor",
singularName: "Monitor in Monitor Report",
pluralName: "Monitors in Monitor Report",
icon: IconProp.AltGlobe,
tableDescription: "Monitors in Monitor Report",
})
@Entity({
name: "MonitorReportMonitor",
})
export default class MonitorReportMonitor extends BaseModel {
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "projectId",
type: TableColumnType.Entity,
modelType: Project,
title: "Project",
description: "Relation to Project Resource in which this object belongs",
})
@ManyToOne(
() => {
return Project;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "projectId" })
public project?: Project = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnRelationQuery: true,
title: "Project ID",
description: "ID of your OneUptime Project in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "monitorReportId",
type: TableColumnType.Entity,
modelType: MonitorReport,
title: "Monitor Report",
description:
"Relation to Monitor Report Resource in which this object belongs",
})
@ManyToOne(
() => {
return MonitorReport;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "monitorReportId" })
public monitorReport?: MonitorReport = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
title: "Monitor Report ID",
description: "ID of your Monitor Report resource where this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
transformer: ObjectID.getDatabaseTransformer(),
})
public monitorReportId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@TableColumn({
manyToOneRelationColumn: "monitorId",
type: TableColumnType.Entity,
modelType: Monitor,
title: "Monitor",
description: "Relation to Monitor Resource in which this object belongs",
})
@ManyToOne(
() => {
return Monitor;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "monitorId" })
public monitor?: Monitor = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
title: "Monitor ID",
description: "Relation to Monitor ID Resource in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public monitorId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@TableColumn({
manyToOneRelationColumn: "monitorGroupId",
type: TableColumnType.Entity,
modelType: MonitorGroup,
title: "Monitor Group",
description:
"Relation to Monitor Group Resource in which this object belongs",
})
@ManyToOne(
() => {
return MonitorGroup;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "monitorGroupId" })
public monitorGroup?: MonitorGroup = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
title: "Monitor Group ID",
description:
"Relation to Monitor Group ID Resource in which this object belongs",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public monitorGroupId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@TableColumn({
manyToOneRelationColumn: "monitorReportGroupId",
type: TableColumnType.Entity,
modelType: MonitorGroup,
title: "Monitor Report Group",
description:
"Does this monitor belong to a status page group? If so - which one is it?",
})
@ManyToOne(
() => {
return MonitorGroup;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "monitorReportGroupId" })
public monitorReportGroup?: MonitorGroup = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@Index()
@TableColumn({
type: TableColumnType.ObjectID,
required: false,
title: "Group ID",
description: "Does this monitor belong to a status page group?",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public monitorReportGroupId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@TableColumn({
required: true,
type: TableColumnType.ShortText,
title: "Display Name",
description: "Display name of the monitor on the Monitor Report",
})
@Column({
nullable: false,
type: ColumnType.ShortText,
length: ColumnLength.ShortText,
})
public displayName?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@TableColumn({
required: false,
type: TableColumnType.Markdown,
title: "Display Description",
description:
"Display description of the monitor on the Monitor Report. This is in markdown format.",
})
@Column({
nullable: true,
type: ColumnType.Markdown,
})
public displayDescription?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@TableColumn({
type: TableColumnType.ShortText,
title: "Uptime Percent Precision",
required: false,
description:
"Precision of uptime percent of this monitor for the last 90 days",
})
@Column({
type: ColumnType.ShortText,
nullable: true,
})
public uptimePercentPrecision?: UptimePrecision = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "createdByUserId",
type: TableColumnType.Entity,
modelType: User,
title: "Created by User",
description:
"Relation to User who created this object (if this object was created by a User)",
})
@ManyToOne(
() => {
return User;
},
{
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "createdByUserId" })
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Created by User ID",
description:
"User ID who created this object (if this object was created by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public createdByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateMonitorReportMonitor,
],
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadMonitorReportMonitor,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditMonitorReportMonitor,
],
})
@TableColumn({
isDefaultValueColumn: false,
type: TableColumnType.Number,
title: "Order",
description: "Order / Priority of this resource",
})
@Column({
type: ColumnType.Number,
})
public order?: number = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
manyToOneRelationColumn: "deletedByUserId",
type: TableColumnType.Entity,
title: "Deleted by User",
description:
"Relation to User who deleted this object (if this object was deleted by a User)",
})
@ManyToOne(
() => {
return User;
},
{
cascade: false,
eager: false,
nullable: true,
onDelete: "CASCADE",
orphanedRowAction: "nullify",
},
)
@JoinColumn({ name: "deletedByUserId" })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [],
update: [],
})
@TableColumn({
type: TableColumnType.ObjectID,
title: "Deleted by User ID",
description:
"User ID who deleted this object (if this object was deleted by a User)",
})
@Column({
type: ColumnType.ObjectID,
nullable: true,
transformer: ObjectID.getDatabaseTransformer(),
})
public deletedByUserId?: ObjectID = undefined;
}

View File