b97f7f94e4
- 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>
44 lines
1.7 KiB
JavaScript
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
|