feat: add 24-hour window and service category for official WhatsApp conversations in Redis; implement method to send billing info to API for Grafana usage report
parent
b9f8bfc8d5
commit
3e88b27021
|
@ -41,7 +41,10 @@ import { getSettingValue } from "../helpers/WhaticketSettings";
|
||||||
import ListWhatsAppsNumber from "../services/WhatsappService/ListWhatsAppsNumber";
|
import ListWhatsAppsNumber from "../services/WhatsappService/ListWhatsAppsNumber";
|
||||||
import SettingTicket from "../models/SettingTicket";
|
import SettingTicket from "../models/SettingTicket";
|
||||||
import { Op } from "sequelize";
|
import { Op } from "sequelize";
|
||||||
import { del, get, set } from "../helpers/RedisClient";
|
import { del, get, getKeysByPattern, set, setCBPWhatsappOfficial } from "../helpers/RedisClient";
|
||||||
|
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
|
||||||
interface WhatsappData {
|
interface WhatsappData {
|
||||||
name: string;
|
name: string;
|
||||||
|
@ -214,6 +217,48 @@ export const weebhook = async (
|
||||||
return res.sendStatus(500);
|
return res.sendStatus(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(
|
||||||
|
req?.body?.entry?.length > 0 &&
|
||||||
|
req?.body?.entry[0]?.changes?.length > 0 &&
|
||||||
|
req?.body?.entry[0]?.changes?.length > 0 &&
|
||||||
|
req?.body?.entry[0]?.changes[0]?.value?.statuses?.length>0 &&
|
||||||
|
req?.body?.entry[0]?.changes[0]?.value?.statuses[0]?.recipient_id &&
|
||||||
|
req?.body?.entry[0]?.changes[0]?.value?.statuses[0]?.conversation?.origin?.type){
|
||||||
|
|
||||||
|
const company_phone = req?.body?.entry[0]?.changes[0]?.value?.metadata?.display_phone_number
|
||||||
|
const client_phone = req?.body?.entry[0]?.changes[0]?.value?.statuses[0]?.recipient_id
|
||||||
|
const conversation_type = req?.body?.entry[0]?.changes[0]?.value?.statuses[0].conversation.origin.type
|
||||||
|
const billable = req?.body?.entry[0]?.changes[0]?.value?.statuses[0].pricing.billable
|
||||||
|
const pricing_model = req?.body?.entry[0]?.changes[0]?.value?.statuses[0].pricing.pricing_model
|
||||||
|
const conversation_type_category = req?.body?.entry[0]?.changes[0]?.value?.statuses[0].pricing.category
|
||||||
|
const msg_id = req?.body?.entry[0]?.changes[0]?.value?.statuses[0].id
|
||||||
|
|
||||||
|
const _contact_to_exist = await get({
|
||||||
|
key: "whatsapp:*",
|
||||||
|
value: `${company_phone}`
|
||||||
|
});
|
||||||
|
|
||||||
|
if(_contact_to_exist){
|
||||||
|
|
||||||
|
const lst_services_cbp = await getKeysByPattern(company_phone, client_phone, conversation_type_category)
|
||||||
|
|
||||||
|
if(lst_services_cbp && lst_services_cbp.length > 0){
|
||||||
|
for(const item of lst_services_cbp){
|
||||||
|
if(!item.split(':').includes(conversation_type_category)){
|
||||||
|
await setCBP(msg_id, company_phone, client_phone, conversation_type_category, billable, pricing_model)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
await setCBP(msg_id, company_phone, client_phone, conversation_type_category, billable, pricing_model)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('_contact_to_exist: ', _contact_to_exist)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// MESSAGE
|
// MESSAGE
|
||||||
if (req.body.object) {
|
if (req.body.object) {
|
||||||
if (
|
if (
|
||||||
|
@ -626,3 +671,53 @@ const checkWhatsAppData = ({
|
||||||
return { message: "urlApi is required!" };
|
return { message: "urlApi is required!" };
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
async function setCBP(msg_id: any, company_phone: any, client_phone: any, conversation_type_category: any, billable:string, pricing_model:string) {
|
||||||
|
const message = await Message.findByPk(msg_id)
|
||||||
|
|
||||||
|
if (message) {
|
||||||
|
await setCBPWhatsappOfficial(company_phone, client_phone, conversation_type_category, msg_id, `${message.ticketId}`)
|
||||||
|
|
||||||
|
await sendToAPIUsage(msg_id,
|
||||||
|
company_phone,
|
||||||
|
client_phone,
|
||||||
|
conversation_type_category,
|
||||||
|
`${message.ticketId}`,
|
||||||
|
billable,
|
||||||
|
pricing_model
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async function sendToAPIUsage(msg_id: any, company_phone: any, client_phone: any, conversation_type_category: any, ticketId: any, billable:string, pricing_model:string) {
|
||||||
|
const data = JSON.stringify({
|
||||||
|
"companyId": company_phone,
|
||||||
|
"provider": "meta",
|
||||||
|
"product": "whatsapp",
|
||||||
|
"type": conversation_type_category,
|
||||||
|
"msgId": msg_id,
|
||||||
|
"ticketId": `${ticketId}`,
|
||||||
|
"billable": billable,
|
||||||
|
"pricing_model": pricing_model
|
||||||
|
});
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
method: 'post',
|
||||||
|
url: 'http://172.31.187.24:6008/api/v1/billing/usage-whatsapp',
|
||||||
|
headers: {
|
||||||
|
'Authorization': 'Bearer 2ivck10D3o9qAZi0pkKudVDl9bdEVXY2s8gdxZ0jYgL1DZWTgDz6wDiIjlWgYmJtVOoqf0b42ZTLBRrfo8WoAaScRsujz3jQUNXdchSg0o43YilZGmVhheGJNAeIQRknHEll4nRJ7avcFgmDGoYbEey7TSC8EHS4Z3gzeufYYSfnKNDBwwzBURIQrTOxYFe3tBHsGOzwnuD2lU5tnEx7tr2XRO4zRNYeNY4lMBOFM0mRuyAe4kuqTrKXmJ8As200',
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
data: data
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await axios(config);
|
||||||
|
console.log('Response from whatsapp api usage: ',JSON.stringify(response.data));
|
||||||
|
} catch (error) {
|
||||||
|
console.log('Error on try register the whatsapp usage: ', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -158,6 +158,46 @@ export async function findObject(
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function setCBPWhatsappOfficial(
|
||||||
|
company_phone:string,
|
||||||
|
client_phone:string,
|
||||||
|
conversation_type:string,
|
||||||
|
msg_id: string,
|
||||||
|
ticketId?: string
|
||||||
|
) {
|
||||||
|
const key = `company_phone:${company_phone}:client_phone:${client_phone}:conversation_type:${conversation_type}`;
|
||||||
|
const result = await redis.hmset(
|
||||||
|
key,
|
||||||
|
"company_phone",
|
||||||
|
company_phone,
|
||||||
|
"client_phone",
|
||||||
|
client_phone,
|
||||||
|
"conversation_type",
|
||||||
|
conversation_type,
|
||||||
|
"msg_id",
|
||||||
|
msg_id,
|
||||||
|
"ticketId",
|
||||||
|
ticketId
|
||||||
|
);
|
||||||
|
|
||||||
|
await redis.expire(key, 86400);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function getKeysByPattern(company_phone:string, client_phone:string, conversation_type:string,) {
|
||||||
|
const pattern = `company_phone:${company_phone}:client_phone:${client_phone}:conversation_type:${conversation_type}*`;
|
||||||
|
const keys = [];
|
||||||
|
let cursor = "0";
|
||||||
|
|
||||||
|
do {
|
||||||
|
const result = await redis.scan(cursor, "MATCH", pattern, "COUNT", 100);
|
||||||
|
cursor = result[0];
|
||||||
|
keys.push(...result[1]);
|
||||||
|
} while (cursor !== "0");
|
||||||
|
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
export async function deleteObject(
|
export async function deleteObject(
|
||||||
whatsappId: string,
|
whatsappId: string,
|
||||||
contactId: string,
|
contactId: string,
|
||||||
|
|
Loading…
Reference in New Issue