Adds option to fetch instance usage data

This commit is contained in:
Pedro Howat 2024-09-03 14:20:37 -03:00
parent 088b05793f
commit 33a5a503d9
3 changed files with 79 additions and 3 deletions

View File

@ -1,4 +1,4 @@
import { Document } from 'bson';
import { calculateObjectSize, Document } from 'bson';
import { configService, Database } from '../../../../config/env.config';
import { Logger } from '../../../../config/logger.config';
@ -137,4 +137,49 @@ export class KwikController {
return { status: 'ok' };
}
public async instanceInfo({ instanceName }: InstanceDto, messageTimestamp: number, usage?: number) {
const db = configService.get<Database>('DATABASE');
const connection = dbserver.getClient().db(db.CONNECTION.DB_PREFIX_NAME + '-whatsapp-api');
const messages = connection.collection('messages');
const pipeline: Document[] = [
{ $sort: { 'key.remoteJid': -1, messageTimestamp: -1 } },
{
$group: {
_id: '$key.remoteJid',
owner: { $first: '$owner' },
message: { $first: '$message' },
lastAllMsgTimestamp: { $first: '$messageTimestamp' },
name: { $first: '$pushName' },
fromMe: { $first: '$key.fromMe' },
},
},
{ $match: { owner: instanceName, lastAllMsgTimestamp: { $gte: messageTimestamp } } },
{ $count: 'rowCount' },
];
const chatCount = await messages.aggregate(pipeline).toArray();
if (usage) {
return {
chatCount: chatCount[0].rowCount,
totalSize: usage,
newVal: 0,
};
} else {
const userMessages = await messages
.find({ owner: instanceName, messageTimestamp: { $gte: messageTimestamp } })
.toArray();
let totalSize = 0;
userMessages.forEach(function (doc) {
totalSize += calculateObjectSize(doc);
});
return {
chatCount: chatCount[0].rowCount,
totalSize: totalSize,
newVal: 1,
};
}
}
}

View File

@ -36,7 +36,7 @@ export class KwikRouter extends RouterBroker {
return res.status(HttpStatus.OK).json(response);
});
this.router.post(this.routerPath('cleanup'), ...guards, async (req, res) => {
logger.verbose('request received in findChats');
logger.verbose('request received in cleanup');
logger.verbose('request body: ');
logger.verbose(req.body);
@ -52,6 +52,24 @@ export class KwikRouter extends RouterBroker {
return res.status(HttpStatus.OK).json(response);
});
this.router.get(this.routerPath('instanceInfo'), ...guards, async (req, res) => {
logger.verbose('request received in instanceInfo');
logger.verbose('request body: ');
logger.verbose(req.body);
logger.verbose('request query: ');
logger.verbose(req.query);
const response = await this.dataValidate<InstanceDto>({
request: req,
schema: null,
ClassRef: InstanceDto,
execute: (instance) => kwikController.instanceInfo(instance, Number(req.query.messageTimestamp)),
});
return res.status(HttpStatus.OK).json(response);
});
}
public readonly router = Router();

View File

@ -6,7 +6,7 @@ import { dbserver } from '../../libs/db.connect';
import { instanceNameSchema, oldTokenSchema, presenceOnlySchema } from '../../validate/validate.schema';
import { RouterBroker } from '../abstract/abstract.router';
import { InstanceDto, SetPresenceDto } from '../dto/instance.dto';
import { instanceController } from '../server.module';
import { instanceController, kwikController } from '../server.module';
import { OldToken } from '../services/auth.service';
import { HttpStatus } from './index.router';
@ -104,6 +104,9 @@ export class InstanceRouter extends RouterBroker {
logger.verbose(req.body);
const key = req.get('apikey');
const fullFetch = req.query.fullFetch ? Number(req.query.fullFetch) : 0;
const messageTimestamp = req.query.messageTimestamp ? req.query.messageTimestamp : -1;
const usage = req.query.usage ? Number(req.query.usage) : null;
logger.verbose('request query: ');
logger.verbose(req.query);
@ -114,6 +117,16 @@ export class InstanceRouter extends RouterBroker {
execute: (instance) => instanceController.fetchInstances(instance, key),
});
if (fullFetch == 1) {
const usageData = await this.dataValidate<InstanceDto>({
request: req,
schema: null,
ClassRef: InstanceDto,
execute: (instance) => kwikController.instanceInfo(instance, Number(messageTimestamp), usage),
});
response.usageData = usageData;
}
return res.status(HttpStatus.OK).json(response);
})
.post(this.routerPath('setPresence'), ...guards, async (req, res) => {