mirror of
https://github.com/EvolutionAPI/evolution-api.git
synced 2025-07-14 01:41:24 -06:00
feat: Criado um novo grupo de rotas (business) para tratar dos catalogos de produtos e Coleções evitando alterações desnecessárias em arquivos do repositório
This commit is contained in:
parent
9a72b90ab2
commit
6c1355b64b
15
src/api/controllers/business.controller.ts
Normal file
15
src/api/controllers/business.controller.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { getCatalogDto, getCollectionsDto } from '@api/dto/business.dto';
|
||||||
|
import { InstanceDto } from '@api/dto/instance.dto';
|
||||||
|
import { WAMonitoringService } from '@api/services/monitor.service';
|
||||||
|
|
||||||
|
export class BusinessController {
|
||||||
|
constructor(private readonly waMonitor: WAMonitoringService) {}
|
||||||
|
|
||||||
|
public async fetchCatalog({ instanceName }: InstanceDto, data: getCatalogDto) {
|
||||||
|
return await this.waMonitor.waInstances[instanceName].fetchCatalog(instanceName, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async fetchCollections({ instanceName }: InstanceDto, data: getCollectionsDto) {
|
||||||
|
return await this.waMonitor.waInstances[instanceName].fetchCollections(instanceName, data);
|
||||||
|
}
|
||||||
|
}
|
@ -3,8 +3,6 @@ import {
|
|||||||
BlockUserDto,
|
BlockUserDto,
|
||||||
DeleteMessage,
|
DeleteMessage,
|
||||||
getBase64FromMediaMessageDto,
|
getBase64FromMediaMessageDto,
|
||||||
getCatalogDto,
|
|
||||||
getCollectionsDto,
|
|
||||||
MarkChatUnreadDto,
|
MarkChatUnreadDto,
|
||||||
NumberDto,
|
NumberDto,
|
||||||
PrivacySettingDto,
|
PrivacySettingDto,
|
||||||
@ -111,12 +109,4 @@ export class ChatController {
|
|||||||
public async blockUser({ instanceName }: InstanceDto, data: BlockUserDto) {
|
public async blockUser({ instanceName }: InstanceDto, data: BlockUserDto) {
|
||||||
return await this.waMonitor.waInstances[instanceName].blockUser(data);
|
return await this.waMonitor.waInstances[instanceName].blockUser(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async fetchCatalog({ instanceName }: InstanceDto, data: getCatalogDto) {
|
|
||||||
return await this.waMonitor.waInstances[instanceName].fetchCatalog(instanceName, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async fetchCatalogCollections({ instanceName }: InstanceDto, data: getCollectionsDto) {
|
|
||||||
return await this.waMonitor.waInstances[instanceName].fetchCatalogCollections(instanceName, data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
14
src/api/dto/business.dto.ts
Normal file
14
src/api/dto/business.dto.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
export class NumberDto {
|
||||||
|
number: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class getCatalogDto {
|
||||||
|
number?: string;
|
||||||
|
limit?: number;
|
||||||
|
cursor?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class getCollectionsDto {
|
||||||
|
number?: string;
|
||||||
|
limit?: number;
|
||||||
|
}
|
@ -126,14 +126,3 @@ export class BlockUserDto {
|
|||||||
number: string;
|
number: string;
|
||||||
status: 'block' | 'unblock';
|
status: 'block' | 'unblock';
|
||||||
}
|
}
|
||||||
|
|
||||||
export class getCatalogDto {
|
|
||||||
number?: string;
|
|
||||||
limit?: number;
|
|
||||||
cursor?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class getCollectionsDto {
|
|
||||||
number?: string;
|
|
||||||
limit?: number;
|
|
||||||
}
|
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
|
import { getCollectionsDto } from '@api/dto/business.dto';
|
||||||
import { OfferCallDto } from '@api/dto/call.dto';
|
import { OfferCallDto } from '@api/dto/call.dto';
|
||||||
import {
|
import {
|
||||||
ArchiveChatDto,
|
ArchiveChatDto,
|
||||||
BlockUserDto,
|
BlockUserDto,
|
||||||
DeleteMessage,
|
DeleteMessage,
|
||||||
getBase64FromMediaMessageDto,
|
getBase64FromMediaMessageDto,
|
||||||
getCatalogDto,
|
|
||||||
getCollectionsDto,
|
|
||||||
LastMessage,
|
LastMessage,
|
||||||
MarkChatUnreadDto,
|
MarkChatUnreadDto,
|
||||||
NumberBusiness,
|
NumberBusiness,
|
||||||
@ -4634,11 +4633,11 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Catalogs and collections
|
//Business Controller
|
||||||
public async fetchCatalog(instanceName: string, data: getCatalogDto) {
|
public async fetchCatalog(instanceName: string, data: getCollectionsDto) {
|
||||||
const jid = data.number ? createJid(data.number) : this.client?.user?.id;
|
const jid = data.number ? createJid(data.number) : this.client?.user?.id;
|
||||||
const limit = data.limit || 10;
|
const limit = data.limit || 10;
|
||||||
const cursor = data.cursor || null;
|
const cursor = null;
|
||||||
|
|
||||||
const onWhatsapp = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
const onWhatsapp = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
||||||
|
|
||||||
@ -4649,15 +4648,35 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
try {
|
try {
|
||||||
const info = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
const info = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
||||||
const business = await this.fetchBusinessProfile(info?.jid);
|
const business = await this.fetchBusinessProfile(info?.jid);
|
||||||
const catalog = await this.getCatalog({ jid: info?.jid, limit, cursor });
|
|
||||||
|
let catalog = await this.getCatalog({ jid: info?.jid, limit, cursor });
|
||||||
|
let nextPageCursor = catalog.nextPageCursor;
|
||||||
|
let nextPageCursorJson = nextPageCursor ? JSON.parse(atob(nextPageCursor)) : null;
|
||||||
|
let pagination = nextPageCursorJson?.pagination_cursor
|
||||||
|
? JSON.parse(atob(nextPageCursorJson.pagination_cursor))
|
||||||
|
: null;
|
||||||
|
let fetcherHasMore = pagination?.fetcher_has_more === true ? true : false;
|
||||||
|
|
||||||
|
let productsCatalog = catalog.products || [];
|
||||||
|
let countLoops = 0;
|
||||||
|
while (fetcherHasMore && countLoops < 4) {
|
||||||
|
catalog = await this.getCatalog({ jid: info?.jid, limit, cursor: nextPageCursor });
|
||||||
|
nextPageCursor = catalog.nextPageCursor;
|
||||||
|
nextPageCursorJson = nextPageCursor ? JSON.parse(atob(nextPageCursor)) : null;
|
||||||
|
pagination = nextPageCursorJson?.pagination_cursor
|
||||||
|
? JSON.parse(atob(nextPageCursorJson.pagination_cursor))
|
||||||
|
: null;
|
||||||
|
fetcherHasMore = pagination?.fetcher_has_more === true ? true : false;
|
||||||
|
productsCatalog = [...productsCatalog, ...catalog.products];
|
||||||
|
countLoops++;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
wuid: info?.jid || jid,
|
wuid: info?.jid || jid,
|
||||||
name: info?.name,
|
|
||||||
numberExists: info?.exists,
|
numberExists: info?.exists,
|
||||||
isBusiness: business.isBusiness,
|
isBusiness: business.isBusiness,
|
||||||
catalogLength: catalog?.products.length,
|
catalogLength: productsCatalog.length,
|
||||||
catalog: catalog?.products,
|
catalog: productsCatalog,
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
@ -4692,9 +4711,9 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async fetchCatalogCollections(instanceName: string, data: getCollectionsDto) {
|
public async fetchCollections(instanceName: string, data: getCollectionsDto) {
|
||||||
const jid = data.number ? createJid(data.number) : this.client?.user?.id;
|
const jid = data.number ? createJid(data.number) : this.client?.user?.id;
|
||||||
const limit = data.limit || 10;
|
const limit = data.limit <= 20 ? data.limit : 20; //(tem esse limite, não sei porque)
|
||||||
|
|
||||||
const onWhatsapp = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
const onWhatsapp = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
||||||
|
|
||||||
@ -4705,18 +4724,17 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
try {
|
try {
|
||||||
const info = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
const info = (await this.whatsappNumber({ numbers: [jid] }))?.shift();
|
||||||
const business = await this.fetchBusinessProfile(info?.jid);
|
const business = await this.fetchBusinessProfile(info?.jid);
|
||||||
const catalogCollections = await this.getCollections(info?.jid, limit);
|
const collections = await this.getCollections(info?.jid, limit);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
wuid: info?.jid || jid,
|
wuid: info?.jid || jid,
|
||||||
name: info?.name,
|
name: info?.name,
|
||||||
numberExists: info?.exists,
|
numberExists: info?.exists,
|
||||||
isBusiness: business.isBusiness,
|
isBusiness: business.isBusiness,
|
||||||
catalogLength: catalogCollections?.length,
|
collectionsLength: collections?.length,
|
||||||
catalogCollections: catalogCollections,
|
collections: collections,
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
|
||||||
return {
|
return {
|
||||||
wuid: jid,
|
wuid: jid,
|
||||||
name: null,
|
name: null,
|
||||||
|
37
src/api/routes/business.router.ts
Normal file
37
src/api/routes/business.router.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { RouterBroker } from '@api/abstract/abstract.router';
|
||||||
|
import { NumberDto } from '@api/dto/chat.dto';
|
||||||
|
import { businessController } from '@api/server.module';
|
||||||
|
import { catalogSchema, collectionsSchema } from '@validate/validate.schema';
|
||||||
|
import { RequestHandler, Router } from 'express';
|
||||||
|
|
||||||
|
import { HttpStatus } from './index.router';
|
||||||
|
|
||||||
|
export class BusinessRouter extends RouterBroker {
|
||||||
|
constructor(...guards: RequestHandler[]) {
|
||||||
|
super();
|
||||||
|
this.router
|
||||||
|
.post(this.routerPath('getCatalog'), ...guards, async (req, res) => {
|
||||||
|
const response = await this.dataValidate<NumberDto>({
|
||||||
|
request: req,
|
||||||
|
schema: catalogSchema,
|
||||||
|
ClassRef: NumberDto,
|
||||||
|
execute: (instance, data) => businessController.fetchCatalog(instance, data),
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.status(HttpStatus.OK).json(response);
|
||||||
|
})
|
||||||
|
|
||||||
|
.post(this.routerPath('getCollections'), ...guards, async (req, res) => {
|
||||||
|
const response = await this.dataValidate<NumberDto>({
|
||||||
|
request: req,
|
||||||
|
schema: collectionsSchema,
|
||||||
|
ClassRef: NumberDto,
|
||||||
|
execute: (instance, data) => businessController.fetchCollections(instance, data),
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.status(HttpStatus.OK).json(response);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly router: Router = Router();
|
||||||
|
}
|
@ -22,8 +22,6 @@ import { Contact, Message, MessageUpdate } from '@prisma/client';
|
|||||||
import {
|
import {
|
||||||
archiveChatSchema,
|
archiveChatSchema,
|
||||||
blockUserSchema,
|
blockUserSchema,
|
||||||
catalogSchema,
|
|
||||||
collectionsSchema,
|
|
||||||
contactValidateSchema,
|
contactValidateSchema,
|
||||||
deleteMessageSchema,
|
deleteMessageSchema,
|
||||||
markChatUnreadSchema,
|
markChatUnreadSchema,
|
||||||
@ -209,7 +207,6 @@ export class ChatRouter extends RouterBroker {
|
|||||||
|
|
||||||
return res.status(HttpStatus.OK).json(response);
|
return res.status(HttpStatus.OK).json(response);
|
||||||
})
|
})
|
||||||
|
|
||||||
.post(this.routerPath('updateProfileName'), ...guards, async (req, res) => {
|
.post(this.routerPath('updateProfileName'), ...guards, async (req, res) => {
|
||||||
const response = await this.dataValidate<ProfileNameDto>({
|
const response = await this.dataValidate<ProfileNameDto>({
|
||||||
request: req,
|
request: req,
|
||||||
@ -269,28 +266,6 @@ export class ChatRouter extends RouterBroker {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return res.status(HttpStatus.CREATED).json(response);
|
return res.status(HttpStatus.CREATED).json(response);
|
||||||
})
|
|
||||||
|
|
||||||
.post(this.routerPath('fetchCatalog'), ...guards, async (req, res) => {
|
|
||||||
const response = await this.dataValidate<NumberDto>({
|
|
||||||
request: req,
|
|
||||||
schema: catalogSchema,
|
|
||||||
ClassRef: NumberDto,
|
|
||||||
execute: (instance, data) => chatController.fetchCatalog(instance, data),
|
|
||||||
});
|
|
||||||
|
|
||||||
return res.status(HttpStatus.OK).json(response);
|
|
||||||
})
|
|
||||||
|
|
||||||
.post(this.routerPath('fetchCollections'), ...guards, async (req, res) => {
|
|
||||||
const response = await this.dataValidate<NumberDto>({
|
|
||||||
request: req,
|
|
||||||
schema: collectionsSchema,
|
|
||||||
ClassRef: NumberDto,
|
|
||||||
execute: (instance, data) => chatController.fetchCatalogCollections(instance, data),
|
|
||||||
});
|
|
||||||
|
|
||||||
return res.status(HttpStatus.OK).json(response);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import fs from 'fs';
|
|||||||
import mimeTypes from 'mime-types';
|
import mimeTypes from 'mime-types';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
|
import { BusinessRouter } from './business.router';
|
||||||
import { CallRouter } from './call.router';
|
import { CallRouter } from './call.router';
|
||||||
import { ChatRouter } from './chat.router';
|
import { ChatRouter } from './chat.router';
|
||||||
import { GroupRouter } from './group.router';
|
import { GroupRouter } from './group.router';
|
||||||
@ -82,6 +83,7 @@ router
|
|||||||
.use('/message', new MessageRouter(...guards).router)
|
.use('/message', new MessageRouter(...guards).router)
|
||||||
.use('/call', new CallRouter(...guards).router)
|
.use('/call', new CallRouter(...guards).router)
|
||||||
.use('/chat', new ChatRouter(...guards).router)
|
.use('/chat', new ChatRouter(...guards).router)
|
||||||
|
.use('/business', new BusinessRouter(...guards).router)
|
||||||
.use('/group', new GroupRouter(...guards).router)
|
.use('/group', new GroupRouter(...guards).router)
|
||||||
.use('/template', new TemplateRouter(configService, ...guards).router)
|
.use('/template', new TemplateRouter(configService, ...guards).router)
|
||||||
.use('/settings', new SettingsRouter(...guards).router)
|
.use('/settings', new SettingsRouter(...guards).router)
|
||||||
|
@ -3,6 +3,7 @@ import { Chatwoot, configService, ProviderSession } from '@config/env.config';
|
|||||||
import { eventEmitter } from '@config/event.config';
|
import { eventEmitter } from '@config/event.config';
|
||||||
import { Logger } from '@config/logger.config';
|
import { Logger } from '@config/logger.config';
|
||||||
|
|
||||||
|
import { BusinessController } from './controllers/business.controller';
|
||||||
import { CallController } from './controllers/call.controller';
|
import { CallController } from './controllers/call.controller';
|
||||||
import { ChatController } from './controllers/chat.controller';
|
import { ChatController } from './controllers/chat.controller';
|
||||||
import { GroupController } from './controllers/group.controller';
|
import { GroupController } from './controllers/group.controller';
|
||||||
@ -98,6 +99,7 @@ export const instanceController = new InstanceController(
|
|||||||
export const sendMessageController = new SendMessageController(waMonitor);
|
export const sendMessageController = new SendMessageController(waMonitor);
|
||||||
export const callController = new CallController(waMonitor);
|
export const callController = new CallController(waMonitor);
|
||||||
export const chatController = new ChatController(waMonitor);
|
export const chatController = new ChatController(waMonitor);
|
||||||
|
export const businessController = new BusinessController(waMonitor);
|
||||||
export const groupController = new GroupController(waMonitor);
|
export const groupController = new GroupController(waMonitor);
|
||||||
export const labelController = new LabelController(waMonitor);
|
export const labelController = new LabelController(waMonitor);
|
||||||
|
|
||||||
|
17
src/validate/business.schema.ts
Normal file
17
src/validate/business.schema.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { JSONSchema7 } from 'json-schema';
|
||||||
|
|
||||||
|
export const catalogSchema: JSONSchema7 = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
number: { type: 'string' },
|
||||||
|
limit: { type: 'number' },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const collectionsSchema: JSONSchema7 = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
number: { type: 'string' },
|
||||||
|
limit: { type: 'number' },
|
||||||
|
},
|
||||||
|
};
|
@ -315,21 +315,3 @@ export const profileSchema: JSONSchema7 = {
|
|||||||
isBusiness: { type: 'boolean' },
|
isBusiness: { type: 'boolean' },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const catalogSchema: JSONSchema7 = {
|
|
||||||
type: 'object',
|
|
||||||
properties: {
|
|
||||||
number: { type: 'string' },
|
|
||||||
limit: { type: 'number' },
|
|
||||||
cursor: { type: 'string' },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export const collectionsSchema: JSONSchema7 = {
|
|
||||||
type: 'object',
|
|
||||||
properties: {
|
|
||||||
number: { type: 'string' },
|
|
||||||
limit: { type: 'number' },
|
|
||||||
cursor: { type: 'string' },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
// Integrations Schema
|
// Integrations Schema
|
||||||
|
export * from './business.schema';
|
||||||
export * from './chat.schema';
|
export * from './chat.schema';
|
||||||
export * from './group.schema';
|
export * from './group.schema';
|
||||||
export * from './instance.schema';
|
export * from './instance.schema';
|
||||||
|
Loading…
Reference in New Issue
Block a user