Skip to content

Commit a5d72a0

Browse files
committed
feat: Integration with Dify
Adds support for Dify integration, including new routes, services, and controllers. The configuration for Dify has been added to the environment file, and the necessary changes have been made to the `.env.example` file. Additionally, the WhatsApp Baileys service has been updated to handle Dify notifications. Modified files: - `.env.example` - `package.json` - `src/api/integrations/openai/services/openai.service.ts` - `src/api/routes/index.router.ts` - `src/api/server.module.ts` - `src/api/services/channel.service.ts` - `src/api/services/channels/whatsapp.baileys.service.ts` - `src/config/env.config.ts` - `src/validate/validate.schema.ts` Introduced files: - `src/api/integrations/dify/` - `src/api/integrations/dify/controllers/dify.controller.ts` - `src/api/integrations/dify/dto/dify.dto.ts` - `src/api/integrations/dify/routes/dify.router.ts` - `src/api/integrations/dify/services/dify.service.ts` - `src/api/integrations/dify/validate/dify.schema.ts`
1 parent b604e4e commit a5d72a0

File tree

14 files changed

+1698
-2
lines changed

14 files changed

+1698
-2
lines changed

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=false
122122
OPENAI_ENABLED=false
123123
OPENAI_API_KEY_GLOBAL=
124124

