From 8dd2674305faef797e4d362ed31c855feb1055f1 Mon Sep 17 00:00:00 2001 From: deyvisonwanderley Date: Sat, 20 Dec 2025 13:45:21 -0300 Subject: [PATCH] refactor: optimize database queries in almoxarifado and configuracaoAlmoxarifado files by replacing filter methods with indexed queries for improved performance and clarity --- packages/backend/convex/almoxarifado.ts | 103 +++++++++++------- .../convex/configuracaoAlmoxarifado.ts | 4 +- .../backend/convex/tables/almoxarifado.ts | 6 +- 3 files changed, 70 insertions(+), 43 deletions(-) diff --git a/packages/backend/convex/almoxarifado.ts b/packages/backend/convex/almoxarifado.ts index e7dccb1..2cfda8a 100644 --- a/packages/backend/convex/almoxarifado.ts +++ b/packages/backend/convex/almoxarifado.ts @@ -33,18 +33,21 @@ export const listarMateriais = query({ return []; } - let query = ctx.db.query('materiais'); - + let materiais; if (args.ativo !== undefined) { - query = query.withIndex('by_ativo', (q) => q.eq('ativo', args.ativo)); + materiais = await ctx.db + .query('materiais') + .withIndex('by_ativo', (q) => q.eq('ativo', args.ativo!)) + .collect(); } else if (args.categoria) { - query = query.withIndex('by_categoria', (q) => q.eq('categoria', args.categoria)); + materiais = await ctx.db + .query('materiais') + .withIndex('by_categoria', (q) => q.eq('categoria', args.categoria!)) + .collect(); } else { - query = query; + materiais = await ctx.db.query('materiais').collect(); } - let materiais = await query.collect(); - // Filtros adicionais if (args.busca) { const buscaLower = args.busca.toLowerCase(); @@ -98,20 +101,29 @@ export const listarMovimentacoes = query({ return []; } - let query = ctx.db.query('movimentacoesEstoque'); - + let movimentacoes; if (args.materialId) { - query = query.withIndex('by_materialId', (q) => q.eq('materialId', args.materialId)); + movimentacoes = await ctx.db + .query('movimentacoesEstoque') + .withIndex('by_materialId', (q) => q.eq('materialId', args.materialId!)) + .collect(); } else if (args.tipo) { - query = query.withIndex('by_tipo', (q) => q.eq('tipo', args.tipo)); + movimentacoes = await ctx.db + .query('movimentacoesEstoque') + .withIndex('by_tipo', (q) => q.eq('tipo', args.tipo!)) + .collect(); } else if (args.funcionarioId) { - query = query.withIndex('by_funcionarioId', (q) => q.eq('funcionarioId', args.funcionarioId)); + movimentacoes = await ctx.db + .query('movimentacoesEstoque') + .withIndex('by_funcionarioId', (q) => q.eq('funcionarioId', args.funcionarioId!)) + .collect(); } else { - query = query.withIndex('by_data'); + movimentacoes = await ctx.db + .query('movimentacoesEstoque') + .withIndex('by_data') + .collect(); } - let movimentacoes = await query.collect(); - // Filtros de data if (args.dataInicio) { movimentacoes = movimentacoes.filter((m) => m.data >= args.dataInicio!); @@ -146,18 +158,26 @@ export const listarRequisicoes = query({ return []; } - let query = ctx.db.query('requisicoesMaterial'); - + let requisicoes; if (args.status) { - query = query.withIndex('by_status', (q) => q.eq('status', args.status)); + requisicoes = await ctx.db + .query('requisicoesMaterial') + .withIndex('by_status', (q) => q.eq('status', args.status!)) + .collect(); } else if (args.solicitanteId) { - query = query.withIndex('by_solicitanteId', (q) => q.eq('solicitanteId', args.solicitanteId)); + requisicoes = await ctx.db + .query('requisicoesMaterial') + .withIndex('by_solicitanteId', (q) => q.eq('solicitanteId', args.solicitanteId!)) + .collect(); } else if (args.setorId) { - query = query.withIndex('by_setorId', (q) => q.eq('setorId', args.setorId)); + requisicoes = await ctx.db + .query('requisicoesMaterial') + .withIndex('by_setorId', (q) => q.eq('setorId', args.setorId!)) + .collect(); + } else { + requisicoes = await ctx.db.query('requisicoesMaterial').collect(); } - const requisicoes = await query.collect(); - // Ordenar por data de criação (mais recente primeiro) requisicoes.sort((a, b) => b.criadoEm - a.criadoEm); @@ -207,16 +227,21 @@ export const listarAlertas = query({ return []; } - let query = ctx.db.query('alertasEstoque'); - + let alertas; if (args.status) { - query = query.withIndex('by_status', (q) => q.eq('status', args.status)); + alertas = await ctx.db + .query('alertasEstoque') + .withIndex('by_status', (q) => q.eq('status', args.status!)) + .collect(); } else if (args.tipo) { - query = query.withIndex('by_tipo', (q) => q.eq('tipo', args.tipo)); + alertas = await ctx.db + .query('alertasEstoque') + .withIndex('by_tipo', (q) => q.eq('tipo', args.tipo!)) + .collect(); + } else { + alertas = await ctx.db.query('alertasEstoque').collect(); } - const alertas = await query.collect(); - // Ordenar por data de criação (mais recente primeiro) alertas.sort((a, b) => b.criadoEm - a.criadoEm); @@ -486,7 +511,7 @@ export const editarMaterial = mutation({ if (args.codigo && args.codigo !== material.codigo) { const codigoExistente = await ctx.db .query('materiais') - .withIndex('by_codigo', (q) => q.eq('codigo', args.codigo)) + .withIndex('by_codigo', (q) => q.eq('codigo', args.codigo!)) .unique(); if (codigoExistente) { @@ -1100,11 +1125,13 @@ export const listarMateriaisInterno = internalQuery({ ativo: v.optional(v.boolean()) }, handler: async (ctx, args) => { - let query = ctx.db.query('materiais'); if (args.ativo !== undefined) { - query = query.withIndex('by_ativo', (q) => q.eq('ativo', args.ativo)); + return await ctx.db + .query('materiais') + .withIndex('by_ativo', (q) => q.eq('ativo', args.ativo!)) + .collect(); } - return await query.collect(); + return await ctx.db.query('materiais').collect(); } }); @@ -1114,11 +1141,11 @@ export const listarAlertasPorMaterial = internalQuery({ status: v.optional(alertaStatus) }, handler: async (ctx, args) => { - let query = ctx.db + const query = ctx.db .query('alertasEstoque') .withIndex('by_materialId', (q) => q.eq('materialId', args.materialId)); if (args.status) { - query = query.filter((q) => q.eq(q.field('status'), args.status)); + return await query.filter((q) => q.eq(q.field('status'), args.status!)).collect(); } return await query.collect(); } @@ -1129,11 +1156,13 @@ export const listarAlertasInterno = internalQuery({ status: v.optional(alertaStatus) }, handler: async (ctx, args) => { - let query = ctx.db.query('alertasEstoque'); if (args.status) { - query = query.withIndex('by_status', (q) => q.eq('status', args.status)); + return await ctx.db + .query('alertasEstoque') + .withIndex('by_status', (q) => q.eq('status', args.status!)) + .collect(); } - return await query.collect(); + return await ctx.db.query('alertasEstoque').collect(); } }); diff --git a/packages/backend/convex/configuracaoAlmoxarifado.ts b/packages/backend/convex/configuracaoAlmoxarifado.ts index 2b72548..e266dee 100644 --- a/packages/backend/convex/configuracaoAlmoxarifado.ts +++ b/packages/backend/convex/configuracaoAlmoxarifado.ts @@ -14,7 +14,7 @@ export const obterConfiguracao = query({ const config = await ctx.db .query('configuracoesAlmoxarifado') - .filter((q) => q.eq(q.field('ativo'), true)) + .withIndex('by_ativo', (q) => q.eq('ativo', true)) .first(); // Se não existe configuração, retornar valores padrão @@ -142,7 +142,7 @@ export const obterConfiguracaoInterno = internalQuery({ handler: async (ctx) => { const config = await ctx.db .query('configuracoesAlmoxarifado') - .filter((q) => q.eq(q.field('ativo'), true)) + .withIndex('by_ativo', (q) => q.eq('ativo', true)) .first(); if (!config) { diff --git a/packages/backend/convex/tables/almoxarifado.ts b/packages/backend/convex/tables/almoxarifado.ts index 75c5c64..bf16bcd 100644 --- a/packages/backend/convex/tables/almoxarifado.ts +++ b/packages/backend/convex/tables/almoxarifado.ts @@ -143,7 +143,5 @@ export const almoxarifadoTables = { ativo: v.boolean(), atualizadoPor: v.id('usuarios'), atualizadoEm: v.number() - }) -}; - - + }).index('by_ativo', ['ativo']) +}; \ No newline at end of file