UNPKG

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