import Project from "./Project"; import User from "./User"; 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 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 { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; import WorkspaceType from "../../Types/Workspace/WorkspaceType"; import Permission from "../../Types/Permission"; export interface MiscData { [key: string]: any; } export interface MicrosoftTeamsTeam { id: string; name: string; } export interface SlackMiscData extends MiscData { teamId: string; teamName: string; botUserId: string; channelCache?: { [channelName: string]: { id: string; name: string; lastUpdated: string; }; }; } export interface MicrosoftTeamsMiscData extends MiscData { tenantId: string; teamId: string; teamName: string; botId: string; appAccessToken?: string; adminConsentGranted?: boolean; lastAppTokenIssuedAt?: string; adminConsentGrantedAt?: string; adminConsentGrantedBy?: string; availableTeams?: Record; appAccessTokenExpiresAt?: string; } export type WorkspaceMiscData = SlackMiscData | MicrosoftTeamsMiscData; @TenantColumn("projectId") @TableAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], delete: [Permission.ProjectOwner, Permission.ProjectAdmin], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], }) @CrudApiEndpoint(new Route("/workspace-project-auth-token")) @Entity({ name: "WorkspaceProjectAuthToken", }) @TableMetadata({ tableName: "WorkspaceProjectAuthToken", singularName: "Workspace Project Auth Token", pluralName: "Workspace Project Auth Tokens", icon: IconProp.Lock, tableDescription: "Third Party Auth Token for the Project", }) class WorkspaceProjectAuthToken extends BaseModel { @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], 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, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, 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", }) @Column({ type: ColumnType.ObjectID, nullable: false, transformer: ObjectID.getDatabaseTransformer(), }) public projectId?: ObjectID = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [], update: [], }) @TableColumn({ title: "Auth Token", required: true, unique: false, type: TableColumnType.VeryLongText, canReadOnRelationQuery: true, }) @Column({ type: ColumnType.VeryLongText, unique: false, nullable: false, }) public authToken?: string = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], update: [], }) @TableColumn({ title: "Workspace Type", description: "Type of Workspace - slack, microsoft teams etc.", required: true, unique: false, type: TableColumnType.LongText, canReadOnRelationQuery: true, }) @Column({ type: ColumnType.LongText, length: ColumnLength.LongText, unique: false, nullable: false, }) public workspaceType?: WorkspaceType = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], }) @TableColumn({ title: "Project ID in Workspace", required: true, unique: false, type: TableColumnType.LongText, canReadOnRelationQuery: true, }) @Column({ type: ColumnType.LongText, length: ColumnLength.LongText, unique: false, nullable: false, }) public workspaceProjectId?: string = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], }) @TableColumn({ title: "Misc Data", required: true, unique: false, type: TableColumnType.JSON, canReadOnRelationQuery: true, }) @Column({ type: ColumnType.JSON, unique: false, nullable: false, }) public miscData?: MiscData = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], }) @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.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], }) @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, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], }) @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: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.ReadAllProjectResources, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, ], }) @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; } export default WorkspaceProjectAuthToken;