perf: remover polling de storage-stats e trabalho repetido na busca do cache

- useStorageMonitor: o efeito com setInterval de 10 s chamava
  /api/storage-stats em toda aba aberta só para escrever no console
  (nenhum estado é atualizado); o servidor faz fs.stat e conta as
  chaves do cache a cada chamada. A busca inicial de estatísticas
  continua.
- JsonCacheManager.searchProducts: convertToAPIProduct rodava duas vezes
  por produto (filtro e map) e a relevância era recalculada, com
  toLowerCase, a cada comparação do sort; agora é uma vez por produto.
This commit is contained in:
evandro committed 2026-10-10 04:16:34 -03:00
1 parent a9ab66e26f
commit 3d59903114
2 files changed
+13 -53

No files matched your search

-38
View File
@@ -86,44 +86,6 @@ export function useStorageMonitor(): UseStorageMonitorReturn {
fetchStats(); fetchStats();
}, [fetchStats]); }, [fetchStats]);
// Monitoramento automático para todos os usuários
useEffect(() => {
let intervalId: NodeJS.Timeout | null = null;
const startMonitoring = async () => {
// Executar imediatamente
await fetchAndDisplayStats();
// Depois executar a cada 10 segundos
intervalId = setInterval(async () => {
await fetchAndDisplayStats();
}, 10000);
};
const fetchAndDisplayStats = async () => {
try {
const response = await fetch("/api/storage-stats");
const data = await response.json();
if (data.success) {
console.log(
`[Monitor] Total de produtos no cache: ${data.data.totalProducts} produtos`
);
}
} catch (error) {
console.error("[Monitor] Erro ao buscar estatísticas:", error);
}
};
startMonitoring();
return () => {
if (intervalId) {
clearInterval(intervalId);
}
};
}, []);
return { return {
stats, stats,
isLoading, isLoading,
+13 -15
View File
@@ -235,33 +235,31 @@ export class JsonCacheManager {
`[JSON Cache] Buscando: "${searchTerm}" (país: ${country || "todos"})` `[JSON Cache] Buscando: "${searchTerm}" (país: ${country || "todos"})`
); );
// Filtrar produtos // Filtrar produtos; a relevância é calculada uma vez por produto
const filteredProducts = Object.values(this.cacheData.products) const filteredProducts = Object.values(this.cacheData.products)
.filter((cachedProduct) => { .filter((cachedProduct) => {
const product = this.convertToAPIProduct(cachedProduct);
// Verificar se corresponde à query // Verificar se corresponde à query
const matchesQuery = const matchesQuery =
product.product_name?.toLowerCase().includes(searchTerm) || cachedProduct.product_name?.toLowerCase().includes(searchTerm) ||
product.brands?.toLowerCase().includes(searchTerm) || cachedProduct.brands?.toLowerCase().includes(searchTerm) ||
product.categories?.toLowerCase().includes(searchTerm); cachedProduct.categories?.toLowerCase().includes(searchTerm);
// Verificar país se especificado // Verificar país se especificado
const matchesCountry = const matchesCountry =
!country || !country ||
product.countries_tags?.includes(country) || cachedProduct.countries_tags?.includes(country) ||
product.countries?.toLowerCase().includes(country.toLowerCase()); cachedProduct.countries?.toLowerCase().includes(country.toLowerCase());
return matchesQuery && matchesCountry; return matchesQuery && matchesCountry;
}) })
.map((cachedProduct) => this.convertToAPIProduct(cachedProduct)) .map((cachedProduct) => {
// Ordenar por relevância const product = this.convertToAPIProduct(cachedProduct);
.sort((a, b) => { return { product, score: this.calculateRelevanceScore(product, searchTerm) };
const scoreA = this.calculateRelevanceScore(a, searchTerm);
const scoreB = this.calculateRelevanceScore(b, searchTerm);
return scoreB - scoreA;
}) })
.slice(0, limit); // Ordenar por relevância
.sort((a, b) => b.score - a.score)
.slice(0, limit)
.map(({ product }) => product);
console.log( console.log(
`[JSON Cache] Encontrados ${filteredProducts.length} produtos` `[JSON Cache] Encontrados ${filteredProducts.length} produtos`