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:
Wayre Avelar 2025-02-06 19:04:28 -03:00
parent 9a72b90ab2
commit 6c1355b64b
12 changed files with 121 additions and 79 deletions

View 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);
}
}

View File

@ -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);
}
} }

View 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;
}

View File

@ -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;
}

View File

@ -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,

View 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();
}

View File

@ -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);
}); });
} }

View File

@ -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)

View File

@ -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);

View 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' },
},
};

View File

@ -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' },
},
};

View File

@ -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';