From fa8758921116179c45970b466213fbc15df4da8a Mon Sep 17 00:00:00 2001 From: Simon Larsen Date: Tue, 7 Feb 2023 17:56:44 +0000 Subject: [PATCH] add model and service --- Common/Types/Permission.ts | 84 ++++ Common/Types/Workflow/Components/BaseModel.ts | 122 +++++- CommonServer/Services/WorkflowLogService.ts | 10 + .../Services/WorkflowVariableService.ts | 10 + DashboardAPI/Index.ts | 29 ++ Model/Models/Index.ts | 4 + Model/Models/WorkflowLog.tsx | 193 +++++++++ Model/Models/WorkflowVariable.ts | 379 ++++++++++++++++++ 8 files changed, 818 insertions(+), 13 deletions(-) create mode 100644 CommonServer/Services/WorkflowLogService.ts create mode 100644 CommonServer/Services/WorkflowVariableService.ts create mode 100644 Model/Models/WorkflowLog.tsx create mode 100644 Model/Models/WorkflowVariable.ts diff --git a/Common/Types/Permission.ts b/Common/Types/Permission.ts index 5b512df720..00938beee3 100644 --- a/Common/Types/Permission.ts +++ b/Common/Types/Permission.ts @@ -103,6 +103,20 @@ enum Permission { CanEditWorkflow = 'CanEditWorkflow', CanReadWorkflow = 'CanReadWorkflow', + // Workflow Permissions (Owner Permission) + CanCreateWorkflowLog = 'CanCreateWorkflowLog', + CanDeleteWorkflowLog = 'CanDeleteWorkflowLog', + CanEditWorkflowLog = 'CanEditWorkflowLog', + CanReadWorkflowLog = 'CanReadWorkflowLog', + + + // Workflow Permissions (Owner Permission) + CanCreateWorkflowVariable = 'CanCreateWorkflowVariable', + CanDeleteWorkflowVariable = 'CanDeleteWorkflowVariable', + CanEditWorkflowVariable = 'CanEditWorkflowVariable', + CanReadWorkflowVariable = 'CanReadWorkflowVariable', + + // Probe Permissions (Owner Permission) CanCreateStatusPageGroup = 'CanCreateStatusPageGroup', CanDeleteStatusPageGroup = 'CanDeleteStatusPageGroup', @@ -850,6 +864,76 @@ export class PermissionHelper { isAccessControlPermission: false, }, + + + { + permission: Permission.CanCreateWorkflowVariable, + title: 'Can Create Workflow Variables', + description: + 'A user assigned this permission can create Workflow Variables in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.CanDeleteWorkflowVariable, + title: 'Can Delete Workflow Variables', + description: + 'A user assigned this permission can delete Workflow Variables in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.CanEditWorkflowVariable, + title: 'Can Edit Workflow Variables', + description: + 'A user assigned this permission can edit Workflow Variables in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.CanReadWorkflowVariable, + title: 'Can Read Workflow Variables', + description: + 'A user assigned this permission can read Workflow Variables in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + + + + { + permission: Permission.CanCreateWorkflowLog, + title: 'Can Create Workflow Log', + description: + 'A user assigned this permission can create Workflow Log in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.CanDeleteWorkflowLog, + title: 'Can Delete Workflow Log', + description: + 'A user assigned this permission can delete Workflow Log in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.CanEditWorkflowLog, + title: 'Can Edit Workflow Log', + description: + 'A user assigned this permission can edit Workflow Log in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { + permission: Permission.CanReadWorkflowLog, + title: 'Can Read Workflow Log', + description: + 'A user assigned this permission can read Workflow Log in this project.', + isAssignableToTenant: true, + isAccessControlPermission: false, + }, + { permission: Permission.CanCreateStatusPageGroup, title: 'Can Create Status Page Group', diff --git a/Common/Types/Workflow/Components/BaseModel.ts b/Common/Types/Workflow/Components/BaseModel.ts index bb64b56d69..92636a67ba 100644 --- a/Common/Types/Workflow/Components/BaseModel.ts +++ b/Common/Types/Workflow/Components/BaseModel.ts @@ -22,7 +22,7 @@ export default class BaseModelComponent { { type: ComponentInputType.Query, name: 'Filter', - description: 'Please fill out this filter', + description: `Filter on ${model.singularName}`, required: false, id: 'filter', }, @@ -30,8 +30,8 @@ export default class BaseModelComponent { returnValues: [ { id: 'model', - name: 'Model', - description: 'Model fetched from the database', + name: `${model.singularName}`, + description: `${model.singularName} fetched from the database`, type: ComponentInputType.BaseModel, required: false, }, @@ -79,8 +79,8 @@ export default class BaseModelComponent { returnValues: [ { id: 'model', - name: 'Model', - description: 'Model fetched from the database', + name: `${model.singularName}`, + description: `${model.singularName} fetched from the database`, type: ComponentInputType.BaseModelArray, required: false, }, @@ -111,6 +111,38 @@ export default class BaseModelComponent { } if (model.enableWorkflowOn.delete) { + + components.push({ + id: 'on-delete', + title: `On Delete ${model.singularName}`, + category: `${model.singularName}`, + description: `When the ${model.singularName} is deleted...`, + iconProp: IconProp.ArrowCircleLeft, + type: ComponentType.Trigger, + arguments: [ + + ], + returnValues: [{ + id: 'model', + name: `${model.singularName}`, + description: `${model.singularName} deleted in the database`, + type: ComponentInputType.BaseModel, + required: false, + },], + inPorts: [ + + ], + outPorts: [ + { + title: 'Success', + description: + 'This is executed when the query executes successfully', + id: 'success', + }, + ], + }); + + components.push({ id: 'delete-one', title: `Delete One ${model.singularName}`, @@ -195,6 +227,38 @@ export default class BaseModelComponent { } if (model.enableWorkflowOn.create) { + + components.push({ + id: 'on-create', + title: `On Create ${model.singularName}`, + category: `${model.singularName}`, + description: `When the ${model.singularName} is created...`, + iconProp: IconProp.ArrowCircleLeft, + type: ComponentType.Trigger, + arguments: [ + + ], + returnValues: [{ + id: 'model', + name: `${model.singularName}`, + description: `${model.singularName} created in the database`, + type: ComponentInputType.BaseModel, + required: false, + },], + inPorts: [ + + ], + outPorts: [ + { + title: 'Success', + description: + 'This is executed when the model is created successfully.', + id: 'success', + }, + ], + }); + + components.push({ id: 'create-one', title: `Create One ${model.singularName}`, @@ -206,7 +270,7 @@ export default class BaseModelComponent { { id: 'json', name: 'JSON Object', - description: 'Model represented as JSON', + description: `${model.singularName} represented as JSON`, type: ComponentInputType.JSON, required: true, }, @@ -214,8 +278,8 @@ export default class BaseModelComponent { returnValues: [ { id: 'model', - name: 'Model', - description: 'Model created in the database', + name: `${model.singularName}`, + description: `${model.singularName} created in the database`, type: ComponentInputType.BaseModel, required: false, }, @@ -263,7 +327,7 @@ export default class BaseModelComponent { returnValues: [ { id: 'models', - name: 'Model List', + name: `${model.pluralName}`, description: 'Models created in the database', type: ComponentInputType.BaseModel, required: false, @@ -295,6 +359,38 @@ export default class BaseModelComponent { } if (model.enableWorkflowOn.update) { + + components.push({ + id: 'on-update', + title: `On Update ${model.singularName}`, + category: `${model.singularName}`, + description: `When the ${model.singularName} is updated...`, + iconProp: IconProp.ArrowCircleLeft, + type: ComponentType.Trigger, + arguments: [ + + ], + returnValues: [{ + id: 'model', + name: `${model.singularName}`, + description: `Updated ${model.singularName}`, + type: ComponentInputType.BaseModel, + required: true, + },], + inPorts: [ + + ], + outPorts: [ + { + title: 'Success', + description: + `This is executed when the ${model.singularName} is updated successfully.`, + id: 'success', + }, + ], + }); + + components.push({ id: 'update-one', title: `Update One ${model.singularName}`, @@ -313,7 +409,7 @@ export default class BaseModelComponent { { id: 'json', name: 'JSON Object', - description: 'Model represented as JSON', + description: `${model.singularName} represented as JSON`, type: ComponentInputType.JSON, required: true, }, @@ -321,8 +417,8 @@ export default class BaseModelComponent { returnValues: [ { id: 'model', - name: 'Model', - description: 'Model updated in the database', + name: `${model.singularName}`, + description: `${model.singularName} updated in the database`, type: ComponentInputType.BaseModel, required: false, }, @@ -377,7 +473,7 @@ export default class BaseModelComponent { returnValues: [ { id: 'models', - name: 'Model List', + name: `${model.pluralName}`, description: 'Models updated in the database', type: ComponentInputType.BaseModel, required: false, diff --git a/CommonServer/Services/WorkflowLogService.ts b/CommonServer/Services/WorkflowLogService.ts new file mode 100644 index 0000000000..05b736132a --- /dev/null +++ b/CommonServer/Services/WorkflowLogService.ts @@ -0,0 +1,10 @@ +import PostgresDatabase from '../Infrastructure/PostgresDatabase'; +import Model from 'Model/Models/WorkflowLog'; +import DatabaseService from './DatabaseService'; + +export class Service extends DatabaseService { + public constructor(postgresDatabase?: PostgresDatabase) { + super(Model, postgresDatabase); + } +} +export default new Service(); diff --git a/CommonServer/Services/WorkflowVariableService.ts b/CommonServer/Services/WorkflowVariableService.ts new file mode 100644 index 0000000000..d15c83d5e6 --- /dev/null +++ b/CommonServer/Services/WorkflowVariableService.ts @@ -0,0 +1,10 @@ +import PostgresDatabase from '../Infrastructure/PostgresDatabase'; +import Model from 'Model/Models/WorkflowVariable'; +import DatabaseService from './DatabaseService'; + +export class Service extends DatabaseService { + public constructor(postgresDatabase?: PostgresDatabase) { + super(Model, postgresDatabase); + } +} +export default new Service(); diff --git a/DashboardAPI/Index.ts b/DashboardAPI/Index.ts index e3896620d1..c5a029bdf7 100755 --- a/DashboardAPI/Index.ts +++ b/DashboardAPI/Index.ts @@ -25,6 +25,19 @@ import WorkflowService, { Service as WorkflowServiceType, } from 'CommonServer/Services/WorkflowService'; + +import WorkflowLog from 'Model/Models/WorkflowLog'; +import WorkflowLogService, { + Service as WorkflowLogServiceType, +} from 'CommonServer/Services/WorkflowLogService'; + + +import WorkflowVariable from 'Model/Models/WorkflowVariable'; +import WorkflowVariableService, { + Service as WorkflowVariableServiceType, +} from 'CommonServer/Services/WorkflowVariableService'; + + import Probe from 'Model/Models/Probe'; import ProbeService, { Service as ProbeServiceType, @@ -281,6 +294,22 @@ app.use( ).getRouter() ); +app.use( + `/${APP_NAME.toLocaleLowerCase()}`, + new BaseAPI( + WorkflowVariable, + WorkflowVariableService + ).getRouter() +); + +app.use( + `/${APP_NAME.toLocaleLowerCase()}`, + new BaseAPI( + WorkflowLog, + WorkflowLogService + ).getRouter() +); + app.use( `/${APP_NAME.toLocaleLowerCase()}`, new BaseAPI(Domain, DomainService).getRouter() diff --git a/Model/Models/Index.ts b/Model/Models/Index.ts index 6256ef2f41..5980752ec2 100644 --- a/Model/Models/Index.ts +++ b/Model/Models/Index.ts @@ -65,6 +65,8 @@ import GreenlockCertificate from './GreenlockCertificate'; // Workflows. import Workflow from './Workflow'; +import WorkflowVariables from './WorkflowVariable'; +import WorkflowLog from './WorkflowLog'; export default [ User, @@ -114,4 +116,6 @@ export default [ GreenlockCertificate, Workflow, + WorkflowVariables, + WorkflowLog ]; diff --git a/Model/Models/WorkflowLog.tsx b/Model/Models/WorkflowLog.tsx new file mode 100644 index 0000000000..2eb69643a4 --- /dev/null +++ b/Model/Models/WorkflowLog.tsx @@ -0,0 +1,193 @@ +import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm'; +import Project from './Project'; +import CrudApiEndpoint from 'Common/Types/Database/CrudApiEndpoint'; +import Route from 'Common/Types/API/Route'; +import TableColumnType from 'Common/Types/Database/TableColumnType'; +import TableColumn from 'Common/Types/Database/TableColumn'; +import ColumnType from 'Common/Types/Database/ColumnType'; +import ObjectID from 'Common/Types/ObjectID'; +import TableAccessControl from 'Common/Types/Database/AccessControl/TableAccessControl'; +import Permission from 'Common/Types/Permission'; +import ColumnAccessControl from 'Common/Types/Database/AccessControl/ColumnAccessControl'; +import TenantColumn from 'Common/Types/Database/TenantColumn'; +import SingularPluralName from 'Common/Types/Database/SingularPluralName'; +import BaseModel from 'Common/Models/BaseModel'; + +@TenantColumn('projectId') +@TableAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowLog, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowLog, + ], + delete: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanDeleteWorkflowLog, + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanEditWorkflowLog, + ], +}) +@CrudApiEndpoint(new Route('/workflow-log')) +@Entity({ + name: 'WorkflowLog', +}) +@SingularPluralName('Workflow Log', 'Workflow Logs') +export default class Workflow extends BaseModel { + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowLog, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'projectId', + type: TableColumnType.Entity, + modelType: Project, + }) + @ManyToOne( + (_type: string) => { + return Project; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'projectId' }) + public project?: Project = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowLog, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: true, + canReadOnPopulate: true, + }) + @Column({ + type: ColumnType.ObjectID, + nullable: false, + transformer: ObjectID.getDatabaseTransformer(), + }) + public projectId?: ObjectID = undefined; + + + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowLog, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowLog, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'workflowId', + type: TableColumnType.Entity, + modelType: Workflow, + }) + @ManyToOne( + (_type: string) => { + return Workflow; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'workflowId' }) + public workflow?: Workflow = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowLog, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowLog, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: true, + canReadOnPopulate: true, + }) + @Column({ + type: ColumnType.ObjectID, + nullable: false, + transformer: ObjectID.getDatabaseTransformer(), + }) + public workflowId?: ObjectID = undefined; + + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowLog, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowLog, + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + ], + }) + @TableColumn({ required: false, type: TableColumnType.LongText }) + @Column({ + nullable: false, + type: ColumnType.VeryLongText, + }) + public logs?: string = undefined; + +} diff --git a/Model/Models/WorkflowVariable.ts b/Model/Models/WorkflowVariable.ts new file mode 100644 index 0000000000..86f3ccc798 --- /dev/null +++ b/Model/Models/WorkflowVariable.ts @@ -0,0 +1,379 @@ +import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm'; +import User from './User'; +import Project from './Project'; +import CrudApiEndpoint from 'Common/Types/Database/CrudApiEndpoint'; +import Route from 'Common/Types/API/Route'; +import TableColumnType from 'Common/Types/Database/TableColumnType'; +import TableColumn from 'Common/Types/Database/TableColumn'; +import ColumnType from 'Common/Types/Database/ColumnType'; +import ObjectID from 'Common/Types/ObjectID'; +import ColumnLength from 'Common/Types/Database/ColumnLength'; +import TableAccessControl from 'Common/Types/Database/AccessControl/TableAccessControl'; +import Permission from 'Common/Types/Permission'; +import ColumnAccessControl from 'Common/Types/Database/AccessControl/ColumnAccessControl'; +import UniqueColumnBy from 'Common/Types/Database/UniqueColumnBy'; +import TenantColumn from 'Common/Types/Database/TenantColumn'; +import SingularPluralName from 'Common/Types/Database/SingularPluralName'; +import BaseModel from 'Common/Models/BaseModel'; + +@TenantColumn('projectId') +@TableAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + delete: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanDeleteWorkflowVariable, + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanEditWorkflowVariable, + ], +}) +@CrudApiEndpoint(new Route('/workflow-secret')) +@Entity({ + name: 'WorkflowVariable', +}) +@SingularPluralName('Workflow Secret', 'Workflow Secrets') +export default class Workflow extends BaseModel { + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'projectId', + type: TableColumnType.Entity, + modelType: Project, + }) + @ManyToOne( + (_type: string) => { + return Project; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'projectId' }) + public project?: Project = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: true, + canReadOnPopulate: true, + }) + @Column({ + type: ColumnType.ObjectID, + nullable: false, + transformer: ObjectID.getDatabaseTransformer(), + }) + public projectId?: ObjectID = undefined; + + + + + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'workflowId', + type: TableColumnType.Entity, + modelType: Workflow, + }) + @ManyToOne( + (_type: string) => { + return Project; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'workflowId' }) + public workflow?: Workflow = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @Index() + @TableColumn({ + type: TableColumnType.ObjectID, + required: false, + canReadOnPopulate: true, + }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public workflowId?: ObjectID = undefined; + + + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanEditWorkflowVariable, + ], + }) + @TableColumn({ + required: true, + type: TableColumnType.ShortText, + canReadOnPopulate: true, + }) + @Column({ + nullable: false, + type: ColumnType.ShortText, + length: ColumnLength.ShortText, + }) + @UniqueColumnBy('projectId') + public name?: string = undefined; + + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanEditWorkflowVariable, + ], + }) + @TableColumn({ required: false, type: TableColumnType.LongText }) + @Column({ + nullable: true, + type: ColumnType.LongText, + length: ColumnLength.LongText, + }) + public description?: string = undefined; + + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + ], + }) + @TableColumn({ required: true, type: TableColumnType.LongText }) + @Column({ + nullable: false, + type: ColumnType.VeryLongText, + }) + public content?: string = undefined; + + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + + ], + update: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + ], + }) + @TableColumn({ required: true, type: TableColumnType.Boolean }) + @Column({ + nullable: false, + default: false, + type: ColumnType.Boolean, + }) + public isSecret?: string = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'createdByUserId', + type: TableColumnType.Entity, + modelType: User, + }) + @ManyToOne( + (_type: string) => { + return User; + }, + { + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'createdByUserId' }) + public createdByUser?: User = undefined; + + @ColumnAccessControl({ + create: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.CanCreateWorkflowVariable, + ], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @TableColumn({ type: TableColumnType.ObjectID }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public createdByUserId?: ObjectID = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @TableColumn({ + manyToOneRelationColumn: 'deletedByUserId', + type: TableColumnType.ObjectID, + }) + @ManyToOne( + (_type: string) => { + return User; + }, + { + cascade: false, + eager: false, + nullable: true, + onDelete: 'CASCADE', + orphanedRowAction: 'nullify', + } + ) + @JoinColumn({ name: 'deletedByUserId' }) + public deletedByUser?: User = undefined; + + @ColumnAccessControl({ + create: [], + read: [ + Permission.ProjectOwner, + Permission.ProjectAdmin, + Permission.ProjectMember, + Permission.CanReadWorkflowVariable, + ], + update: [], + }) + @TableColumn({ type: TableColumnType.ObjectID }) + @Column({ + type: ColumnType.ObjectID, + nullable: true, + transformer: ObjectID.getDatabaseTransformer(), + }) + public deletedByUserId?: ObjectID = undefined; +}