import Project from "./Project"; import Service from "./Service"; import Team from "./Team"; import User from "./User"; import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel"; import Route from "../../Types/API/Route"; import { PlanType } from "../../Types/Billing/SubscriptionPlan"; import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl"; import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl"; import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl"; import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn"; 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 { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; @CanAccessIfCanReadOn("service") @EnableDocumentation() @TenantColumn("projectId") @TableBillingAccessControl({ create: PlanType.Growth, read: PlanType.Free, update: PlanType.Growth, delete: PlanType.Free, }) @TableAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.DeleteServiceOwnerTeam, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.EditServiceOwnerTeam, ], }) @EnableWorkflow({ create: true, delete: true, update: true, read: true, }) @CrudApiEndpoint(new Route("/service-owner-team")) @TableMetadata({ tableName: "ServiceOwnerTeam", singularName: "Service Team Owner", pluralName: "Service Team Owners", icon: IconProp.Signal, tableDescription: "Add teams as owners to your Service.", }) @Entity({ name: "ServiceOwnerTeam", }) export default class ServiceOwnerTeam extends BaseModel { @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, 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: false, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "projectId" }) public project?: Project = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, 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: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "teamId", type: TableColumnType.Entity, modelType: Team, title: "Team", description: "Team that is the owner. All users in this team will receive notifications. ", example: "a1b2c3d4-e5f6-7890-ab12-cd34ef567890", }) @ManyToOne( () => { return Team; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "teamId" }) public team?: Team = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: "Team ID", description: "ID of your OneUptime Team in which this object belongs", example: "a1b2c3d4-e5f6-7890-ab12-cd34ef567890", }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public teamId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ manyToOneRelationColumn: "serviceId", type: TableColumnType.Entity, modelType: Service, title: "Service", description: "Relation to Service Resource in which this object belongs", example: "f6a7b8c9-d0e1-2345-fa67-bc89de012345", }) @ManyToOne( () => { return Service; }, { eager: false, nullable: true, onDelete: "CASCADE", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "serviceId" }) public service?: Service = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnRelationQuery: true, title: "Service ID", description: "ID of your OneUptime Service in which this object belongs", example: "f6a7b8c9-d0e1-2345-fa67-bc89de012345", }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public serviceId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], 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)", example: "c3d4e5f6-a7b8-9012-cd34-ef56ab789012", }) @ManyToOne( () => { return User; }, { eager: false, nullable: true, onDelete: "SET NULL", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "createdByUserId" }) public createdByUser?: User = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CreateServiceOwnerTeam, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], 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: "c3d4e5f6-a7b8-9012-cd34-ef56ab789012", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public createdByUserId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], 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: "d4e5f6a7-b8c9-0123-de45-fa67bc890123", }) @ManyToOne( () => { return User; }, { cascade: false, eager: false, nullable: true, onDelete: "SET NULL", orphanedRowAction: "nullify", }, ) @JoinColumn({ name: "deletedByUserId" }) public deletedByUser?: User = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadServiceOwnerTeam, Permission.ReadAllProjectResources, ], 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: "d4e5f6a7-b8c9-0123-de45-fa67bc890123", }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public deletedByUserId?: ObjectID = undefined; }