diff --git a/src/api/controllers/instance.controller.ts b/src/api/controllers/instance.controller.ts index 2415fd83..5cbd4ece 100644 --- a/src/api/controllers/instance.controller.ts +++ b/src/api/controllers/instance.controller.ts @@ -402,6 +402,7 @@ export class InstanceController { read_status: read_status || false, sync_full_history: sync_full_history ?? false, ignore_list: [], + initial_connection: null, }; this.logger.verbose('settings: ' + JSON.stringify(settings)); diff --git a/src/api/dto/settings.dto.ts b/src/api/dto/settings.dto.ts index f74c625d..145a61b4 100644 --- a/src/api/dto/settings.dto.ts +++ b/src/api/dto/settings.dto.ts @@ -7,4 +7,5 @@ export class SettingsDto { read_status?: boolean; sync_full_history?: boolean; ignore_list?: string[]; + initial_connection?: number; } diff --git a/src/api/integrations/kwik/controllers/kwik.controller.ts b/src/api/integrations/kwik/controllers/kwik.controller.ts index d9ed07d9..094ca6c0 100644 --- a/src/api/integrations/kwik/controllers/kwik.controller.ts +++ b/src/api/integrations/kwik/controllers/kwik.controller.ts @@ -5,11 +5,12 @@ import { Logger } from '../../../../config/logger.config'; import { dbserver } from '../../../../libs/db.connect'; import { InstanceDto } from '../../../dto/instance.dto'; import { WAMonitoringService } from '../../../services/monitor.service'; +import { SettingsService } from '../../../services/settings.service'; const logger = new Logger('KwikController'); export class KwikController { - constructor(private readonly waMonitor: WAMonitoringService) {} + constructor(private readonly waMonitor: WAMonitoringService, private readonly settingsService: SettingsService) {} private isTextMessage(messageType: any) { return [ @@ -184,4 +185,17 @@ export class KwikController { }; } } + public async cleanChats(instance: InstanceDto) { + const db = configService.get('DATABASE'); + const connection = dbserver.getClient().db(db.CONNECTION.DB_PREFIX_NAME + '-whatsapp-api'); + const settings = this.settingsService.find(instance); + const initialConnection = (await settings).initial_connection; + if (initialConnection) { + connection + .collection('messages') + .deleteMany({ owner: instance.instanceName, messageTimestamp: { $lt: initialConnection } }); + } + + return { status: 'ok' }; + } } diff --git a/src/api/integrations/kwik/routes/kwik.router.ts b/src/api/integrations/kwik/routes/kwik.router.ts index effa2b2e..b0c78f14 100644 --- a/src/api/integrations/kwik/routes/kwik.router.ts +++ b/src/api/integrations/kwik/routes/kwik.router.ts @@ -70,6 +70,30 @@ export class KwikRouter extends RouterBroker { return res.status(HttpStatus.OK).json(response); }); + + this.router.post(this.routerPath('cleanChats'), ...guards, async (req, res) => { + logger.verbose('request received in cleanChats'); + logger.verbose('request body: '); + logger.verbose(req.body); + + logger.verbose('request query: '); + logger.verbose(req.query); + + logger.error('request received in cleanChats'); + logger.error('request body: '); + logger.error(req.body); + logger.error('request query: '); + logger.error(req.query); + + const response = await this.dataValidate({ + request: req, + schema: null, + ClassRef: InstanceDto, + execute: (instance) => kwikController.cleanChats(instance), + }); + + return res.status(HttpStatus.OK).json(response); + }); } public readonly router = Router(); diff --git a/src/api/models/settings.model.ts b/src/api/models/settings.model.ts index 5e0b7e01..b27b06a8 100644 --- a/src/api/models/settings.model.ts +++ b/src/api/models/settings.model.ts @@ -12,6 +12,7 @@ export class SettingsRaw { read_status?: boolean; sync_full_history?: boolean; ignore_list?: string[]; + initial_connection?: number; } const settingsSchema = new Schema({ @@ -24,6 +25,7 @@ const settingsSchema = new Schema({ read_status: { type: Boolean, required: true }, sync_full_history: { type: Boolean, required: true }, ignore_list: { type: [String], required: false }, + initial_connection: { type: Number, required: false }, }); export const SettingsModel = dbserver?.model(SettingsRaw.name, settingsSchema, 'settings'); diff --git a/src/api/server.module.ts b/src/api/server.module.ts index d6a335f3..2959623a 100644 --- a/src/api/server.module.ts +++ b/src/api/server.module.ts @@ -183,6 +183,6 @@ export const sendMessageController = new SendMessageController(waMonitor); export const chatController = new ChatController(waMonitor); export const groupController = new GroupController(waMonitor); export const labelController = new LabelController(waMonitor); -export const kwikController = new KwikController(waMonitor); +export const kwikController = new KwikController(waMonitor, settingsService); logger.info('Module - ON'); diff --git a/src/api/services/channel.service.ts b/src/api/services/channel.service.ts index f48970e5..896d894f 100644 --- a/src/api/services/channel.service.ts +++ b/src/api/services/channel.service.ts @@ -223,6 +223,7 @@ export class ChannelStartupService { read_status: data.read_status, sync_full_history: data.sync_full_history, ignore_list: data.ignore_list, + initial_connection: data.initial_connection, }; } diff --git a/src/api/services/channels/whatsapp.baileys.service.ts b/src/api/services/channels/whatsapp.baileys.service.ts index 9b823a9b..e48bb1e5 100644 --- a/src/api/services/channels/whatsapp.baileys.service.ts +++ b/src/api/services/channels/whatsapp.baileys.service.ts @@ -979,6 +979,13 @@ export class BaileysStartupService extends ChannelStartupService { continue; } + if (settings.initial_connection && (m.messageTimestamp as number) <= settings.initial_connection) { + this.logger.verbose( + `[messaging-history.set] Ignore -> ${m.messageTimestamp} <= ${settings.initial_connection}`, + ); + continue; + } + if (messagesRepository.has(m.key.id)) { continue; } @@ -1098,6 +1105,13 @@ export class BaileysStartupService extends ChannelStartupService { return; } + if (settings?.initial_connection && (received.messageTimestamp as number) <= settings.initial_connection) { + this.logger.verbose( + `[messages.upsert] Ignore -> ${received.messageTimestamp} <= ${settings.initial_connection}`, + ); + continue; + } + if (settings?.ignore_list && settings.ignore_list.includes(received.key.remoteJid)) { this.logger.verbose('contact in ignore list.'); return; diff --git a/src/api/types/wa.types.ts b/src/api/types/wa.types.ts index eb9fe99a..41d5098e 100644 --- a/src/api/types/wa.types.ts +++ b/src/api/types/wa.types.ts @@ -84,6 +84,7 @@ export declare namespace wa { read_status?: boolean; sync_full_history?: boolean; ignore_list?: string[]; + initial_connection?: number; }; export type LocalWebsocket = { diff --git a/src/validate/validate.schema.ts b/src/validate/validate.schema.ts index 532ae2f9..9f3715d0 100644 --- a/src/validate/validate.schema.ts +++ b/src/validate/validate.schema.ts @@ -1003,6 +1003,7 @@ export const settingsSchema: JSONSchema7 = { read_status: { type: 'boolean', enum: [true, false] }, sync_full_history: { type: 'boolean', enum: [true, false] }, ignore_list: { type: 'array', items: { type: 'string' } }, + initial_connection: { type: 'integer', minLength: 1 }, }, required: ['reject_call', 'groups_ignore', 'always_online', 'read_messages', 'read_status', 'sync_full_history'], ...isNotEmpty('reject_call', 'groups_ignore', 'always_online', 'read_messages', 'read_status', 'sync_full_history'),