import Project from "./Project"; import Incident from "./Incident"; import Alert from "./Alert"; import Monitor from "./Monitor"; import ScheduledMaintenance from "./ScheduledMaintenance"; import StatusPage from "./StatusPage"; import StatusPageAnnouncement from "./StatusPageAnnouncement"; import User from "./User"; import OnCallDutyPolicy from "./OnCallDutyPolicy"; import OnCallDutyPolicyEscalationRule from "./OnCallDutyPolicyEscalationRule"; import OnCallDutyPolicySchedule from "./OnCallDutyPolicySchedule"; import Team from "./Team"; import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel"; import Route from "../../Types/API/Route"; import CallStatus from "../../Types/Call/CallStatus"; 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 EnableDocumentation from "../../Types/Database/EnableDocumentation"; import EnableWorkflow from "../../Types/Database/EnableWorkflow"; 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 ObjectID from "../../Types/ObjectID"; import Permission from "../../Types/Permission"; import Phone from "../../Types/Phone"; import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; @EnableDocumentation() @TenantColumn("projectId") @TableAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], delete: [], update: [], }) @CrudApiEndpoint(new Route("/call-log")) @Entity({ name: "CallLog", }) @EnableWorkflow({ create: true, delete: false, update: false, }) @TableMetadata({ tableName: "CallLog", singularName: "Call Log", pluralName: "Call Logs", icon: IconProp.Call, tableDescription: "Logs of all the Call sent out to all users and subscribers for this project.", }) export default class CallLog extends BaseModel { @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "projectId", type: TableColumnType.Entity, modelType: Project, title: "Project", description: "Relation to Project Resource in which this object belongs", example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e", }) @ManyToOne( () => { return Project; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "projectId" }) public project?: Project = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], 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: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ required: true, type: TableColumnType.Phone, title: "To Number", description: "Phone Number Call was sent to", canReadOnRelationQuery: false, example: "+1-555-123-4567", }) @Column({ nullable: false, type: ColumnType.Phone, length: ColumnLength.Phone, transformer: Phone.getDatabaseTransformer(), }) public toNumber?: Phone = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ required: true, type: TableColumnType.Phone, title: "From Number", description: "Phone Number Call was sent from", canReadOnRelationQuery: false, example: "+1-555-999-8888", }) @Column({ nullable: false, type: ColumnType.Phone, length: ColumnLength.Phone, transformer: Phone.getDatabaseTransformer(), }) public fromNumber?: Phone = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ required: true, type: TableColumnType.JSON, title: "Call Data", description: "Content of the data that was sent in the call", canReadOnRelationQuery: false, example: { message: "Alert notification", incidentId: "123" }, }) @Column({ nullable: false, type: ColumnType.JSON, }) public callData?: JSON = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ required: false, type: TableColumnType.LongText, title: "Status Message", description: "Status Message (if any)", canReadOnRelationQuery: false, example: "Call completed successfully", }) @Column({ nullable: true, type: ColumnType.LongText, length: ColumnLength.LongText, }) public statusMessage?: string = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ required: true, type: TableColumnType.ShortText, title: "Status of the Call", description: "Status of the Call sent", canReadOnRelationQuery: false, example: "Completed", }) @Column({ nullable: false, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public status?: CallStatus = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ required: true, type: TableColumnType.Number, title: "Call Cost", description: "Call Cost in USD Cents", canReadOnRelationQuery: false, isDefaultValueColumn: true, defaultValue: 0, example: 150, }) @Column({ nullable: false, default: 0, type: ColumnType.Number, }) public callCostInUSDCents?: number = undefined; // Relations to resources that triggered this Call (nullable) @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "incidentId", type: TableColumnType.Entity, modelType: Incident, title: "Incident", description: "Incident associated with this Call (if any)", example: "b2c3d4e5-6789-01bc-def2-234567890abc", }) @ManyToOne( () => { return Incident; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "incidentId" }) public incident?: Incident = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Incident ID", description: "ID of Incident associated with this Call (if any)", example: "b2c3d4e5-6789-01bc-def2-234567890abc", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public incidentId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "userId", type: TableColumnType.Entity, modelType: User, title: "User", description: "User who initiated this Call (if any)", example: "c3d4e5f6-789a-12cd-ef34-3456789abcde", }) @ManyToOne( () => { return User; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "userId" }) public user?: User = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "User ID", description: "ID of User who initiated this Call (if any)", example: "c3d4e5f6-789a-12cd-ef34-3456789abcde", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public userId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "alertId", type: TableColumnType.Entity, modelType: Alert, title: "Alert", description: "Alert associated with this Call (if any)", example: "d4e5f6a7-89ab-23de-f456-456789abcdef", }) @ManyToOne( () => { return Alert; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "alertId" }) public alert?: Alert = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Alert ID", description: "ID of Alert associated with this Call (if any)", example: "d4e5f6a7-89ab-23de-f456-456789abcdef", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public alertId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "monitorId", type: TableColumnType.Entity, modelType: Monitor, title: "Monitor", description: "Monitor associated with this Call (if any)", example: "d4e5f6a7-89ab-23de-f456-456789abcdef", }) @ManyToOne( () => { return Monitor; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "monitorId" }) public monitor?: Monitor = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Monitor ID", description: "ID of Monitor associated with this Call (if any)", example: "d4e5f6a7-89ab-23de-f456-456789abcdef", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public monitorId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "scheduledMaintenanceId", type: TableColumnType.Entity, modelType: ScheduledMaintenance, title: "Scheduled Maintenance", description: "Scheduled Maintenance associated with this Call (if any)", example: "e5f6a7b8-9abc-34ef-5678-56789abcdef0", }) @ManyToOne( () => { return ScheduledMaintenance; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "scheduledMaintenanceId" }) public scheduledMaintenance?: ScheduledMaintenance = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Scheduled Maintenance ID", description: "ID of Scheduled Maintenance associated with this Call (if any)", example: "e5f6a7b8-9abc-34ef-5678-56789abcdef0", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public scheduledMaintenanceId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "statusPageId", type: TableColumnType.Entity, modelType: StatusPage, title: "Status Page", description: "Status Page associated with this Call (if any)", example: "f6a7b8c9-abcd-45ef-6789-6789abcdef01", }) @ManyToOne( () => { return StatusPage; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "statusPageId" }) public statusPage?: StatusPage = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Status Page ID", description: "ID of Status Page associated with this Call (if any)", example: "f6a7b8c9-abcd-45ef-6789-6789abcdef01", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public statusPageId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "statusPageAnnouncementId", type: TableColumnType.Entity, modelType: StatusPageAnnouncement, title: "Status Page Announcement", description: "Status Page Announcement associated with this Call (if any)", example: "a7b8c9d0-bcde-56f0-789a-789abcdef012", }) @ManyToOne( () => { return StatusPageAnnouncement; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "statusPageAnnouncementId" }) public statusPageAnnouncement?: StatusPageAnnouncement = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Status Page Announcement ID", description: "ID of Status Page Announcement associated with this Call (if any)", example: "a7b8c9d0-bcde-56f0-789a-789abcdef012", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public statusPageAnnouncementId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "onCallDutyPolicyId", type: TableColumnType.Entity, modelType: OnCallDutyPolicy, title: "On-Call Duty Policy", description: "On-Call Duty Policy associated with this Call (if any)", example: "b8c9d0e1-cdef-67f1-89ab-89abcdef0123", }) @ManyToOne( () => { return OnCallDutyPolicy; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "onCallDutyPolicyId" }) public onCallDutyPolicy?: OnCallDutyPolicy = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "On-Call Duty Policy ID", description: "ID of On-Call Duty Policy associated with this Call (if any)", example: "b8c9d0e1-cdef-67f1-89ab-89abcdef0123", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public onCallDutyPolicyId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "onCallDutyPolicyEscalationRuleId", type: TableColumnType.Entity, modelType: OnCallDutyPolicyEscalationRule, title: "On-Call Duty Policy Escalation Rule", description: "On-Call Duty Policy Escalation Rule associated with this Call (if any)", example: "c9d0e1f2-def0-78f2-9abc-9abcdef01234", }) @ManyToOne( () => { return OnCallDutyPolicyEscalationRule; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "onCallDutyPolicyEscalationRuleId" }) public onCallDutyPolicyEscalationRule?: OnCallDutyPolicyEscalationRule = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "On-Call Duty Policy Escalation Rule ID", description: "ID of On-Call Duty Policy Escalation Rule associated with this Call (if any)", example: "c9d0e1f2-def0-78f2-9abc-9abcdef01234", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public onCallDutyPolicyEscalationRuleId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "onCallDutyPolicyScheduleId", type: TableColumnType.Entity, modelType: OnCallDutyPolicySchedule, title: "On-Call Duty Policy Schedule", description: "On-Call Duty Policy Schedule associated with this Call (if any)", example: "d0e1f2a3-ef01-89f3-abcd-abcdef012345", }) @ManyToOne( () => { return OnCallDutyPolicySchedule; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "onCallDutyPolicyScheduleId" }) public onCallDutyPolicySchedule?: OnCallDutyPolicySchedule = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "On-Call Duty Policy Schedule ID", description: "ID of On-Call Duty Policy Schedule associated with this Call (if any)", example: "d0e1f2a3-ef01-89f3-abcd-abcdef012345", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public onCallDutyPolicyScheduleId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "teamId", type: TableColumnType.Entity, modelType: Team, title: "Team", description: "Team associated with this Call (if any)", example: "e1f2a3b4-f012-9af4-bcde-bcdef0123456", }) @ManyToOne( () => { return Team; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "teamId" }) public team?: Team = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadCallLog, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: "Team ID", description: "ID of Team associated with this Call (if any)", example: "e1f2a3b4-f012-9af4-bcde-bcdef0123456", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public teamId?: 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)", example: "f2a3b4c5-0123-abf5-cdef-cdef01234567", }) @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: "f2a3b4c5-0123-abf5-cdef-cdef01234567", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public deletedByUserId?: ObjectID = undefined; }