20260722120000_create_whatsapp_conversas_tables.cjs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. exports.up = function (knex) {
  2. return knex.schema
  3. .createTable("whatsapp_conversas", (t) => {
  4. t.increments("Id").primary();
  5. t.string("Telefone", 30).notNullable();
  6. t.string("NomeContato", 255).nullable();
  7. t.integer("AtendenteId").unsigned().nullable();
  8. t.string("Status", 20).notNullable().defaultTo("aberta");
  9. t.timestamp("UltimaMensagemEm").nullable();
  10. t.timestamp("CreatedAt").notNullable().defaultTo(knex.fn.now());
  11. t.timestamp("UpdatedAt").notNullable().defaultTo(knex.fn.now());
  12. t.foreign("AtendenteId").references("usuarios.Id").onDelete("SET NULL");
  13. t.unique(["Telefone"]);
  14. t.index(["Status"]);
  15. t.index(["UltimaMensagemEm"]);
  16. })
  17. .createTable("whatsapp_mensagens", (t) => {
  18. t.increments("Id").primary();
  19. t.integer("ConversaId").unsigned().notNullable();
  20. t.string("Direcao", 10).notNullable(); // entrada (cliente) | saida (atendente)
  21. t.text("Corpo").notNullable();
  22. t.string("WhatsappMessageId", 100).nullable(); // id da mensagem na Meta; usado para não duplicar reenvios de webhook
  23. t.timestamp("Timestamp").notNullable();
  24. t.timestamp("CreatedAt").notNullable().defaultTo(knex.fn.now());
  25. t.foreign("ConversaId").references("whatsapp_conversas.Id").onDelete("CASCADE");
  26. t.unique(["WhatsappMessageId"]);
  27. t.index(["ConversaId"]);
  28. t.index(["Timestamp"]);
  29. });
  30. };
  31. exports.down = function (knex) {
  32. return knex.schema
  33. .dropTable("whatsapp_mensagens")
  34. .dropTable("whatsapp_conversas");
  35. };