From d27bfc9b404b9fa15293faca2ff840ba479ca815 Mon Sep 17 00:00:00 2001 From: Simon Larsen Date: Tue, 21 Feb 2023 14:46:05 +0000 Subject: [PATCH] make workflow work. --- CommonServer/Config.ts | 10 +++- .../Middleware/ClusterKeyAuthorization.ts | 9 ++++ CommonServer/Services/DatabaseService.ts | 46 +++++++++++++++---- CommonServer/Services/MailService.ts | 9 ++-- 4 files changed, 61 insertions(+), 13 deletions(-) diff --git a/CommonServer/Config.ts b/CommonServer/Config.ts index 4db2aa82b7..f1579962bb 100644 --- a/CommonServer/Config.ts +++ b/CommonServer/Config.ts @@ -60,7 +60,11 @@ export const MailHostname: Hostname = Hostname.fromString( ); export const WorkerHostname: Hostname = Hostname.fromString( - process.env['WORKER_HOSTNAME'] || 'mail' + process.env['WORKER_HOSTNAME'] || 'worker' +); + +export const WorkflowHostname: Hostname = Hostname.fromString( + process.env['WORKFLOW_HOSTNAME'] || 'workflow' ); export const DashboardApiHostname: Hostname = Hostname.fromString( @@ -132,6 +136,10 @@ export const AccountsRoute: Route = new Route( process.env['ACCOUNTS_ROUTE'] || '/accounts' ); +export const WorkflowRoute: Route = new Route( + process.env['WORKFLOW_ROUTE'] || '/workflow' +); + export const ApiDocsRoute: Route = new Route( process.env['APIDOCS_ROUTE'] || '/api-docs' ); diff --git a/CommonServer/Middleware/ClusterKeyAuthorization.ts b/CommonServer/Middleware/ClusterKeyAuthorization.ts index a221d7fd76..a92e6911d1 100644 --- a/CommonServer/Middleware/ClusterKeyAuthorization.ts +++ b/CommonServer/Middleware/ClusterKeyAuthorization.ts @@ -8,8 +8,17 @@ import { import Response from '../Utils/Response'; import BadDataException from 'Common/Types/Exception/BadDataException'; import ObjectID from 'Common/Types/ObjectID'; +import Dictionary from 'Common/Types/Dictionary'; export default class ClusterKeyAuthorization { + + + public static getClusterKeyHeaders(): Dictionary{ + return { + clusterkey: ONEUPTIME_SECRET.toString() + } + } + public static async isAuthorizedServiceMiddleware( req: ExpressRequest, res: ExpressResponse, diff --git a/CommonServer/Services/DatabaseService.ts b/CommonServer/Services/DatabaseService.ts index 9efdf8f795..d1ce583884 100644 --- a/CommonServer/Services/DatabaseService.ts +++ b/CommonServer/Services/DatabaseService.ts @@ -23,7 +23,7 @@ import PostgresDatabase, { import { DataSource, Repository, SelectQueryBuilder } from 'typeorm'; import ObjectID from 'Common/Types/ObjectID'; import SortOrder from 'Common/Types/Database/SortOrder'; -import { EncryptionSecret } from '../Config'; +import { EncryptionSecret, WorkflowHostname } from '../Config'; import HashedString from 'Common/Types/HashedString'; import UpdateByID from '../Types/Database/UpdateByID'; import Columns from 'Common/Types/Database/Columns'; @@ -43,6 +43,15 @@ import ModelPermission, { import Select from '../Types/Database/Select'; import Populate from '../Types/Database/Populate'; import UpdateByIDAndFetch from '../Types/Database/UpdateByIDAndFetch'; +import API from 'Common/Utils/API'; +import Protocol from 'Common/Types/API/Protocol'; +import Route from 'Common/Types/API/Route'; +import URL from 'Common/Types/API/URL'; +import JSONFunctions from 'Common/Types/JSONFunctions'; +import ClusterKeyAuthorization from '../Middleware/ClusterKeyAuthorization'; + + +export type DatabaseTriggerType = "on-create" | "on-update" | "on-delete"; export interface OnCreate { createBy: CreateBy; @@ -66,12 +75,12 @@ export interface OnUpdate { class DatabaseService { private postgresDatabase!: PostgresDatabase; - public entityType!: { new (): TBaseModel }; + public entityType!: { new(): TBaseModel }; private model!: TBaseModel; private modelName!: string; public constructor( - modelType: { new (): TBaseModel }, + modelType: { new(): TBaseModel }, postgresDatabase?: PostgresDatabase ) { this.entityType = modelType; @@ -365,8 +374,8 @@ class DatabaseService { createBy.data.getSlugifyColumn() as string ] ? ((createBy.data as any)[ - createBy.data.getSlugifyColumn() as string - ] as string) + createBy.data.getSlugifyColumn() as string + ] as string) : null ); } @@ -468,6 +477,14 @@ class DatabaseService { return data; } + public async onTrigger(model: TBaseModel, projectId: ObjectID, triggerType: DatabaseTriggerType) { + await API.post(new URL(Protocol.HTTP, WorkflowHostname, new Route(`/model/${projectId.toString()}/${triggerType}`)), { + data: JSONFunctions.toJSON(model, this.entityType) + }, { + ...ClusterKeyAuthorization.getClusterKeyHeaders() + }) + } + public async create(createBy: CreateBy): Promise { const onCreate: OnCreate = createBy.props.ignoreHooks ? { createBy, carryForward: [] } @@ -533,6 +550,12 @@ class DatabaseService { createBy.data ); } + + // hit workflow.; + if (this.getModel().enableWorkflowOn.create && createBy.props.tenantId) { + await this.onTrigger(createBy.data, createBy.props.tenantId, "on-create"); + } + return createBy.data; } catch (error) { await this.onCreateError(error as Exception); @@ -886,10 +909,10 @@ class DatabaseService { if (!tableColumnMetadata.modelType) { throw new BadDataException( 'Populate not supported on ' + - key + - ' of ' + - this.model.singularName + - ' because this column modelType is not found.' + key + + ' of ' + + this.model.singularName + + ' because this column modelType is not found.' ); } @@ -997,6 +1020,11 @@ class DatabaseService { } as any; await this.getRepository().save(item); + + // hit workflow. + if(this.getModel().enableWorkflowOn.update && updateBy.props.tenantId){ + await this.onTrigger(item, updateBy.props.tenantId, "on-update"); + } } // Cant Update relations. diff --git a/CommonServer/Services/MailService.ts b/CommonServer/Services/MailService.ts index 2e8014ea89..dd6b7cce4d 100644 --- a/CommonServer/Services/MailService.ts +++ b/CommonServer/Services/MailService.ts @@ -4,10 +4,11 @@ import Route from 'Common/Types/API/Route'; import URL from 'Common/Types/API/URL'; import { JSONObject } from 'Common/Types/JSON'; import API from 'Common/Utils/API'; -import { ClusterKey, MailHostname } from '../Config'; +import { MailHostname } from '../Config'; import Email from 'Common/Types/Email/EmailMessage'; import EmailServer from 'Common/Types/Email/EmailServer'; import Protocol from 'Common/Types/API/Protocol'; +import ClusterKeyAuthorization from '../Middleware/ClusterKeyAuthorization'; export default class MailService { public static async sendMail( @@ -16,7 +17,6 @@ export default class MailService { ): Promise> { const body: JSONObject = { ...mail, - clusterKey: ClusterKey.toString(), toEmail: mail.toEmail.toString(), }; @@ -32,7 +32,10 @@ export default class MailService { return await API.post( new URL(Protocol.HTTP, MailHostname, new Route('/email/send')), - body + body, + { + ...ClusterKeyAuthorization.getClusterKeyHeaders() + } ); } }