refactor: event integration

This commit is contained in:
Davidson Gomes 2024-08-21 13:47:41 -03:00
parent edeb1efd2a
commit 9209c9992d
5 changed files with 54 additions and 67 deletions

View File

@ -3,6 +3,25 @@ import { rabbitmqController, sqsController, webhookController, websocketControll
import { WAMonitoringService } from '@api/services/monitor.service'; import { WAMonitoringService } from '@api/services/monitor.service';
import { Server } from 'http'; import { Server } from 'http';
export type EmitData = {
instanceName: string;
origin: string;
event: string;
data: Object;
serverUrl: string;
dateTime: string;
sender: string;
apiKey?: string;
local?: boolean;
};
export interface EventControllerInterface {
integrationEnabled: boolean;
set(instanceName: string, data: any): Promise<any>;
get(instanceName: string): Promise<any>;
emit({ instanceName, origin, event, data, serverUrl, dateTime, sender, apiKey, local }: EmitData): Promise<void>;
}
export class EventController { export class EventController {
public prismaRepository: PrismaRepository; public prismaRepository: PrismaRepository;
public waMonitor: WAMonitoringService; public waMonitor: WAMonitoringService;

View File

@ -7,19 +7,19 @@ import { Logger } from '@config/logger.config';
import { NotFoundException } from '@exceptions'; import { NotFoundException } from '@exceptions';
import * as amqp from 'amqplib/callback_api'; import * as amqp from 'amqplib/callback_api';
import { EventController } from '../../event.controller'; import { EmitData, EventController, EventControllerInterface } from '../../event.controller';
export class RabbitmqController extends EventController { export class RabbitmqController extends EventController implements EventControllerInterface {
public amqpChannel: amqp.Channel | null = null; public amqpChannel: amqp.Channel | null = null;
private readonly logger = new Logger(RabbitmqController.name); private readonly logger = new Logger(RabbitmqController.name);
integrationEnabled = configService.get<Rabbitmq>('RABBITMQ')?.ENABLED;
constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) { constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {
super(prismaRepository, waMonitor); super(prismaRepository, waMonitor);
} }
public async init(): Promise<void> { public async init(): Promise<void> {
if (!configService.get<Rabbitmq>('RABBITMQ')?.ENABLED) { if (!this.integrationEnabled) return;
return;
}
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
const uri = configService.get<Rabbitmq>('RABBITMQ').URI; const uri = configService.get<Rabbitmq>('RABBITMQ').URI;
@ -62,6 +62,8 @@ export class RabbitmqController extends EventController {
} }
public async set(instanceName: string, data: RabbitmqDto): Promise<wa.LocalRabbitmq> { public async set(instanceName: string, data: RabbitmqDto): Promise<wa.LocalRabbitmq> {
if (!this.integrationEnabled) return;
if (!data.enabled) { if (!data.enabled) {
data.events = []; data.events = [];
} else { } else {
@ -91,6 +93,8 @@ export class RabbitmqController extends EventController {
} }
public async get(instanceName: string): Promise<wa.LocalWebsocket> { public async get(instanceName: string): Promise<wa.LocalWebsocket> {
if (!this.integrationEnabled) return;
if (undefined === this.monitor.waInstances[instanceName]) { if (undefined === this.monitor.waInstances[instanceName]) {
throw new NotFoundException('Instance not found'); throw new NotFoundException('Instance not found');
} }
@ -117,19 +121,8 @@ export class RabbitmqController extends EventController {
dateTime, dateTime,
sender, sender,
apiKey, apiKey,
}: { }: EmitData): Promise<void> {
instanceName: string; if (!this.integrationEnabled) return;
origin: string;
event: string;
data: Object;
serverUrl: string;
dateTime: string;
sender: string;
apiKey?: string;
}): Promise<void> {
if (!configService.get<Rabbitmq>('RABBITMQ')?.ENABLED) {
return;
}
const instanceRabbitmq = await this.get(instanceName); const instanceRabbitmq = await this.get(instanceName);
const rabbitmqLocal = instanceRabbitmq?.events; const rabbitmqLocal = instanceRabbitmq?.events;

View File

@ -7,20 +7,19 @@ import { configService, Log, Sqs } from '@config/env.config';
import { Logger } from '@config/logger.config'; import { Logger } from '@config/logger.config';
import { NotFoundException } from '@exceptions'; import { NotFoundException } from '@exceptions';
import { EventController } from '../../event.controller'; import { EmitData, EventController, EventControllerInterface } from '../../event.controller';
export class SqsController extends EventController { export class SqsController extends EventController implements EventControllerInterface {
private sqs: SQS; private sqs: SQS;
private readonly logger = new Logger(SqsController.name); private readonly logger = new Logger(SqsController.name);
integrationEnabled = configService.get<Sqs>('SQS')?.ENABLED;
constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) { constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {
super(prismaRepository, waMonitor); super(prismaRepository, waMonitor);
} }
public init(): void { public init(): void {
if (!configService.get<Sqs>('SQS')?.ENABLED) { if (!this.integrationEnabled) return;
return;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
new Promise<void>((resolve, reject) => { new Promise<void>((resolve, reject) => {
@ -48,6 +47,8 @@ export class SqsController extends EventController {
} }
public async set(instanceName: string, data: SqsDto): Promise<wa.LocalSqs> { public async set(instanceName: string, data: SqsDto): Promise<wa.LocalSqs> {
if (!this.integrationEnabled) return;
if (!data.enabled) { if (!data.enabled) {
data.events = []; data.events = [];
} else { } else {
@ -77,6 +78,8 @@ export class SqsController extends EventController {
} }
public async get(instanceName: string): Promise<wa.LocalSqs> { public async get(instanceName: string): Promise<wa.LocalSqs> {
if (!this.integrationEnabled) return;
if (undefined === this.monitor.waInstances[instanceName]) { if (undefined === this.monitor.waInstances[instanceName]) {
throw new NotFoundException('Instance not found'); throw new NotFoundException('Instance not found');
} }
@ -103,19 +106,8 @@ export class SqsController extends EventController {
dateTime, dateTime,
sender, sender,
apiKey, apiKey,
}: { }: EmitData): Promise<void> {
instanceName: string; if (!this.integrationEnabled) return;
origin: string;
event: string;
data: Object;
serverUrl: string;
dateTime: string;
sender: string;
apiKey?: string;
}): Promise<void> {
if (!configService.get<Sqs>('SQS')?.ENABLED) {
return;
}
const instanceSqs = await this.get(instanceName); const instanceSqs = await this.get(instanceName);
const sqsLocal = instanceSqs?.events; const sqsLocal = instanceSqs?.events;

View File

@ -7,15 +7,16 @@ import { BadRequestException, NotFoundException } from '@exceptions';
import axios from 'axios'; import axios from 'axios';
import { isURL } from 'class-validator'; import { isURL } from 'class-validator';
import { EventController } from '../../event.controller'; import { EmitData, EventController, EventControllerInterface } from '../../event.controller';
import { WebhookDto } from '../dto/webhook.dto'; import { WebhookDto } from '../dto/webhook.dto';
export class WebhookController extends EventController { export class WebhookController extends EventController implements EventControllerInterface {
private readonly logger = new Logger(WebhookController.name); private readonly logger = new Logger(WebhookController.name);
constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) { constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {
super(prismaRepository, waMonitor); super(prismaRepository, waMonitor);
} }
integrationEnabled: boolean;
public async set(instanceName: string, data: WebhookDto): Promise<wa.LocalWebHook> { public async set(instanceName: string, data: WebhookDto): Promise<wa.LocalWebHook> {
if (!isURL(data.url, { require_tld: false })) { if (!isURL(data.url, { require_tld: false })) {
@ -78,17 +79,7 @@ export class WebhookController extends EventController {
sender, sender,
apiKey, apiKey,
local, local,
}: { }: EmitData): Promise<void> {
instanceName: string;
origin: string;
event: string;
data: Object;
serverUrl: string;
dateTime: string;
sender: string;
apiKey?: string;
local?: boolean;
}): Promise<void> {
const instanceWebhook = await this.get(instanceName); const instanceWebhook = await this.get(instanceName);
const webhookGlobal = configService.get<Webhook>('WEBHOOK'); const webhookGlobal = configService.get<Webhook>('WEBHOOK');
const webhookLocal = instanceWebhook?.events; const webhookLocal = instanceWebhook?.events;

View File

@ -8,12 +8,13 @@ import { NotFoundException } from '@exceptions';
import { Server } from 'http'; import { Server } from 'http';
import { Server as SocketIO } from 'socket.io'; import { Server as SocketIO } from 'socket.io';
import { EventController } from '../../event.controller'; import { EmitData, EventController, EventControllerInterface } from '../../event.controller';
export class WebsocketController extends EventController { export class WebsocketController extends EventController implements EventControllerInterface {
private io: SocketIO; private io: SocketIO;
private corsConfig: Array<any>; private corsConfig: Array<any>;
private readonly logger = new Logger(WebsocketController.name); private readonly logger = new Logger(WebsocketController.name);
integrationEnabled = configService.get<Websocket>('WEBSOCKET')?.ENABLED;
constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) { constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {
super(prismaRepository, waMonitor); super(prismaRepository, waMonitor);
@ -21,9 +22,7 @@ export class WebsocketController extends EventController {
} }
public init(httpServer: Server): void { public init(httpServer: Server): void {
if (!configService.get<Websocket>('WEBSOCKET')?.ENABLED) { if (!this.integrationEnabled) return;
return;
}
this.socket = new SocketIO(httpServer, { this.socket = new SocketIO(httpServer, {
cors: { cors: {
@ -59,6 +58,8 @@ export class WebsocketController extends EventController {
} }
public async set(instanceName: string, data: WebsocketDto): Promise<wa.LocalWebsocket> { public async set(instanceName: string, data: WebsocketDto): Promise<wa.LocalWebsocket> {
if (!this.integrationEnabled) return;
if (!data.enabled) { if (!data.enabled) {
data.events = []; data.events = [];
} else { } else {
@ -88,6 +89,8 @@ export class WebsocketController extends EventController {
} }
public async get(instanceName: string): Promise<wa.LocalWebsocket> { public async get(instanceName: string): Promise<wa.LocalWebsocket> {
if (!this.integrationEnabled) return;
if (undefined === this.monitor.waInstances[instanceName]) { if (undefined === this.monitor.waInstances[instanceName]) {
throw new NotFoundException('Instance not found'); throw new NotFoundException('Instance not found');
} }
@ -114,19 +117,8 @@ export class WebsocketController extends EventController {
dateTime, dateTime,
sender, sender,
apiKey, apiKey,
}: { }: EmitData): Promise<void> {
instanceName: string; if (!this.integrationEnabled) return;
origin: string;
event: string;
data: Object;
serverUrl: string;
dateTime: string;
sender: string;
apiKey?: string;
}): Promise<void> {
if (!configService.get<Websocket>('WEBSOCKET')?.ENABLED) {
return;
}
const configEv = event.replace(/[.-]/gm, '_').toUpperCase(); const configEv = event.replace(/[.-]/gm, '_').toUpperCase();
const logEnabled = configService.get<Log>('LOG').LEVEL.includes('WEBSOCKET'); const logEnabled = configService.get<Log>('LOG').LEVEL.includes('WEBSOCKET');