125+
DIFY_ENABLED=false
126+
125127
CACHE_REDIS_ENABLED=true
126128
CACHE_REDIS_URI=redis://localhost:6379/6
127129
CACHE_REDIS_PREFIX_KEY=evolution

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "evolution-api",
3-
"version": "2.0.4-beta",
3+
"version": "2.0.4-rc",
44
"description": "Rest api for communication with WhatsApp",
55
"main": "./dist/src/main.js",
66
"scripts": {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { configService, Dify } from '../../../../config/env.config';
2+
import { BadRequestException } from '../../../../exceptions';
3+
import { InstanceDto } from '../../../dto/instance.dto';
4+
import { DifyDto, DifyIgnoreJidDto } from '../dto/dify.dto';
5+
import { DifyService } from '../services/dify.service';
6+
7+
export class DifyController {
8+
constructor(private readonly difyService: DifyService) {}
9+
10+
public async createDify(instance: InstanceDto, data: DifyDto) {
11+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
12+
13+
return this.difyService.create(instance, data);
14+
}
15+
16+
public async findDify(instance: InstanceDto) {
17+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
18+
19+
return this.difyService.find(instance);
20+
}
21+
22+
public async fetchDify(instance: InstanceDto, difyId: string) {
23+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
24+
25+
return this.difyService.fetch(instance, difyId);
26+
}
27+
28+
public async updateDify(instance: InstanceDto, difyId: string, data: DifyDto) {
29+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
30+
31+
return this.difyService.update(instance, difyId, data);
32+
}
33+
34+
public async deleteDify(instance: InstanceDto, difyId: string) {
35+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
36+
37+
return this.difyService.delete(instance, difyId);
38+
}
39+
40+
public async settings(instance: InstanceDto, data: any) {
41+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
42+
43+
return this.difyService.setDefaultSettings(instance, data);
44+
}
45+
46+
public async fetchSettings(instance: InstanceDto) {
47+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
48+
49+
return this.difyService.fetchDefaultSettings(instance);
50+
}
51+
52+
public async changeStatus(instance: InstanceDto, data: any) {
53+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
54+
55+
return this.difyService.changeStatus(instance, data);
56+
}
57+
58+
public async fetchSessions(instance: InstanceDto, difyId: string) {
59+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
60+
61+
return this.difyService.fetchSessions(instance, difyId);
62+
}
63+
64+
public async ignoreJid(instance: InstanceDto, data: DifyIgnoreJidDto) {
65+
if (!configService.get<Dify>('DIFY').ENABLED) throw new BadRequestException('Dify is disabled');
66+
67+
return this.difyService.ignoreJid(instance, data);
68+
}
69+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { $Enums, TriggerOperator, TriggerType } from '@prisma/client';
2+
3+
export class Session {
4+
remoteJid?: string;
5+
sessionId?: string;
6+
status?: string;
7+
createdAt?: number;
8+
updateAt?: number;
9+
}
10+
11+
export class DifyDto {
12+
enabled?: boolean;
13+
botType?: $Enums.DifyBotType;
14+
apiUrl?: string;
15+
apiKey?: string;
16+
expire?: number;
17+
keywordFinish?: string;
18+
delayMessage?: number;
19+
unknownMessage?: string;
20+
listeningFromMe?: boolean;
21+
stopBotFromMe?: boolean;
22+
keepOpen?: boolean;
23+
debounceTime?: number;
24+
triggerType?: TriggerType;
25+
triggerOperator?: TriggerOperator;
26+
triggerValue?: string;
27+
ignoreJids?: any;
28+
}
29+
30+
export class DifySettingDto {
31+
expire?: number;
32+
keywordFinish?: string;
33+
delayMessage?: number;
34+
unknownMessage?: string;
35+
listeningFromMe?: boolean;
36+
stopBotFromMe?: boolean;
37+
keepOpen?: boolean;
38+
debounceTime?: number;
39+
difyIdFallback?: string;
40+
ignoreJids?: any;
41+
}
42+
43+
export class DifyIgnoreJidDto {
44+
remoteJid?: string;
45+
action?: string;
46+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import { RequestHandler, Router } from 'express';
2+
3+
import {
4+
difyIgnoreJidSchema,
5+
difySchema,
6+
difySettingSchema,
7+
difyStatusSchema,
8+
instanceSchema,
9+
} from '../../../../validate/validate.schema';
10+
import { RouterBroker } from '../../../abstract/abstract.router';
11+
import { InstanceDto } from '../../../dto/instance.dto';
12+
import { HttpStatus } from '../../../routes/index.router';
13+
import { difyController } from '../../../server.module';
14+
import { DifyDto, DifyIgnoreJidDto, DifySettingDto } from '../dto/dify.dto';
15+
16+
export class DifyRouter extends RouterBroker {
17+
constructor(...guards: RequestHandler[]) {
18+
super();
19+
this.router
20+
.post(this.routerPath('create'), ...guards, async (req, res) => {
21+
const response = await this.dataValidate<DifyDto>({
22+
request: req,
23+
schema: difySchema,
24+
ClassRef: DifyDto,
25+
execute: (instance, data) => difyController.createDify(instance, data),
26+
});
27+
28+
res.status(HttpStatus.CREATED).json(response);
29+
})
30+
.get(this.routerPath('find'), ...guards, async (req, res) => {
31+
const response = await this.dataValidate<InstanceDto>({
32+
request: req,
33+
schema: instanceSchema,
34+
ClassRef: InstanceDto,
35+
execute: (instance) => difyController.findDify(instance),
36+
});
37+
38+
res.status(HttpStatus.OK).json(response);
39+
})
40+
.get(this.routerPath('fetch/:difyId'), ...guards, async (req, res) => {
41+
const response = await this.dataValidate<InstanceDto>({
42+
request: req,
43+
schema: instanceSchema,
44+
ClassRef: InstanceDto,
45+
execute: (instance) => difyController.fetchDify(instance, req.params.difyId),
46+
});
47+
48+
res.status(HttpStatus.OK).json(response);
49+
})
50+
.put(this.routerPath('update/:difyId'), ...guards, async (req, res) => {
51+
const response = await this.dataValidate<DifyDto>({
52+
request: req,
53+
schema: difySchema,
54+
ClassRef: DifyDto,
55+
execute: (instance, data) => difyController.updateDify(instance, req.params.difyId, data),
56+
});
57+
58+
res.status(HttpStatus.OK).json(response);
59+
})
60+
.delete(this.routerPath('delete/:difyId'), ...guards, async (req, res) => {
61+
const response = await this.dataValidate<InstanceDto>({
62+
request: req,
63+
schema: instanceSchema,
64+
ClassRef: InstanceDto,
65+
execute: (instance) => difyController.deleteDify(instance, req.params.difyId),
66+
});
67+
68+
res.status(HttpStatus.OK).json(response);
69+
})
70+
.post(this.routerPath('settings'), ...guards, async (req, res) => {
71+
const response = await this.dataValidate<DifySettingDto>({
72+
request: req,
73+
schema: difySettingSchema,
74+
ClassRef: DifySettingDto,
75+
execute: (instance, data) => difyController.settings(instance, data),
76+
});
77+
78+
res.status(HttpStatus.OK).json(response);
79+
})
80+
.get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {
81+
const response = await this.dataValidate<InstanceDto>({
82+
request: req,
83+
schema: instanceSchema,
84+
ClassRef: InstanceDto,
85+
execute: (instance) => difyController.fetchSettings(instance),
86+
});
87+
88+
res.status(HttpStatus.OK).json(response);
89+
})
90+
.post(this.routerPath('changeStatus'), ...guards, async (req, res) => {
91+
const response = await this.dataValidate<InstanceDto>({
92+
request: req,
93+
schema: difyStatusSchema,
94+
ClassRef: InstanceDto,
95+
execute: (instance, data) => difyController.changeStatus(instance, data),
96+
});
97+
98+
res.status(HttpStatus.OK).json(response);
99+
})
100+
.get(this.routerPath('fetchSessions/:difyId'), ...guards, async (req, res) => {
101+
const response = await this.dataValidate<InstanceDto>({
102+
request: req,
103+
schema: instanceSchema,
104+
ClassRef: InstanceDto,
105+
execute: (instance) => difyController.fetchSessions(instance, req.params.difyId),
106+
});
107+
108+
res.status(HttpStatus.OK).json(response);
109+
})
110+
.post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {
111+
const response = await this.dataValidate<DifyIgnoreJidDto>({
112+
request: req,
113+
schema: difyIgnoreJidSchema,
114+
ClassRef: DifyIgnoreJidDto,
115+
execute: (instance, data) => difyController.ignoreJid(instance, data),
116+
});
117+
118+
res.status(HttpStatus.OK).json(response);
119+
});
120+
}
121+
122+
public readonly router = Router();
123+
}

0 commit comments

Comments
 (0)