@lobb-js/core 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +48 -0
- package/src/Lobb.ts +150 -0
- package/src/LobbError.ts +105 -0
- package/src/TypesGenerator.ts +11 -0
- package/src/api/WebServer.ts +126 -0
- package/src/api/collections/CollectionControllers.ts +485 -0
- package/src/api/collections/CollectionService.ts +162 -0
- package/src/api/collections/collectionRoutes.ts +105 -0
- package/src/api/collections/collectionStore.ts +647 -0
- package/src/api/collections/transactions.ts +166 -0
- package/src/api/collections/utils.ts +73 -0
- package/src/api/errorHandler.ts +73 -0
- package/src/api/events/index.ts +129 -0
- package/src/api/meta/route.ts +66 -0
- package/src/api/meta/service.ts +163 -0
- package/src/api/middlewares.ts +71 -0
- package/src/api/openApiRoute.ts +1017 -0
- package/src/api/schema/SchemaService.ts +71 -0
- package/src/api/schema/schemaRoutes.ts +13 -0
- package/src/config/ConfigManager.ts +252 -0
- package/src/config/validations.ts +49 -0
- package/src/coreCollections/collectionsCollection.ts +56 -0
- package/src/coreCollections/index.ts +14 -0
- package/src/coreCollections/migrationsCollection.ts +36 -0
- package/src/coreCollections/queryCollection.ts +26 -0
- package/src/coreCollections/workflowsCollection.ts +73 -0
- package/src/coreDbSetup/index.ts +72 -0
- package/src/coreMigrations/index.ts +3 -0
- package/src/database/DatabaseService.ts +44 -0
- package/src/database/DatabaseSyncManager.ts +173 -0
- package/src/database/MigrationsManager.ts +95 -0
- package/src/database/drivers/MongoDriver.ts +750 -0
- package/src/database/drivers/pgDriver/PGDriver.ts +655 -0
- package/src/database/drivers/pgDriver/QueryBuilder.ts +474 -0
- package/src/database/drivers/pgDriver/utils.ts +6 -0
- package/src/events/EventSystem.ts +191 -0
- package/src/events/coreEvents/index.ts +218 -0
- package/src/events/studioEvents/index.ts +32 -0
- package/src/extension/ExtensionSystem.ts +236 -0
- package/src/extension/dashboardRoute.ts +35 -0
- package/src/fields/ArrayField.ts +33 -0
- package/src/fields/BoolField.ts +34 -0
- package/src/fields/DateField.ts +13 -0
- package/src/fields/DateTimeField.ts +13 -0
- package/src/fields/DecimalField.ts +13 -0
- package/src/fields/FieldUtils.ts +56 -0
- package/src/fields/FloatField.ts +13 -0
- package/src/fields/IntegerField.ts +13 -0
- package/src/fields/LongField.ts +13 -0
- package/src/fields/ObjectField.ts +15 -0
- package/src/fields/StringField.ts +13 -0
- package/src/fields/TextField.ts +13 -0
- package/src/fields/TimeField.ts +13 -0
- package/src/index.ts +53 -0
- package/src/studio/Studio.ts +108 -0
- package/src/types/CollectionControllers.ts +15 -0
- package/src/types/DatabaseDriver.ts +115 -0
- package/src/types/Extension.ts +46 -0
- package/src/types/Field.ts +29 -0
- package/src/types/apiSchema.ts +12 -0
- package/src/types/collectionServiceSchema.ts +18 -0
- package/src/types/config/collectionFields.ts +85 -0
- package/src/types/config/collectionsConfig.ts +50 -0
- package/src/types/config/config.ts +66 -0
- package/src/types/config/relations.ts +17 -0
- package/src/types/filterSchema.ts +88 -0
- package/src/types/index.ts +38 -0
- package/src/types/migrations.ts +12 -0
- package/src/types/websockets.ts +34 -0
- package/src/types/workflows/processors.ts +1 -0
- package/src/utils/lockCollectionToObject.ts +204 -0
- package/src/utils/utils.ts +310 -0
- package/src/workflows/WorkflowSystem.ts +182 -0
- package/src/workflows/coreWorkflows/collectionsTable/index.ts +118 -0
- package/src/workflows/coreWorkflows/index.ts +18 -0
- package/src/workflows/coreWorkflows/processors/postOperationsWorkflows.ts +46 -0
- package/src/workflows/coreWorkflows/processors/preOperationsWorkflows.ts +27 -0
- package/src/workflows/coreWorkflows/processors/processorForDB.ts +13 -0
- package/src/workflows/coreWorkflows/processors/processors/processor.ts +23 -0
- package/src/workflows/coreWorkflows/processors/processors/processorsFunctions.ts +47 -0
- package/src/workflows/coreWorkflows/processors/utils.ts +102 -0
- package/src/workflows/coreWorkflows/processors/validator/validator.ts +19 -0
- package/src/workflows/coreWorkflows/processors/validator/validatorsFunction.ts +52 -0
- package/src/workflows/coreWorkflows/queryCoreWorkflows.ts +31 -0
- package/src/workflows/coreWorkflows/utilsCoreWorkflows.ts +40 -0
- package/src/workflows/coreWorkflows/workflowsCollection/workflowsCollectionWorkflows.ts +101 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Lobb } from "../../../Lobb.ts";
|
|
2
|
+
|
|
3
|
+
export function processorForDB(
|
|
4
|
+
type: "encode" | "decode",
|
|
5
|
+
input: any,
|
|
6
|
+
) {
|
|
7
|
+
input.data = Lobb.instance.utils.processDocumentsForDb(
|
|
8
|
+
type,
|
|
9
|
+
input.collectionName,
|
|
10
|
+
input.data,
|
|
11
|
+
);
|
|
12
|
+
return input;
|
|
13
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ProcessorType } from "../../../../types/index.ts";
|
|
2
|
+
import { Lobb } from "../../../../Lobb.ts";
|
|
3
|
+
|
|
4
|
+
import { processPayloadWithSchema } from "../utils.ts";
|
|
5
|
+
|
|
6
|
+
export async function processor(
|
|
7
|
+
input: any,
|
|
8
|
+
type: ProcessorType,
|
|
9
|
+
processAllFields: boolean,
|
|
10
|
+
) {
|
|
11
|
+
const fieldsSchema =
|
|
12
|
+
Lobb.instance.configManager.getCollection(input.collectionName).fields;
|
|
13
|
+
|
|
14
|
+
input.data = await processPayloadWithSchema(
|
|
15
|
+
type,
|
|
16
|
+
input.data,
|
|
17
|
+
fieldsSchema,
|
|
18
|
+
processAllFields,
|
|
19
|
+
input.context,
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
return input;
|
|
23
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Utils } from "../../../../utils/utils.ts";
|
|
2
|
+
|
|
3
|
+
interface ProcessorInput {
|
|
4
|
+
value: any;
|
|
5
|
+
args?: any;
|
|
6
|
+
context?: any;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface Processor {
|
|
10
|
+
handler: (input: ProcessorInput) => Promise<any>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const processorsFunctions: Record<string, Processor> = {
|
|
14
|
+
default: {
|
|
15
|
+
handler: (input) => {
|
|
16
|
+
input.args = Utils.renderTemplateDeep(
|
|
17
|
+
input.args,
|
|
18
|
+
{
|
|
19
|
+
value: input.value,
|
|
20
|
+
ctx: input.context,
|
|
21
|
+
now: (new Date()).toISOString(),
|
|
22
|
+
},
|
|
23
|
+
);
|
|
24
|
+
return typeof input.value === "undefined" || input.value === null
|
|
25
|
+
? input.args
|
|
26
|
+
: input.value;
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
overwrite: {
|
|
30
|
+
handler: (input) => {
|
|
31
|
+
input.args = Utils.renderTemplateDeep(
|
|
32
|
+
input.args,
|
|
33
|
+
{
|
|
34
|
+
value: input.value,
|
|
35
|
+
ctx: input.context,
|
|
36
|
+
now: (new Date()).toISOString(),
|
|
37
|
+
},
|
|
38
|
+
);
|
|
39
|
+
return input.args;
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
remove: {
|
|
43
|
+
handler: async () => {
|
|
44
|
+
return undefined;
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { CollectionFieldBase } from "../../../types/index.ts";
|
|
2
|
+
import type { ProcessorType } from "../../../types/index.ts";
|
|
3
|
+
import { LobbError } from "../../../LobbError.ts";
|
|
4
|
+
import { processorsFunctions } from "./processors/processorsFunctions.ts";
|
|
5
|
+
import { validatorsFunctions } from "./validator/validatorsFunction.ts";
|
|
6
|
+
|
|
7
|
+
export async function processPayloadWithSchema(
|
|
8
|
+
type: ProcessorType,
|
|
9
|
+
data: any,
|
|
10
|
+
fieldsSchema: Record<string, CollectionFieldBase>,
|
|
11
|
+
processAllFields: boolean = false,
|
|
12
|
+
context: any,
|
|
13
|
+
) {
|
|
14
|
+
const entries = Array.isArray(data) ? data : [data];
|
|
15
|
+
for (let index = 0; index < entries.length; index++) {
|
|
16
|
+
const entry = entries[index];
|
|
17
|
+
const fieldsNames = processAllFields
|
|
18
|
+
? Object.keys(fieldsSchema)
|
|
19
|
+
: Object.keys(entry);
|
|
20
|
+
for (const fieldName of fieldsNames) {
|
|
21
|
+
const fieldConfig = fieldsSchema[fieldName];
|
|
22
|
+
if (!fieldConfig) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const processors = fieldConfig[type];
|
|
27
|
+
if (processors) {
|
|
28
|
+
for (const processorName in processors) {
|
|
29
|
+
const processorArgs: any = processors[processorName];
|
|
30
|
+
const result = await processorsFunctions[processorName].handler({
|
|
31
|
+
value: entry[fieldName],
|
|
32
|
+
args: processorArgs,
|
|
33
|
+
context,
|
|
34
|
+
});
|
|
35
|
+
entry[fieldName] = result;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function validatePayloadWithSchema(
|
|
45
|
+
data: any,
|
|
46
|
+
fieldsSchema: Record<string, CollectionFieldBase>,
|
|
47
|
+
processAllFields: boolean,
|
|
48
|
+
context: any,
|
|
49
|
+
) {
|
|
50
|
+
const entries = Array.isArray(data) ? data : [data];
|
|
51
|
+
const validationErrorsDetails: Record<string, any[]> = {};
|
|
52
|
+
|
|
53
|
+
for (let index = 0; index < entries.length; index++) {
|
|
54
|
+
const entry = entries[index];
|
|
55
|
+
const fieldsNames = processAllFields
|
|
56
|
+
? Object.keys(fieldsSchema)
|
|
57
|
+
: Object.keys(entry);
|
|
58
|
+
for (const fieldName of fieldsNames) {
|
|
59
|
+
const fieldValue = entry[fieldName];
|
|
60
|
+
const fieldConfig = fieldsSchema[fieldName];
|
|
61
|
+
if (!fieldConfig) {
|
|
62
|
+
throw new LobbError({
|
|
63
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
64
|
+
message:
|
|
65
|
+
`The (${fieldName}) fieldName that we will preprocess doesnt exist in the collections`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const validators = fieldConfig.validators;
|
|
70
|
+
if (!validators) {
|
|
71
|
+
entry[fieldName] = fieldValue;
|
|
72
|
+
} else {
|
|
73
|
+
for (const validator in validators) {
|
|
74
|
+
const validatorArgs: any = validators[validator];
|
|
75
|
+
const valid = await validatorsFunctions[validator].handler({
|
|
76
|
+
value: fieldValue,
|
|
77
|
+
args: validatorArgs,
|
|
78
|
+
context,
|
|
79
|
+
});
|
|
80
|
+
if (!valid) {
|
|
81
|
+
if (!validationErrorsDetails[fieldName]) {
|
|
82
|
+
validationErrorsDetails[fieldName] = [];
|
|
83
|
+
}
|
|
84
|
+
validationErrorsDetails[fieldName].push(
|
|
85
|
+
`The value provided for (${fieldName}) is not valid according to the (${validator}) validator.`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (Object.keys(validationErrorsDetails).length) {
|
|
94
|
+
throw new LobbError({
|
|
95
|
+
code: "BAD_REQUEST",
|
|
96
|
+
message: `Validation failed. Please check your inputs and try again.`,
|
|
97
|
+
details: validationErrorsDetails,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return validationErrorsDetails;
|
|
102
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Lobb } from "../../../../Lobb.ts";
|
|
2
|
+
import { validatePayloadWithSchema } from "../utils.ts";
|
|
3
|
+
|
|
4
|
+
export async function validator(
|
|
5
|
+
input: any,
|
|
6
|
+
processAllFields: boolean = false,
|
|
7
|
+
) {
|
|
8
|
+
const fieldsSchema =
|
|
9
|
+
Lobb.instance.configManager.getCollection(input.collectionName).fields;
|
|
10
|
+
|
|
11
|
+
await validatePayloadWithSchema(
|
|
12
|
+
input.data,
|
|
13
|
+
fieldsSchema,
|
|
14
|
+
processAllFields,
|
|
15
|
+
input.context,
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
return input;
|
|
19
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import validator from "validator";
|
|
2
|
+
|
|
3
|
+
interface ValidatorInput {
|
|
4
|
+
value: any;
|
|
5
|
+
args?: any;
|
|
6
|
+
context?: any;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface Validator {
|
|
10
|
+
handler: (input: ValidatorInput) => Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const validatorsFunctions: Record<string, Validator> = {
|
|
14
|
+
enum: {
|
|
15
|
+
handler: async (input) => {
|
|
16
|
+
if (typeof input.value === "undefined" || input.value === null) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return input.args.includes(input.value);
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: {
|
|
23
|
+
handler: async (input) => {
|
|
24
|
+
return typeof input.value !== "undefined" && input.value !== null;
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
maxLength: {
|
|
28
|
+
handler: async (input) => {
|
|
29
|
+
return input.value.length <= input.args;
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
regex: {
|
|
33
|
+
handler: async (input) => {
|
|
34
|
+
const regex = new RegExp(input.args);
|
|
35
|
+
return regex.test(input.value);
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
validator: {
|
|
39
|
+
handler: async (input) => {
|
|
40
|
+
const validatorFunc = (validator as any)[input.args.name];
|
|
41
|
+
if (!validatorFunc) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
return await validatorFunc(input.value, input.args.options);
|
|
47
|
+
} catch (_error) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Workflow } from "../WorkflowSystem.ts";
|
|
2
|
+
|
|
3
|
+
export function getQueryCoreWorkflows(): Workflow[] {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
name: "core_query_preCreate",
|
|
7
|
+
eventName: "core.store.preCreateOne",
|
|
8
|
+
handler: async function (input, ctx) {
|
|
9
|
+
if (input.collectionName === "core_query") {
|
|
10
|
+
const entry = input.data;
|
|
11
|
+
const result = await ctx.workflows.core_query({
|
|
12
|
+
sql: entry.query,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
throw new Response(
|
|
16
|
+
JSON.stringify({
|
|
17
|
+
data: result.rows,
|
|
18
|
+
}),
|
|
19
|
+
{
|
|
20
|
+
status: 200,
|
|
21
|
+
headers: {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
return input;
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Lobb } from "../../Lobb.ts";
|
|
2
|
+
import type { Workflow } from "../WorkflowSystem.ts";
|
|
3
|
+
|
|
4
|
+
export function getUtilsCoreWorkflows(): Workflow[] {
|
|
5
|
+
return [
|
|
6
|
+
{
|
|
7
|
+
name: "core_query",
|
|
8
|
+
inputSchema: (z) => {
|
|
9
|
+
const dbPossibleValues = z.union([
|
|
10
|
+
z.string(),
|
|
11
|
+
z.number(),
|
|
12
|
+
z.boolean(),
|
|
13
|
+
z.null(),
|
|
14
|
+
]);
|
|
15
|
+
return z.object({
|
|
16
|
+
sql: z.string(),
|
|
17
|
+
args: z.array(dbPossibleValues).optional(),
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
outputSchema: (z) => {
|
|
21
|
+
const dbPossibleValues = z.union([
|
|
22
|
+
z.string(),
|
|
23
|
+
z.number(),
|
|
24
|
+
z.boolean(),
|
|
25
|
+
z.null(),
|
|
26
|
+
]);
|
|
27
|
+
return z.object({
|
|
28
|
+
rows: z.array(z.record(dbPossibleValues)),
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
handler: async function (input) {
|
|
32
|
+
const driver = await Lobb.instance.databaseService.getDriver();
|
|
33
|
+
const pool = await driver.getConnection();
|
|
34
|
+
using client = await pool.connect();
|
|
35
|
+
const result = await client.queryObject(input.sql, input.args);
|
|
36
|
+
return result;
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { Workflow } from "../../WorkflowSystem.ts";
|
|
2
|
+
import { Lobb } from "../../../Lobb.ts";
|
|
3
|
+
import { Utils } from "../../../utils/utils.ts";
|
|
4
|
+
import { LobbError } from "../../../LobbError.ts";
|
|
5
|
+
|
|
6
|
+
async function parseWorkflowEntry(
|
|
7
|
+
workflowEntry: Record<string, any>,
|
|
8
|
+
): Promise<Workflow> {
|
|
9
|
+
return {
|
|
10
|
+
name: workflowEntry.name,
|
|
11
|
+
eventName: workflowEntry.event_name,
|
|
12
|
+
inputSchema: Utils.parseFunction(workflowEntry.input_schema),
|
|
13
|
+
outputSchema: Utils.parseFunction(workflowEntry.output_schema),
|
|
14
|
+
handler: Utils.parseFunction(workflowEntry.handler),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let updateOldWorkflowName: string | null = null;
|
|
19
|
+
|
|
20
|
+
export const coreWorkflowsCollectionWorkflows: Workflow[] = [
|
|
21
|
+
{
|
|
22
|
+
name: "core_get_all_workflows_from_db",
|
|
23
|
+
eventName: "core.init",
|
|
24
|
+
handler: async () => {
|
|
25
|
+
const findALlResult = await Lobb.instance.collectionService.findAll({
|
|
26
|
+
collectionName: "core_workflows",
|
|
27
|
+
});
|
|
28
|
+
const dbWorkflows = await Promise.all(
|
|
29
|
+
findALlResult.data.map((entry: Workflow) => parseWorkflowEntry(entry)),
|
|
30
|
+
) as Workflow[];
|
|
31
|
+
|
|
32
|
+
for (let index = 0; index < dbWorkflows.length; index++) {
|
|
33
|
+
const dbWorkflow = dbWorkflows[index];
|
|
34
|
+
await Lobb.instance.workflowSystem.add(dbWorkflow);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "core_add_created_workflow",
|
|
40
|
+
eventName: "core.store.createOne",
|
|
41
|
+
handler: async (input) => {
|
|
42
|
+
if (input.collectionName === "core_workflows") {
|
|
43
|
+
const workflowEntry = input.data;
|
|
44
|
+
const workflow = await parseWorkflowEntry(workflowEntry);
|
|
45
|
+
await Lobb.instance.workflowSystem.add(workflow);
|
|
46
|
+
}
|
|
47
|
+
return input;
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "core_pre_update_workflow",
|
|
52
|
+
eventName: "core.store.preUpdateOne",
|
|
53
|
+
handler: async (input) => {
|
|
54
|
+
if (input.collectionName === "core_workflows") {
|
|
55
|
+
const workflowId = input.id;
|
|
56
|
+
const oldWorkflowEntry = (await Lobb.instance.collectionService.findOne({
|
|
57
|
+
collectionName: "core_workflows",
|
|
58
|
+
id: workflowId,
|
|
59
|
+
})).data;
|
|
60
|
+
updateOldWorkflowName = oldWorkflowEntry.name;
|
|
61
|
+
}
|
|
62
|
+
return input;
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "core_update_workflow",
|
|
67
|
+
eventName: "core.store.updateOne",
|
|
68
|
+
handler: async (input) => {
|
|
69
|
+
if (input.collectionName === "core_workflows") {
|
|
70
|
+
if (!updateOldWorkflowName) {
|
|
71
|
+
throw new LobbError({
|
|
72
|
+
code: "BAD_REQUEST",
|
|
73
|
+
message:
|
|
74
|
+
"The old workflow name in null in the (core.collection.update.core_workflows) workflow",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const workflowEntry = input.data;
|
|
79
|
+
const workflow = await parseWorkflowEntry(workflowEntry);
|
|
80
|
+
await Lobb.instance.workflowSystem.update(
|
|
81
|
+
updateOldWorkflowName,
|
|
82
|
+
workflow,
|
|
83
|
+
);
|
|
84
|
+
updateOldWorkflowName = null;
|
|
85
|
+
}
|
|
86
|
+
return input;
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "core_delete_workflow",
|
|
91
|
+
eventName: "core.store.deleteOne",
|
|
92
|
+
handler: async (input) => {
|
|
93
|
+
if (input.collectionName === "core_workflows") {
|
|
94
|
+
const workflowEntry = input.data;
|
|
95
|
+
const workflow = await parseWorkflowEntry(workflowEntry);
|
|
96
|
+
await Lobb.instance.workflowSystem.remove(workflow.name);
|
|
97
|
+
}
|
|
98
|
+
return input;
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
];
|