import IncidentSeverity from "./IncidentSeverity"; import AlertSeverity from "./AlertSeverity"; import Project from "./Project"; import User from "./User"; import UserCall from "./UserCall"; import UserEmail from "./UserEmail"; import UserPush from "./UserPush"; import UserSMS from "./UserSMS"; import UserWhatsApp from "./UserWhatsApp"; import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel"; import Route from "../../Types/API/Route"; import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl"; import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl"; import ColumnLength from "../../Types/Database/ColumnLength"; import ColumnType from "../../Types/Database/ColumnType"; import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint"; import CurrentUserCanAccessRecordBy from "../../Types/Database/CurrentUserCanAccessRecordBy"; import TableColumn from "../../Types/Database/TableColumn"; import TableColumnType from "../../Types/Database/TableColumnType"; import TableMetadata from "../../Types/Database/TableMetadata"; import TenantColumn from "../../Types/Database/TenantColumn"; import IconProp from "../../Types/Icon/IconProp"; import NotificationRuleType from "../../Types/NotificationRule/NotificationRuleType"; import ObjectID from "../../Types/ObjectID"; import Permission from "../../Types/Permission"; import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; @TenantColumn("projectId") @TableAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], delete: [Permission.CurrentUser], update: [Permission.CurrentUser], }) @CrudApiEndpoint(new Route("/user-notification-rule")) @Entity({ name: "UserNotificationRule", }) @TableMetadata({ tableName: "UserNotificationRule", singularName: "Notification Rule", pluralName: "Notification Rules", icon: IconProp.Email, tableDescription: "Rules which will be used to send notifications.", }) @CurrentUserCanAccessRecordBy("userId") class UserNotificationRule extends BaseModel { @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], 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.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: "Project ID", description: "ID of your OneUptime Project in which this object belongs", example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e", }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public projectId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ title: "Rule Type", required: true, unique: false, type: TableColumnType.ShortText, canReadOnRelationQuery: true, example: "Send Notification When Incident Created", }) @Column({ type: ColumnType.ShortText, length: ColumnLength.ShortText, unique: false, nullable: false, }) public ruleType?: NotificationRuleType = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "user", type: TableColumnType.Entity, modelType: User, title: "User", description: "Relation to User who this email belongs to", }) @ManyToOne( () => { return User; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userId" }) public user?: User = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ type: TableColumnType.ObjectID, title: "User ID", description: "User ID who this email belongs to", example: "7c9d8e0f-a1b2-4c3d-9e5f-8a7b9c0d1e2f", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) @Index() public userId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], 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: "SET NULL", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "createdByUserId" }) public createdByUser?: User = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], 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)", example: "7c9d8e0f-a1b2-4c3d-9e5f-8a7b9c0d1e2f", }) @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", modelType: 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: "SET NULL", 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)", example: "7c9d8e0f-a1b2-4c3d-9e5f-8a7b9c0d1e2f", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public deletedByUserId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "userCallId", type: TableColumnType.Entity, modelType: UserCall, title: "User Call", description: "Relation to User Call Resource in which this object belongs", }) @ManyToOne( () => { return UserCall; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userCallId" }) public userCall?: UserCall = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "User Call ID", description: "ID of User Call in which this object belongs", example: "9e8d7c6b-5a4f-3e2d-1c0b-9a8f7e6d5c4b", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public userCallId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "userPushId", type: TableColumnType.Entity, modelType: UserPush, title: "User Push", description: "Relation to User Push Resource in which this object belongs", }) @ManyToOne( () => { return UserPush; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userPushId" }) public userPush?: UserPush = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "User Push ID", description: "ID of User Push in which this object belongs", example: "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public userPushId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "userSmsId", type: TableColumnType.Entity, modelType: UserSMS, title: "User SMS", description: "Relation to User SMS Resource in which this object belongs", }) @ManyToOne( () => { return UserSMS; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userSmsId" }) public userSms?: UserSMS = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "User SMS ID", description: "ID of User SMS in which this object belongs", example: "2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public userSmsId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "userWhatsAppId", type: TableColumnType.Entity, modelType: UserWhatsApp, title: "User WhatsApp", description: "Relation to User WhatsApp Resource in which this object belongs", }) @ManyToOne( () => { return UserWhatsApp; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userWhatsAppId" }) public userWhatsApp?: UserWhatsApp = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "User WhatsApp ID", description: "ID of User WhatsApp in which this object belongs", example: "3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public userWhatsAppId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "userEmailId", type: TableColumnType.Entity, modelType: UserEmail, title: "User Email", description: "Relation to User Email Resource in which this object belongs", }) @ManyToOne( () => { return UserEmail; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userEmailId" }) public userEmail?: UserEmail = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "User Email ID", description: "ID of User Email in which this object belongs", example: "4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9a", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public userEmailId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [Permission.CurrentUser], }) @Index() @TableColumn({ type: TableColumnType.Number, required: true, isDefaultValueColumn: true, canReadOnRelationQuery: true, title: "Notify After Minutes", description: "How long should we wait before sending a notification to the user after the event has occurred?", example: 5, }) @Column({ type: ColumnType.Number, nullable: false, default: 0, }) public notifyAfterMinutes?: number = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "incidentSeverityId", type: TableColumnType.Entity, modelType: IncidentSeverity, title: "Incident Severity", description: "Relation to Incident Severity Resource in which this object belongs", }) @ManyToOne( () => { return IncidentSeverity; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "incidentSeverityId" }) public incidentSeverity?: IncidentSeverity = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Incident Severity ID", description: "ID of Incident Severity in which this object belongs", example: "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public incidentSeverityId?: ObjectID = undefined; // alert severity. @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @TableColumn({ manyToOneRelationColumn: "alertSeverityId", type: TableColumnType.Entity, modelType: AlertSeverity, title: "Alert Severity", description: "Relation to Alert Severity Resource in which this object belongs", }) @ManyToOne( () => { return AlertSeverity; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "alertSeverityId" }) public alertSeverity?: AlertSeverity = undefined; @ColumnAccessControl({ create: [Permission.CurrentUser], read: [Permission.CurrentUser], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Alert Severity ID", description: "ID of Alert Severity in which this object belongs", example: "6f7a8b9c-0d1e-2f3a-4b5c-6d7e8f9a0b1c", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public alertSeverityId?: ObjectID = undefined; } export default UserNotificationRule;