add model and service

This commit is contained in:
Simon Larsen
2023-02-07 17:56:44 +00:00
parent fb7d5bc18a
commit fa87589211
8 changed files with 818 additions and 13 deletions

View File

@@ -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',

View File

@@ -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,

View File

@@ -0,0 +1,10 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/WorkflowLog';
import DatabaseService from './DatabaseService';
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {
super(Model, postgresDatabase);
}
}
export default new Service();

View File

@@ -0,0 +1,10 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/WorkflowVariable';
import DatabaseService from './DatabaseService';
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {
super(Model, postgresDatabase);
}
}
export default new Service();

View File

@@ -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, WorkflowVariableServiceType>(
WorkflowVariable,
WorkflowVariableService
).getRouter()
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<WorkflowLog, WorkflowLogServiceType>(
WorkflowLog,
WorkflowLogService
).getRouter()
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<Domain, DomainServiceType>(Domain, DomainService).getRouter()

View File

@@ -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
];

View File

@@ -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;
}

View File

@@ -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;
}