@codebucket/whatsapp
Version:
A reusable WhatsApp Business API client with template and non-template support, webhook handling, pluggable storage, and text sanitization
80 lines (79 loc) • 3.07 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SequelizeMessageStore = exports.MessageStatus = exports.Message = void 0;
exports.initModels = initModels;
// src/sequelize-store.ts
const sequelize_1 = require("sequelize");
// -- define your models once --
class Message extends sequelize_1.Model {
}
exports.Message = Message;
class MessageStatus extends sequelize_1.Model {
}
exports.MessageStatus = MessageStatus;
function initModels(sequelize) {
Message.init({
accountId: { type: sequelize_1.DataTypes.STRING, allowNull: false },
messageId: { type: sequelize_1.DataTypes.STRING, allowNull: false },
from: { type: sequelize_1.DataTypes.STRING, allowNull: false },
to: { type: sequelize_1.DataTypes.STRING, allowNull: false },
direction: { type: sequelize_1.DataTypes.ENUM('in', 'out'), allowNull: false },
timestamp: { type: sequelize_1.DataTypes.DATE, allowNull: false },
content: { type: sequelize_1.DataTypes.TEXT, allowNull: false },
raw: { type: sequelize_1.DataTypes.JSON, allowNull: false },
}, { sequelize, tableName: 'whatsapp_messages' });
MessageStatus.init({
accountId: { type: sequelize_1.DataTypes.STRING, allowNull: false },
messageId: { type: sequelize_1.DataTypes.STRING, allowNull: false },
status: { type: sequelize_1.DataTypes.STRING, allowNull: false },
timestamp: { type: sequelize_1.DataTypes.DATE, allowNull: false },
raw: { type: sequelize_1.DataTypes.JSON, allowNull: false },
}, {
sequelize,
tableName: 'whatsapp_message_statuses',
// if you want upsert behavior, add:
// indexes: [{ unique: true, fields: ['accountId','messageId'] }]
});
// make sure tables exist
return sequelize.sync();
}
class SequelizeMessageStore {
constructor(sequelize) {
this.sequelize = sequelize;
initModels(this.sequelize);
}
async saveIncomingMessage(accountId, msg) {
await Message.create({
accountId,
messageId: msg.id,
from: msg.from,
to: msg.to,
direction: 'in',
timestamp: new Date(msg.timestamp * 1000),
content: msg.text?.body ?? JSON.stringify(msg),
raw: msg
});
}
async saveOutgoingMessage(accountId, opts, response) {
await Message.create({
accountId,
messageId: response.messages?.[0]?.id ?? null,
from: opts.senderPhoneNumber,
to: opts.to,
direction: 'out',
timestamp: new Date(),
content: JSON.stringify(opts.messagePayload),
raw: response
});
}
async saveMessageStatus(accountId, status) {
await MessageStatus.create({
accountId,
messageId: status.id,
status: status.status,
timestamp: new Date(status.timestamp * 1000),
raw: status
});
}
}
exports.SequelizeMessageStore = SequelizeMessageStore;