rez_core 2.2.258 → 2.2.259
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/dist/app.module.js +2 -2
- package/dist/app.module.js.map +1 -1
- package/dist/module/integration/controller/calender-event.controller.js.map +1 -0
- package/dist/module/integration/controller/integration.controller.d.ts +113 -0
- package/dist/module/{communication/controller/communication.controller.js → integration/controller/integration.controller.js} +197 -75
- package/dist/module/integration/controller/integration.controller.js.map +1 -0
- package/dist/module/{communication → integration}/controller/wrapper.controller.d.ts +1 -1
- package/dist/module/integration/controller/wrapper.controller.js.map +1 -0
- package/dist/module/{communication → integration}/dto/create-config.dto.d.ts +48 -4
- package/dist/module/{communication → integration}/dto/create-config.dto.js +96 -18
- package/dist/module/integration/dto/create-config.dto.js.map +1 -0
- package/dist/module/{communication/entity/communication-config.entity.d.ts → integration/entity/integration-config.entity.d.ts} +11 -1
- package/dist/module/integration/entity/integration-config.entity.js +78 -0
- package/dist/module/integration/entity/integration-config.entity.js.map +1 -0
- package/dist/module/{communication → integration}/entity/integration-source.entity.d.ts +1 -1
- package/dist/module/{communication → integration}/entity/integration-source.entity.js +8 -8
- package/dist/module/integration/entity/integration-source.entity.js.map +1 -0
- package/dist/module/integration/entity/user-integration.entity.d.ts +23 -0
- package/dist/module/integration/entity/user-integration.entity.js +70 -0
- package/dist/module/integration/entity/user-integration.entity.js.map +1 -0
- package/dist/module/integration/examples/usage.example.d.ts +16 -0
- package/dist/module/integration/examples/usage.example.js +217 -0
- package/dist/module/integration/examples/usage.example.js.map +1 -0
- package/dist/module/{communication → integration}/factories/base.factory.d.ts +2 -2
- package/dist/module/integration/factories/base.factory.js.map +1 -0
- package/dist/module/{communication → integration}/factories/email.factory.d.ts +3 -7
- package/dist/module/{communication → integration}/factories/email.factory.js +1 -13
- package/dist/module/integration/factories/email.factory.js.map +1 -0
- package/dist/module/{communication/factories/communication.factory.d.ts → integration/factories/integration.factory.d.ts} +4 -4
- package/dist/module/{communication/factories/communication.factory.js → integration/factories/integration.factory.js} +26 -26
- package/dist/module/integration/factories/integration.factory.js.map +1 -0
- package/dist/module/integration/factories/sms.factory.d.ts +9 -0
- package/dist/module/integration/factories/sms.factory.js +26 -0
- package/dist/module/integration/factories/sms.factory.js.map +1 -0
- package/dist/module/{communication → integration}/factories/telephone.factory.d.ts +3 -5
- package/dist/module/{communication → integration}/factories/telephone.factory.js +11 -17
- package/dist/module/integration/factories/telephone.factory.js.map +1 -0
- package/dist/module/{communication → integration}/factories/whatsapp.factory.d.ts +2 -2
- package/dist/module/integration/factories/whatsapp.factory.js.map +1 -0
- package/dist/module/integration/integration.module.d.ts +2 -0
- package/dist/module/{communication/communication.module.js → integration/integration.module.js} +22 -42
- package/dist/module/integration/integration.module.js.map +1 -0
- package/dist/module/integration/service/calendar-event.service.js.map +1 -0
- package/dist/module/{communication/service/communication-queue.service.d.ts → integration/service/integration-queue.service.d.ts} +1 -1
- package/dist/module/{communication/service/communication-queue.service.js → integration/service/integration-queue.service.js} +8 -8
- package/dist/module/integration/service/integration-queue.service.js.map +1 -0
- package/dist/module/integration/service/integration.service.d.ts +155 -0
- package/dist/module/{communication/service/communication.service.js → integration/service/integration.service.js} +391 -307
- package/dist/module/integration/service/integration.service.js.map +1 -0
- package/dist/module/{communication → integration}/service/oauth.service.js +1 -1
- package/dist/module/integration/service/oauth.service.js.map +1 -0
- package/dist/module/{communication → integration}/service/wrapper.service.d.ts +4 -4
- package/dist/module/{communication → integration}/service/wrapper.service.js +25 -26
- package/dist/module/integration/service/wrapper.service.js.map +1 -0
- package/dist/module/{communication → integration}/strategies/email/gmail-api.strategy.d.ts +3 -3
- package/dist/module/{communication → integration}/strategies/email/gmail-api.strategy.js +2 -6
- package/dist/module/integration/strategies/email/gmail-api.strategy.js.map +1 -0
- package/dist/module/integration/strategies/email/outlook-api.strategy.d.ts +5 -0
- package/dist/module/integration/strategies/email/outlook-api.strategy.js.map +1 -0
- package/dist/module/integration/strategies/email/outlook.strategy.d.ts +5 -0
- package/dist/module/integration/strategies/email/outlook.strategy.js.map +1 -0
- package/dist/module/{communication → integration}/strategies/email/sendgrid-api.strategy.d.ts +3 -3
- package/dist/module/integration/strategies/email/sendgrid-api.strategy.js.map +1 -0
- package/dist/module/{communication/strategies/communication.strategy.d.ts → integration/strategies/integration.strategy.d.ts} +4 -3
- package/dist/module/{communication/strategies/communication.strategy.js → integration/strategies/integration.strategy.js} +1 -1
- package/dist/module/integration/strategies/integration.strategy.js.map +1 -0
- package/dist/module/integration/strategies/telephone/ozonetel-voice.strategy.d.ts +17 -0
- package/dist/module/{communication → integration}/strategies/telephone/ozonetel-voice.strategy.js +13 -5
- package/dist/module/integration/strategies/telephone/ozonetel-voice.strategy.js.map +1 -0
- package/dist/module/{communication → integration}/strategies/telephone/tubelight-voice.strategy.d.ts +6 -4
- package/dist/module/{communication → integration}/strategies/telephone/tubelight-voice.strategy.js +3 -7
- package/dist/module/integration/strategies/telephone/tubelight-voice.strategy.js.map +1 -0
- package/dist/module/{communication → integration}/strategies/whatsapp/whatsapp-cloud.strategy.d.ts +3 -3
- package/dist/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.js.map +1 -0
- package/dist/module/integration/strategies/whatsapp/whatsapp.strategy.d.ts +5 -0
- package/dist/module/integration/strategies/whatsapp/whatsapp.strategy.js.map +1 -0
- package/dist/module/meta/entity/entity-master.entity.d.ts +1 -1
- package/dist/module/meta/entity/entity-master.entity.js +2 -2
- package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
- package/dist/module/meta/service/entity-dynamic.service.js +47 -27
- package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
- package/dist/module/user/controller/login.controller.d.ts +3 -3
- package/dist/module/user/controller/login.controller.js +5 -5
- package/dist/module/user/controller/login.controller.js.map +1 -1
- package/dist/module/user/user.module.js +2 -2
- package/dist/module/user/user.module.js.map +1 -1
- package/dist/module/workflow-automation/entity/workflow-automation-action.entity.d.ts +1 -0
- package/dist/module/workflow-automation/entity/workflow-automation-action.entity.js +4 -0
- package/dist/module/workflow-automation/entity/workflow-automation-action.entity.js.map +1 -1
- package/dist/module/workflow-automation/service/workflow-automation.service.d.ts +2 -1
- package/dist/module/workflow-automation/service/workflow-automation.service.js +8 -4
- package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/docs/modules/event-driven-integration-design.md +92 -0
- package/docs/modules/integration.md +197 -0
- package/package.json +1 -1
- package/src/app.module.ts +2 -2
- package/src/module/integration/controller/integration.controller.ts +411 -0
- package/src/module/{communication → integration}/dto/create-config.dto.ts +110 -18
- package/src/module/{communication/entity/communication-config.entity.ts → integration/entity/integration-config.entity.ts} +33 -6
- package/src/module/{communication → integration}/entity/integration-source.entity.ts +1 -1
- package/src/module/integration/entity/user-integration.entity.ts +71 -0
- package/src/module/integration/examples/usage.example.ts +338 -0
- package/src/module/{communication → integration}/factories/base.factory.ts +2 -2
- package/src/module/{communication → integration}/factories/email.factory.ts +2 -12
- package/src/module/{communication/factories/communication.factory.ts → integration/factories/integration.factory.ts} +18 -18
- package/src/module/integration/factories/sms.factory.ts +19 -0
- package/src/module/integration/factories/telephone.factory.ts +41 -0
- package/src/module/{communication → integration}/factories/whatsapp.factory.ts +2 -2
- package/src/module/integration/integration.module.ts +86 -0
- package/src/module/{communication/service/communication-queue.service.ts → integration/service/integration-queue.service.ts} +2 -2
- package/src/module/{communication/service/communication.service.ts → integration/service/integration.service.ts} +598 -448
- package/src/module/{communication → integration}/service/oauth.service.ts +1 -1
- package/src/module/{communication → integration}/service/wrapper.service.ts +24 -25
- package/src/module/{communication → integration}/strategies/email/gmail-api.strategy.ts +6 -18
- package/src/module/{communication → integration}/strategies/email/outlook-api.strategy.ts +5 -5
- package/src/module/{communication → integration}/strategies/email/outlook.strategy.ts +5 -5
- package/src/module/{communication → integration}/strategies/email/sendgrid-api.strategy.ts +5 -5
- package/src/module/{communication/strategies/communication.strategy.ts → integration/strategies/integration.strategy.ts} +7 -3
- package/src/module/{communication → integration}/strategies/telephone/ozonetel-voice.strategy.ts +40 -12
- package/src/module/{communication → integration}/strategies/telephone/tubelight-voice.strategy.ts +24 -17
- package/src/module/{communication → integration}/strategies/whatsapp/whatsapp-cloud.strategy.ts +5 -5
- package/src/module/{communication → integration}/strategies/whatsapp/whatsapp.strategy.ts +5 -5
- package/src/module/meta/entity/entity-master.entity.ts +2 -2
- package/src/module/meta/service/entity-dynamic.service.ts +55 -28
- package/src/module/user/controller/login.controller.ts +3 -3
- package/src/module/user/user.module.ts +2 -2
- package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +3 -0
- package/src/module/workflow-automation/service/workflow-automation.service.ts +8 -4
- package/src/resources/dev.properties.yaml +3 -3
- package/.vscode/extensions.json +0 -5
- package/dist/module/communication/communication.module.d.ts +0 -2
- package/dist/module/communication/communication.module.js.map +0 -1
- package/dist/module/communication/controller/calender-event.controller.js.map +0 -1
- package/dist/module/communication/controller/communication.controller.d.ts +0 -99
- package/dist/module/communication/controller/communication.controller.js.map +0 -1
- package/dist/module/communication/controller/wrapper.controller.js.map +0 -1
- package/dist/module/communication/dto/create-config.dto.js.map +0 -1
- package/dist/module/communication/entity/communication-config.entity.js +0 -45
- package/dist/module/communication/entity/communication-config.entity.js.map +0 -1
- package/dist/module/communication/entity/communication-hub.entity.d.ts +0 -20
- package/dist/module/communication/entity/communication-hub.entity.js +0 -115
- package/dist/module/communication/entity/communication-hub.entity.js.map +0 -1
- package/dist/module/communication/entity/integration-source.entity.js.map +0 -1
- package/dist/module/communication/examples/usage.example.d.ts +0 -11
- package/dist/module/communication/examples/usage.example.js +0 -89
- package/dist/module/communication/examples/usage.example.js.map +0 -1
- package/dist/module/communication/factories/base.factory.js.map +0 -1
- package/dist/module/communication/factories/communication.factory.js.map +0 -1
- package/dist/module/communication/factories/email.factory.js.map +0 -1
- package/dist/module/communication/factories/sms.factory.d.ts +0 -15
- package/dist/module/communication/factories/sms.factory.js +0 -49
- package/dist/module/communication/factories/sms.factory.js.map +0 -1
- package/dist/module/communication/factories/telephone.factory.js.map +0 -1
- package/dist/module/communication/factories/whatsapp.factory.js.map +0 -1
- package/dist/module/communication/service/calendar-event.service.js.map +0 -1
- package/dist/module/communication/service/communication-queue.service.js.map +0 -1
- package/dist/module/communication/service/communication.service.d.ts +0 -155
- package/dist/module/communication/service/communication.service.js.map +0 -1
- package/dist/module/communication/service/oauth.service.js.map +0 -1
- package/dist/module/communication/service/wrapper.service.js.map +0 -1
- package/dist/module/communication/strategies/communication.strategy.js.map +0 -1
- package/dist/module/communication/strategies/email/gmail-api.strategy.js.map +0 -1
- package/dist/module/communication/strategies/email/gmail-smtp-v2.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/email/gmail-smtp-v2.strategy.js +0 -60
- package/dist/module/communication/strategies/email/gmail-smtp-v2.strategy.js.map +0 -1
- package/dist/module/communication/strategies/email/gmail-smtp.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/email/gmail-smtp.strategy.js +0 -49
- package/dist/module/communication/strategies/email/gmail-smtp.strategy.js.map +0 -1
- package/dist/module/communication/strategies/email/outlook-api.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/email/outlook-api.strategy.js.map +0 -1
- package/dist/module/communication/strategies/email/outlook-smtp.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/email/outlook-smtp.strategy.js +0 -65
- package/dist/module/communication/strategies/email/outlook-smtp.strategy.js.map +0 -1
- package/dist/module/communication/strategies/email/outlook.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/email/outlook.strategy.js.map +0 -1
- package/dist/module/communication/strategies/email/sendgrid-api.strategy.js.map +0 -1
- package/dist/module/communication/strategies/sms/knowlarity-multi.strategy.d.ts +0 -6
- package/dist/module/communication/strategies/sms/knowlarity-multi.strategy.js +0 -121
- package/dist/module/communication/strategies/sms/knowlarity-multi.strategy.js.map +0 -1
- package/dist/module/communication/strategies/sms/knowlarity.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/sms/knowlarity.strategy.js +0 -44
- package/dist/module/communication/strategies/sms/knowlarity.strategy.js.map +0 -1
- package/dist/module/communication/strategies/sms/twilio-v2.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/sms/twilio-v2.strategy.js +0 -48
- package/dist/module/communication/strategies/sms/twilio-v2.strategy.js.map +0 -1
- package/dist/module/communication/strategies/sms/twilio.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/sms/twilio.strategy.js +0 -44
- package/dist/module/communication/strategies/sms/twilio.strategy.js.map +0 -1
- package/dist/module/communication/strategies/telephone/knowlarity-multi.strategy.d.ts +0 -6
- package/dist/module/communication/strategies/telephone/knowlarity-multi.strategy.js +0 -121
- package/dist/module/communication/strategies/telephone/knowlarity-multi.strategy.js.map +0 -1
- package/dist/module/communication/strategies/telephone/knowlarity-voice.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/telephone/knowlarity-voice.strategy.js +0 -44
- package/dist/module/communication/strategies/telephone/knowlarity-voice.strategy.js.map +0 -1
- package/dist/module/communication/strategies/telephone/ozonetel-voice.strategy.d.ts +0 -15
- package/dist/module/communication/strategies/telephone/ozonetel-voice.strategy.js.map +0 -1
- package/dist/module/communication/strategies/telephone/tubelight-voice.strategy.js.map +0 -1
- package/dist/module/communication/strategies/whatsapp/whatsapp-cloud.strategy.js.map +0 -1
- package/dist/module/communication/strategies/whatsapp/whatsapp.strategy.d.ts +0 -5
- package/dist/module/communication/strategies/whatsapp/whatsapp.strategy.js.map +0 -1
- package/docs/modules/communication.md +0 -177
- package/src/module/communication/communication.module.ts +0 -106
- package/src/module/communication/controller/communication.controller.ts +0 -293
- package/src/module/communication/entity/communication-hub.entity.ts +0 -103
- package/src/module/communication/examples/usage.example.ts +0 -170
- package/src/module/communication/factories/sms.factory.ts +0 -44
- package/src/module/communication/factories/telephone.factory.ts +0 -49
- package/src/module/communication/strategies/email/gmail-smtp-v2.strategy.ts +0 -68
- package/src/module/communication/strategies/email/gmail-smtp.strategy.ts +0 -51
- package/src/module/communication/strategies/email/outlook-smtp.strategy.ts +0 -73
- package/src/module/communication/strategies/sms/knowlarity-multi.strategy.ts +0 -158
- package/src/module/communication/strategies/sms/knowlarity.strategy.ts +0 -44
- package/src/module/communication/strategies/sms/twilio-v2.strategy.ts +0 -47
- package/src/module/communication/strategies/sms/twilio.strategy.ts +0 -44
- package/src/module/communication/strategies/telephone/knowlarity-multi.strategy.ts +0 -158
- package/src/module/communication/strategies/telephone/knowlarity-voice.strategy.ts +0 -44
- /package/dist/module/{communication → integration}/controller/calender-event.controller.d.ts +0 -0
- /package/dist/module/{communication → integration}/controller/calender-event.controller.js +0 -0
- /package/dist/module/{communication → integration}/controller/wrapper.controller.js +0 -0
- /package/dist/module/{communication → integration}/factories/base.factory.js +0 -0
- /package/dist/module/{communication → integration}/factories/whatsapp.factory.js +0 -0
- /package/dist/module/{communication → integration}/service/calendar-event.service.d.ts +0 -0
- /package/dist/module/{communication → integration}/service/calendar-event.service.js +0 -0
- /package/dist/module/{communication → integration}/service/oauth.service.d.ts +0 -0
- /package/dist/module/{communication → integration}/strategies/email/outlook-api.strategy.js +0 -0
- /package/dist/module/{communication → integration}/strategies/email/outlook.strategy.js +0 -0
- /package/dist/module/{communication → integration}/strategies/email/sendgrid-api.strategy.js +0 -0
- /package/dist/module/{communication → integration}/strategies/whatsapp/whatsapp-cloud.strategy.js +0 -0
- /package/dist/module/{communication → integration}/strategies/whatsapp/whatsapp.strategy.js +0 -0
- /package/src/module/{communication → integration}/controller/calender-event.controller.ts +0 -0
- /package/src/module/{communication → integration}/controller/wrapper.controller.ts +0 -0
- /package/src/module/{communication → integration}/service/calendar-event.service.ts +0 -0
|
@@ -8,7 +8,7 @@ export class OAuthService {
|
|
|
8
8
|
process.env.GMAIL_CLIENT_ID,
|
|
9
9
|
process.env.GMAIL_CLIENT_SECRET,
|
|
10
10
|
process.env.GMAIL_REDIRECT_URI ||
|
|
11
|
-
'http://localhost:3000/api/
|
|
11
|
+
'http://localhost:3000/api/integration/oauth/callback/gmail',
|
|
12
12
|
);
|
|
13
13
|
|
|
14
14
|
private readonly outlookScopes = [
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Injectable, Logger } from '@nestjs/common';
|
|
2
2
|
import { DataSource } from 'typeorm';
|
|
3
3
|
import {
|
|
4
|
-
|
|
4
|
+
IntegrationService,
|
|
5
5
|
GenericMessageDto,
|
|
6
|
-
} from './
|
|
6
|
+
} from './integration.service';
|
|
7
7
|
import { GoogleService } from './calendar-event.service';
|
|
8
8
|
import { IcsMeetingService } from 'src/module/ics/service/ics.service';
|
|
9
9
|
|
|
@@ -13,7 +13,7 @@ export class WrapperService {
|
|
|
13
13
|
|
|
14
14
|
constructor(
|
|
15
15
|
private readonly datasource: DataSource,
|
|
16
|
-
private readonly
|
|
16
|
+
private readonly integrationService: IntegrationService,
|
|
17
17
|
private readonly googleService: GoogleService,
|
|
18
18
|
private readonly icsService: IcsMeetingService,
|
|
19
19
|
) {}
|
|
@@ -34,12 +34,11 @@ export class WrapperService {
|
|
|
34
34
|
`Fetching configs for level_id=${level_id}, level_type=${level_type}`,
|
|
35
35
|
);
|
|
36
36
|
const configs = await this.datasource.query(
|
|
37
|
-
`SELECT *
|
|
38
|
-
FROM cr_communication_hub
|
|
37
|
+
`SELECT * FROM cr_integration_config
|
|
39
38
|
WHERE level_id = ?
|
|
40
39
|
AND level_type = ?
|
|
41
40
|
AND status = 1
|
|
42
|
-
AND
|
|
41
|
+
AND integration_type = 'EMAIL'`,
|
|
43
42
|
[level_id, level_type],
|
|
44
43
|
);
|
|
45
44
|
this.logger.debug(`Configs found: ${JSON.stringify(configs)}`);
|
|
@@ -74,6 +73,7 @@ export class WrapperService {
|
|
|
74
73
|
payloadSendMail = {
|
|
75
74
|
levelId: level_id,
|
|
76
75
|
levelType: level_type,
|
|
76
|
+
app_code: 'DEFAULT', // Legacy wrapper default
|
|
77
77
|
to: payload.to,
|
|
78
78
|
message: payload.message,
|
|
79
79
|
subject: payload.subject,
|
|
@@ -90,10 +90,10 @@ export class WrapperService {
|
|
|
90
90
|
`No user-level configs found. Falling back to ORG-level`,
|
|
91
91
|
);
|
|
92
92
|
const fallbackConfigs = await this.datasource.query(
|
|
93
|
-
`SELECT *
|
|
94
|
-
FROM cr_communication_hub
|
|
93
|
+
`SELECT * FROM cr_integration_config
|
|
95
94
|
WHERE level_type = 'ORG'
|
|
96
|
-
AND
|
|
95
|
+
AND integration_type = 'EMAIL'
|
|
96
|
+
AND status = 1`,
|
|
97
97
|
);
|
|
98
98
|
this.logger.debug(
|
|
99
99
|
`ORG-level configs: ${JSON.stringify(fallbackConfigs)}`,
|
|
@@ -106,6 +106,7 @@ export class WrapperService {
|
|
|
106
106
|
payloadSendMail = {
|
|
107
107
|
levelId: 1,
|
|
108
108
|
levelType: 'ORG',
|
|
109
|
+
app_code: 'DEFAULT', // Legacy wrapper default
|
|
109
110
|
to: payload.to,
|
|
110
111
|
message: payload.message,
|
|
111
112
|
subject: payload.subject,
|
|
@@ -120,11 +121,11 @@ export class WrapperService {
|
|
|
120
121
|
}
|
|
121
122
|
|
|
122
123
|
this.logger.debug(
|
|
123
|
-
`Final payload for
|
|
124
|
+
`Final payload for IntegrationService: ${JSON.stringify(payloadSendMail)}`,
|
|
124
125
|
);
|
|
125
126
|
|
|
126
127
|
const result =
|
|
127
|
-
await this.
|
|
128
|
+
await this.integrationService.sendGenericMessage(payloadSendMail);
|
|
128
129
|
|
|
129
130
|
this.logger.log(
|
|
130
131
|
`sendMailWrapper SUCCESS. Result: ${JSON.stringify(result)}`,
|
|
@@ -182,21 +183,19 @@ export class WrapperService {
|
|
|
182
183
|
|
|
183
184
|
// ---- Step 1: Check user-level configs ----
|
|
184
185
|
const userConfigs = await this.datasource.query(
|
|
185
|
-
`SELECT *
|
|
186
|
-
FROM cr_communication_hub
|
|
186
|
+
`SELECT * FROM cr_integration_config
|
|
187
187
|
WHERE level_id = ?
|
|
188
188
|
AND level_type = ?
|
|
189
189
|
AND status = 1
|
|
190
|
-
AND
|
|
191
|
-
AND service = 'API'`,
|
|
190
|
+
AND integration_type = 'EMAIL'`,
|
|
192
191
|
[level_id, level_type],
|
|
193
192
|
);
|
|
194
193
|
|
|
195
194
|
this.logger.debug(`User configs found: ${JSON.stringify(userConfigs)}`);
|
|
196
195
|
|
|
197
196
|
if (userConfigs && userConfigs.length > 0) {
|
|
198
|
-
const provider = userConfigs[0]?.
|
|
199
|
-
const configId = userConfigs[0]?.
|
|
197
|
+
const provider = userConfigs[0]?.integration_provider;
|
|
198
|
+
const configId = userConfigs[0]?.id;
|
|
200
199
|
|
|
201
200
|
if (provider === 'gmail') {
|
|
202
201
|
this.logger.log(`Using Google Calendar (user-level)`);
|
|
@@ -232,20 +231,19 @@ export class WrapperService {
|
|
|
232
231
|
this.logger.log(`No user-level config found, checking ORG-level...`);
|
|
233
232
|
|
|
234
233
|
const orgConfigs = await this.datasource.query(
|
|
235
|
-
`SELECT *
|
|
236
|
-
FROM cr_communication_hub
|
|
234
|
+
`SELECT * FROM cr_integration_config
|
|
237
235
|
WHERE level_id = 1
|
|
238
236
|
AND level_type = 'ORG'
|
|
239
|
-
AND
|
|
240
|
-
AND
|
|
237
|
+
AND integration_type = 'EMAIL'
|
|
238
|
+
AND status = 1`,
|
|
241
239
|
[],
|
|
242
240
|
);
|
|
243
241
|
|
|
244
242
|
this.logger.debug(`ORG configs found: ${JSON.stringify(orgConfigs)}`);
|
|
245
243
|
|
|
246
244
|
if (orgConfigs && orgConfigs.length > 0) {
|
|
247
|
-
const provider = orgConfigs[0]?.
|
|
248
|
-
const configId = orgConfigs[0]?.
|
|
245
|
+
const provider = orgConfigs[0]?.integration_provider;
|
|
246
|
+
const configId = orgConfigs[0]?.id;
|
|
249
247
|
|
|
250
248
|
if (provider === 'gmail') {
|
|
251
249
|
this.logger.log(`Using Google Calendar (ORG-level)`);
|
|
@@ -302,7 +300,7 @@ export class WrapperService {
|
|
|
302
300
|
this.logger.debug(`Fetching config JSON for configId=${configId}`);
|
|
303
301
|
const configRes = await this.datasource.query(
|
|
304
302
|
`SELECT config_json
|
|
305
|
-
FROM
|
|
303
|
+
FROM cr_integration_config
|
|
306
304
|
WHERE id = ?`,
|
|
307
305
|
[configId],
|
|
308
306
|
);
|
|
@@ -344,6 +342,7 @@ export class WrapperService {
|
|
|
344
342
|
const payloadSendMail: GenericMessageDto = {
|
|
345
343
|
levelId,
|
|
346
344
|
levelType,
|
|
345
|
+
app_code: 'DEFAULT', // Legacy wrapper default
|
|
347
346
|
to: toList,
|
|
348
347
|
message: payload.message,
|
|
349
348
|
subject: payload.subject,
|
|
@@ -367,7 +366,7 @@ export class WrapperService {
|
|
|
367
366
|
`Final payload for ICS send: ${JSON.stringify(payloadSendMail)}`,
|
|
368
367
|
);
|
|
369
368
|
const result =
|
|
370
|
-
await this.
|
|
369
|
+
await this.integrationService.sendGenericMessage(payloadSendMail);
|
|
371
370
|
this.logger.log(`ICS fallback mail send result: ${JSON.stringify(result)}`);
|
|
372
371
|
return result;
|
|
373
372
|
}
|
|
@@ -2,20 +2,20 @@ import { Injectable } from '@nestjs/common';
|
|
|
2
2
|
import { ConfigService } from '@nestjs/config';
|
|
3
3
|
import { google } from 'googleapis';
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
IntegrationStrategy,
|
|
6
|
+
IntegrationResult,
|
|
7
7
|
EmailAttachment,
|
|
8
8
|
EmailAttachmentValidator,
|
|
9
|
-
} from '../
|
|
9
|
+
} from '../integration.strategy';
|
|
10
10
|
|
|
11
11
|
@Injectable()
|
|
12
|
-
export class GmailApiStrategy implements
|
|
12
|
+
export class GmailApiStrategy implements IntegrationStrategy {
|
|
13
13
|
constructor(private readonly configService: ConfigService) {}
|
|
14
14
|
async sendMessage(
|
|
15
15
|
to: string | string[],
|
|
16
16
|
message: string,
|
|
17
17
|
config: any,
|
|
18
|
-
): Promise<
|
|
18
|
+
): Promise<IntegrationResult> {
|
|
19
19
|
try {
|
|
20
20
|
if (!config || !config.refreshToken) {
|
|
21
21
|
throw new Error(
|
|
@@ -27,7 +27,6 @@ export class GmailApiStrategy implements CommunicationStrategy {
|
|
|
27
27
|
|
|
28
28
|
console.log('---- Using Google SDK Gmail API ----');
|
|
29
29
|
|
|
30
|
-
// Validate attachments if present
|
|
31
30
|
if (attachments && attachments.length > 0) {
|
|
32
31
|
EmailAttachmentValidator.validate(
|
|
33
32
|
attachments,
|
|
@@ -36,14 +35,10 @@ export class GmailApiStrategy implements CommunicationStrategy {
|
|
|
36
35
|
);
|
|
37
36
|
}
|
|
38
37
|
|
|
39
|
-
// Setup OAuth2 client with Google SDK
|
|
40
38
|
const oauth2Client = await this.setupOAuth2Client(config);
|
|
41
39
|
|
|
42
|
-
// Initialize Gmail API
|
|
43
40
|
const gmail = google.gmail({ version: 'v1', auth: oauth2Client });
|
|
44
41
|
|
|
45
|
-
console.log('---- Gmail SDK client initialized, preparing email ----');
|
|
46
|
-
|
|
47
42
|
const toRecipients = Array.isArray(to) ? to.join(', ') : to;
|
|
48
43
|
const ccRecipients = cc
|
|
49
44
|
? Array.isArray(cc)
|
|
@@ -56,7 +51,6 @@ export class GmailApiStrategy implements CommunicationStrategy {
|
|
|
56
51
|
: bcc
|
|
57
52
|
: undefined;
|
|
58
53
|
|
|
59
|
-
// Build email content with or without attachments
|
|
60
54
|
const emailContent =
|
|
61
55
|
attachments && attachments.length > 0
|
|
62
56
|
? this.buildMultipartEmail(
|
|
@@ -81,7 +75,6 @@ export class GmailApiStrategy implements CommunicationStrategy {
|
|
|
81
75
|
.replace(/\//g, '_')
|
|
82
76
|
.replace(/=+$/, '');
|
|
83
77
|
|
|
84
|
-
// Send email using Google SDK
|
|
85
78
|
const result = await gmail.users.messages.send({
|
|
86
79
|
userId: 'me',
|
|
87
80
|
requestBody: {
|
|
@@ -89,10 +82,6 @@ export class GmailApiStrategy implements CommunicationStrategy {
|
|
|
89
82
|
},
|
|
90
83
|
});
|
|
91
84
|
|
|
92
|
-
console.log('---- Gmail SDK API Success ----');
|
|
93
|
-
console.log('Message ID:', result.data.id);
|
|
94
|
-
|
|
95
|
-
// Get fresh access token for database update
|
|
96
85
|
const credentials = oauth2Client.credentials;
|
|
97
86
|
const freshAccessToken = credentials.access_token;
|
|
98
87
|
|
|
@@ -102,7 +91,6 @@ export class GmailApiStrategy implements CommunicationStrategy {
|
|
|
102
91
|
provider: 'gmail',
|
|
103
92
|
service: 'API',
|
|
104
93
|
timestamp: new Date(),
|
|
105
|
-
refreshedToken: freshAccessToken, // Return fresh token for database update
|
|
106
94
|
};
|
|
107
95
|
} catch (error) {
|
|
108
96
|
console.error('---- Gmail SDK API Error ----');
|
|
@@ -295,4 +283,4 @@ export class GmailApiStrategy implements CommunicationStrategy {
|
|
|
295
283
|
|
|
296
284
|
return emailLines.join('\n');
|
|
297
285
|
}
|
|
298
|
-
}
|
|
286
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Injectable } from '@nestjs/common';
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from '../
|
|
3
|
+
IntegrationStrategy,
|
|
4
|
+
IntegrationResult,
|
|
5
|
+
} from '../integration.strategy';
|
|
6
6
|
|
|
7
7
|
@Injectable()
|
|
8
|
-
export class OutlookApiStrategy implements
|
|
8
|
+
export class OutlookApiStrategy implements IntegrationStrategy {
|
|
9
9
|
async sendMessage(
|
|
10
10
|
to: string,
|
|
11
11
|
message: string,
|
|
12
12
|
config: any,
|
|
13
|
-
): Promise<
|
|
13
|
+
): Promise<IntegrationResult> {
|
|
14
14
|
try {
|
|
15
15
|
if (!this.validateConfig(config)) {
|
|
16
16
|
throw new Error('Invalid Outlook API configuration');
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Injectable } from '@nestjs/common';
|
|
2
2
|
import { Client } from '@microsoft/microsoft-graph-client';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '../
|
|
4
|
+
IntegrationStrategy,
|
|
5
|
+
IntegrationResult,
|
|
6
|
+
} from '../integration.strategy';
|
|
7
7
|
|
|
8
8
|
@Injectable()
|
|
9
|
-
export class OutlookStrategy implements
|
|
9
|
+
export class OutlookStrategy implements IntegrationStrategy {
|
|
10
10
|
async sendMessage(
|
|
11
11
|
to: string,
|
|
12
12
|
message: string,
|
|
13
13
|
config: any,
|
|
14
|
-
): Promise<
|
|
14
|
+
): Promise<IntegrationResult> {
|
|
15
15
|
try {
|
|
16
16
|
const { accessToken } = config;
|
|
17
17
|
|
|
@@ -2,18 +2,18 @@ import { Injectable } from '@nestjs/common';
|
|
|
2
2
|
import * as sgMail from '@sendgrid/mail';
|
|
3
3
|
import axios from 'axios';
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
IntegrationResult,
|
|
6
|
+
IntegrationStrategy,
|
|
7
7
|
EmailAttachment,
|
|
8
|
-
} from '../
|
|
8
|
+
} from '../integration.strategy';
|
|
9
9
|
|
|
10
10
|
@Injectable()
|
|
11
|
-
export class SendGridApiStrategy implements
|
|
11
|
+
export class SendGridApiStrategy implements IntegrationStrategy {
|
|
12
12
|
async sendMessage(
|
|
13
13
|
to: string,
|
|
14
14
|
message: string,
|
|
15
15
|
config: any,
|
|
16
|
-
): Promise<
|
|
16
|
+
): Promise<IntegrationResult> {
|
|
17
17
|
try {
|
|
18
18
|
const {
|
|
19
19
|
apiKey,
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface IntegrationStrategy {
|
|
2
2
|
sendMessage(
|
|
3
3
|
to: string,
|
|
4
4
|
message: string,
|
|
5
5
|
config: any,
|
|
6
|
-
): Promise<
|
|
6
|
+
): Promise<IntegrationResult>;
|
|
7
7
|
validateConfig(config: any): boolean;
|
|
8
|
+
createUserSpecificConfig?(
|
|
9
|
+
baseConfig: any,
|
|
10
|
+
userIntegrationData?: any,
|
|
11
|
+
): any;
|
|
8
12
|
}
|
|
9
13
|
|
|
10
|
-
export interface
|
|
14
|
+
export interface IntegrationResult {
|
|
11
15
|
success: boolean;
|
|
12
16
|
messageId?: string;
|
|
13
17
|
provider: string;
|
package/src/module/{communication → integration}/strategies/telephone/ozonetel-voice.strategy.ts
RENAMED
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
import { Injectable } from '@nestjs/common';
|
|
2
2
|
import axios from 'axios';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '../
|
|
4
|
+
IntegrationResult,
|
|
5
|
+
IntegrationStrategy,
|
|
6
|
+
} from '../integration.strategy';
|
|
7
7
|
|
|
8
8
|
interface OzonetelVoiceConfig {
|
|
9
|
+
// Admin-level credentials (kept in config)
|
|
9
10
|
apiKey: string;
|
|
10
11
|
userName: string;
|
|
11
|
-
agentID: string;
|
|
12
12
|
campaignName: string;
|
|
13
13
|
agentLoginUrl?: string;
|
|
14
|
+
// User-specific agent info (from UserIntegration mapping)
|
|
15
|
+
agentID?: string;
|
|
16
|
+
external_user_id?: string;
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
@Injectable()
|
|
17
|
-
export class OzonetelVoiceStrategy implements
|
|
20
|
+
export class OzonetelVoiceStrategy implements IntegrationStrategy {
|
|
18
21
|
private readonly baseUrl = 'https://in1-ccaas-api.ozonetel.com';
|
|
19
22
|
|
|
20
23
|
async sendMessage(
|
|
21
24
|
to: string,
|
|
22
25
|
message: string,
|
|
23
26
|
config: OzonetelVoiceConfig,
|
|
24
|
-
): Promise<
|
|
27
|
+
): Promise<IntegrationResult> {
|
|
25
28
|
if (!this.validateConfig(config)) {
|
|
26
29
|
return {
|
|
27
30
|
success: false,
|
|
28
31
|
provider: 'ozonetel',
|
|
29
32
|
service: 'THIRD_PARTY',
|
|
30
|
-
error:
|
|
33
|
+
error:
|
|
34
|
+
'Invalid Ozonetel Voice configuration. Missing agent information.',
|
|
31
35
|
timestamp: new Date(),
|
|
32
36
|
};
|
|
33
37
|
}
|
|
@@ -47,12 +51,13 @@ export class OzonetelVoiceStrategy implements CommunicationStrategy {
|
|
|
47
51
|
|
|
48
52
|
// Then make the manual dial call
|
|
49
53
|
const url = `${this.baseUrl}/ca_apis/AgentManualDial`;
|
|
54
|
+
|
|
50
55
|
await axios.post(
|
|
51
56
|
url,
|
|
52
57
|
{
|
|
53
58
|
userName: config.userName,
|
|
54
|
-
agentID: config.agentID,
|
|
55
|
-
campaignName: config.campaignName,
|
|
59
|
+
agentID: config.external_user_id || config.agentID,
|
|
60
|
+
campaignName: config.campaignName, // Always from config
|
|
56
61
|
customerNumber: to,
|
|
57
62
|
UCID: true,
|
|
58
63
|
uui: message,
|
|
@@ -120,9 +125,32 @@ export class OzonetelVoiceStrategy implements CommunicationStrategy {
|
|
|
120
125
|
return !!(
|
|
121
126
|
config &&
|
|
122
127
|
config.apiKey &&
|
|
123
|
-
config.
|
|
124
|
-
config.
|
|
125
|
-
config.campaignName
|
|
128
|
+
config.campaignName &&
|
|
129
|
+
config.userName
|
|
126
130
|
);
|
|
127
131
|
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Create configuration with user agent data merged with admin credentials
|
|
135
|
+
* Admin credentials (apiKey, userName, campaignName) stay in base config
|
|
136
|
+
* Only agent-specific info (agentID) comes from user integration
|
|
137
|
+
*/
|
|
138
|
+
createUserSpecificConfig(
|
|
139
|
+
baseConfig: Pick<
|
|
140
|
+
OzonetelVoiceConfig,
|
|
141
|
+
'apiKey' | 'userName' | 'campaignName' | 'agentLoginUrl'
|
|
142
|
+
>,
|
|
143
|
+
userIntegrationData?: any,
|
|
144
|
+
): OzonetelVoiceConfig {
|
|
145
|
+
if (!userIntegrationData) {
|
|
146
|
+
throw new Error(
|
|
147
|
+
'User integration data is required for Ozonetel voice calls',
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
...baseConfig,
|
|
153
|
+
agentID: userIntegrationData.agentId,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
128
156
|
}
|
package/src/module/{communication → integration}/strategies/telephone/tubelight-voice.strategy.ts
RENAMED
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
import { Injectable } from '@nestjs/common';
|
|
2
2
|
import axios from 'axios';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '../
|
|
4
|
+
IntegrationResult,
|
|
5
|
+
IntegrationStrategy,
|
|
6
|
+
} from '../integration.strategy';
|
|
7
7
|
|
|
8
8
|
interface TubelightVoiceConfig {
|
|
9
|
+
// Admin-level credentials (kept in config)
|
|
9
10
|
userName: string;
|
|
10
11
|
password: string;
|
|
11
|
-
agentVerificationKey: string;
|
|
12
12
|
tenantId: string;
|
|
13
13
|
agentLoginUrl?: string;
|
|
14
|
+
// Agent phone number from config JSON
|
|
15
|
+
agentPhoneNumber?: string;
|
|
16
|
+
// User-specific agent info (from UserIntegration mapping)
|
|
17
|
+
agentVerificationKey?: string;
|
|
18
|
+
external_user_id?: string;
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
@Injectable()
|
|
17
|
-
export class TubelightVoiceStrategy implements
|
|
18
|
-
private readonly baseUrl =
|
|
22
|
+
export class TubelightVoiceStrategy implements IntegrationStrategy {
|
|
23
|
+
private readonly baseUrl =
|
|
24
|
+
'https://portal.tubelightcommunications.com/voice/api/v1';
|
|
19
25
|
|
|
20
26
|
async sendMessage(
|
|
21
27
|
to: string,
|
|
22
28
|
message: string,
|
|
23
29
|
config: TubelightVoiceConfig,
|
|
24
|
-
): Promise<
|
|
30
|
+
): Promise<IntegrationResult> {
|
|
25
31
|
if (!this.validateConfig(config)) {
|
|
26
32
|
return {
|
|
27
33
|
success: false,
|
|
28
34
|
provider: 'tubelight',
|
|
29
35
|
service: 'THIRD_PARTY',
|
|
30
|
-
error:
|
|
36
|
+
error:
|
|
37
|
+
'Invalid Tubelight Voice configuration. Missing agent verification key.',
|
|
31
38
|
timestamp: new Date(),
|
|
32
39
|
};
|
|
33
40
|
}
|
|
@@ -45,10 +52,12 @@ export class TubelightVoiceStrategy implements CommunicationStrategy {
|
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
const url = `${this.baseUrl}/user/sso/agent/outbound-call`;
|
|
55
|
+
|
|
48
56
|
await axios.post(
|
|
49
57
|
url,
|
|
50
58
|
{
|
|
51
|
-
agentVerificationKey:
|
|
59
|
+
agentVerificationKey:
|
|
60
|
+
config.external_user_id || config.agentVerificationKey,
|
|
52
61
|
customerNumber: to,
|
|
53
62
|
},
|
|
54
63
|
{
|
|
@@ -102,7 +111,11 @@ export class TubelightVoiceStrategy implements CommunicationStrategy {
|
|
|
102
111
|
},
|
|
103
112
|
);
|
|
104
113
|
|
|
105
|
-
const data = response.data as {
|
|
114
|
+
const data = response.data as {
|
|
115
|
+
bearer_token?: string;
|
|
116
|
+
access_token?: string;
|
|
117
|
+
token?: string;
|
|
118
|
+
};
|
|
106
119
|
return data?.bearer_token || data?.access_token || data?.token || null;
|
|
107
120
|
} catch (error) {
|
|
108
121
|
console.error('Failed to authenticate with Tubelight:', error);
|
|
@@ -111,12 +124,6 @@ export class TubelightVoiceStrategy implements CommunicationStrategy {
|
|
|
111
124
|
}
|
|
112
125
|
|
|
113
126
|
validateConfig(config: Partial<TubelightVoiceConfig>): boolean {
|
|
114
|
-
return !!(
|
|
115
|
-
config &&
|
|
116
|
-
config.userName &&
|
|
117
|
-
config.password &&
|
|
118
|
-
config.agentVerificationKey &&
|
|
119
|
-
config.tenantId
|
|
120
|
-
);
|
|
127
|
+
return !!(config && config.userName && config.password && config.tenantId);
|
|
121
128
|
}
|
|
122
129
|
}
|
package/src/module/{communication → integration}/strategies/whatsapp/whatsapp-cloud.strategy.ts
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Injectable, Logger } from '@nestjs/common';
|
|
2
2
|
import axios, { AxiosResponse } from 'axios';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '../
|
|
4
|
+
IntegrationStrategy,
|
|
5
|
+
IntegrationResult,
|
|
6
|
+
} from '../integration.strategy';
|
|
7
7
|
|
|
8
8
|
interface WhatsAppConfig {
|
|
9
9
|
accessToken: string;
|
|
@@ -74,7 +74,7 @@ interface WhatsAppApiResponse {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
@Injectable()
|
|
77
|
-
export class WhatsAppCloudStrategy implements
|
|
77
|
+
export class WhatsAppCloudStrategy implements IntegrationStrategy {
|
|
78
78
|
private readonly logger = new Logger(WhatsAppCloudStrategy.name);
|
|
79
79
|
private readonly baseUrl = 'https://graph.facebook.com';
|
|
80
80
|
|
|
@@ -82,7 +82,7 @@ export class WhatsAppCloudStrategy implements CommunicationStrategy {
|
|
|
82
82
|
to: string,
|
|
83
83
|
message: string,
|
|
84
84
|
config: any,
|
|
85
|
-
): Promise<
|
|
85
|
+
): Promise<IntegrationResult> {
|
|
86
86
|
try {
|
|
87
87
|
if (!this.validateConfig(config)) {
|
|
88
88
|
throw new Error('Invalid WhatsApp Cloud API configuration');
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Injectable } from '@nestjs/common';
|
|
2
2
|
import axios from 'axios';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '../
|
|
4
|
+
IntegrationStrategy,
|
|
5
|
+
IntegrationResult,
|
|
6
|
+
} from '../integration.strategy';
|
|
7
7
|
|
|
8
8
|
@Injectable()
|
|
9
|
-
export class WhatsAppStrategy implements
|
|
9
|
+
export class WhatsAppStrategy implements IntegrationStrategy {
|
|
10
10
|
async sendMessage(
|
|
11
11
|
to: string,
|
|
12
12
|
message: string,
|
|
13
13
|
config: any,
|
|
14
|
-
): Promise<
|
|
14
|
+
): Promise<IntegrationResult> {
|
|
15
15
|
try {
|
|
16
16
|
const { accessToken, phoneNumberId, apiVersion = 'v17.0' } = config;
|
|
17
17
|
|
|
@@ -73,6 +73,6 @@ export class EntityMaster extends BaseEntity {
|
|
|
73
73
|
@Column({ name: 'data_source', nullable: true })
|
|
74
74
|
data_source: string;
|
|
75
75
|
|
|
76
|
-
@Column({ name: '
|
|
77
|
-
|
|
76
|
+
@Column({ name: 'is_workflow', nullable: true })
|
|
77
|
+
is_workflow: boolean;
|
|
78
78
|
}
|