Files
instrucoes_gerais/clube67/newwhats.local/backend/src/modules/chats/chat.cache.js
T
VPS 4 Deploy Agent b97f7f94e4 feat: sistema de figurinhas, emoji PT-BR e preloader inteligente
- Stickers: captura automática por fileSha256 (Baileys) no MessageHandler,
  tabela Prisma 'stickers' com deduplicação por [tenantId, sha256],
  API REST /api/stickers (list + favorite toggle), cache IndexedDB permanente
  (sem TTL — conteúdo imutável), StickerPanel.tsx com abas Recentes/Favoritos
- Emoji picker: migrado de emoji-picker-react para @emoji-mart/react com
  locale="pt" (tradução completa: categorias, busca, mensagem de sem resultado)
- Preloader: aparece apenas em hard reload (F5/URL direta) via
  performance.getEntriesByType('navigation').type + sessionStorage flag,
  navegação client-side Next.js pula o overlay instantaneamente
- Avatar cache: Wasabi como storage persistente + IndexedDB client-side,
  avatar_version via MD5(avatarUrl) sem coluna extra no banco,
  rota /api/storage/view/* para servir arquivos Wasabi ao frontend

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 17:48:36 +02:00

44 lines
1.7 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.invalidateChatListCache = invalidateChatListCache;
/**
* chat.cache.ts — Invalidação centralizada do cache da listagem de chats.
*
* O cache é populado em GET /api/chats com TTL de 30s.
* Esta função invalida todas as variações (archived, limit) para um par
* tenant+instance — uma nova mensagem ou alteração no chat força refetch.
*
* Usa SCAN ao invés de KEYS para não bloquear o DragonflyDB em prod.
*/
const dragonfly_1 = require("../../infra/cache/dragonfly");
const logger_1 = require("../../config/logger");
/**
* Remove todas as chaves de cache da listagem de chats para um instance.
* Pattern: chats:list:{tenantId}:{instanceId}:*
* Operação fire-and-forget: erros são logados mas não propagados.
*/
async function invalidateChatListCache(tenantId, instanceId) {
if (!dragonfly_1.dragonfly.isAlive())
return;
try {
const client = dragonfly_1.dragonfly.raw();
const pattern = `chats:list:${tenantId}:${instanceId}:*`;
const stream = client.scanStream({ match: pattern, count: 100 });
const keys = [];
await new Promise((resolve, reject) => {
stream.on('data', (batch) => {
for (const k of batch)
keys.push(k);
});
stream.on('end', () => resolve());
stream.on('error', (err) => reject(err));
});
if (keys.length > 0) {
await client.del(...keys);
}
}
catch (err) {
logger_1.logger.warn({ err, tenantId, instanceId }, '[chat.cache] Falha ao invalidar cache (ignorado)');
}
}
//# sourceMappingURL=chat.cache.js.map