mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-06-09 23:06:01 +00:00
Refatoração estrutural sem mudanças funcionais. Saldo líquido: −428 linhas. Removido: - 14 funções/constantes mortas verificadas via grep no repo todo: validateCategoriaOwnership, getInstallmentAnticipationsAction, getAnticipationDetailsAction, formatDecimalForDb, currencyFormatterNoCents, optionalDecimalSchema, formatMonthLabel, getGoalProgressStatusColorClass, MONTH_PERIOD_PARAM, calculateRemainingInstallments, e 5 funções fetch* não usadas em inbox/queries.ts. - 1 tipo morto (ImportRow) + 2 órfãos consequentes (InstallmentAnticipationWithRelations, GoalProgressStatus convertido em interno). - ~30 export keywords desnecessários (símbolos usados apenas no próprio arquivo). - Re-exports mortos em barrels: EstablishmentLogoPicker, CategoryReportSkeleton, WidgetSkeleton, toNameKey. - Arquivo features/reports/types.ts (barrel inteiro era órfão). Padronizado (PT-BR→EN em identificadores expostos): - 4 constantes globais (LANCAMENTOS_* → TRANSACTIONS_*). - 12 tipos/interfaces (Lancamento*/Pagador*/Estabelecimento* → equivalentes EN). - 13 funções/components exportados (fetchPagador*, EstabelecimentoInput, PagadorInfoCard, etc.). - 5 props cross-file (preLancamentosCount → inboxPendingCount, pagadorAvatarUrl → payerAvatarUrl, etc.). - Mantidas em PT-BR conforme exceção do CLAUDE.md: variáveis locais (pagador, categoria, lancamento), accessor key pagadorName (persistida em preferências), strings de UI. Reorganizado: - transactions/: 14 helpers soltos na raiz movidos para lib/; barrel actions.ts reduzido de 76 linhas de wrappers para 14 linhas de re-exports puros; anticipation-actions.ts movido para actions/anticipation.ts. - dashboard/: 8 helpers soltos consolidados em dashboard/lib/. - reports/: 5 query files na raiz consolidados em reports/lib/. - payers/: detail-actions.ts (21KB) e detail-queries.ts movidos para payers/lib/. - shared/components/: 9 dos 16 componentes soltos agrupados em brand/, widgets/, feedback/. - shared/lib/fetch-json.ts movido para shared/utils/fetch-json.ts. Validação: pnpm exec tsc --noEmit (0 erros), biome check (0 issues), knip (sem unused). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
90 lines
3.4 KiB
TypeScript
90 lines
3.4 KiB
TypeScript
import { cacheLife, cacheTag } from "next/cache";
|
|
import { fetchAttachmentsForPeriod } from "@/features/attachments/queries";
|
|
import { fetchDashboardCategoryOverview } from "./categories/category-overview-queries";
|
|
import { fetchDashboardInvoices } from "./invoices/invoices-queries";
|
|
import { fetchDashboardAccounts } from "./lib/accounts-queries";
|
|
import { fetchDashboardInboxSnapshot } from "./lib/inbox-snapshot-queries";
|
|
import { fetchDashboardPayers } from "./lib/payers-queries";
|
|
import { fetchDashboardNotes } from "./notes/notes-queries";
|
|
import { fetchDashboardCurrentPeriodOverview } from "./overview/current-period-overview-queries";
|
|
import { fetchDashboardPeriodOverview } from "./overview/period-overview-queries";
|
|
|
|
async function fetchDashboardDataInternal(userId: string, period: string) {
|
|
const [
|
|
periodOverview,
|
|
accountsSnapshot,
|
|
invoicesSnapshot,
|
|
currentPeriodOverview,
|
|
categoryOverview,
|
|
pagadoresSnapshot,
|
|
notesData,
|
|
allAttachments,
|
|
inboxSnapshot,
|
|
] = await Promise.all([
|
|
fetchDashboardPeriodOverview(userId, period),
|
|
fetchDashboardAccounts(userId),
|
|
fetchDashboardInvoices(userId, period),
|
|
fetchDashboardCurrentPeriodOverview(userId, period),
|
|
fetchDashboardCategoryOverview(userId, period),
|
|
fetchDashboardPayers(userId, period),
|
|
fetchDashboardNotes(userId),
|
|
fetchAttachmentsForPeriod(userId, period),
|
|
fetchDashboardInboxSnapshot(userId),
|
|
]);
|
|
|
|
const attachmentsSnapshot = allAttachments.reduce(
|
|
(acc, attachment, index) => {
|
|
acc.totalBytes += attachment.fileSize;
|
|
if (attachment.mimeType.startsWith("image/")) acc.imageCount++;
|
|
if (attachment.mimeType === "application/pdf") acc.pdfCount++;
|
|
if (index < 5) acc.recentAttachments.push(attachment);
|
|
return acc;
|
|
},
|
|
{
|
|
totalCount: allAttachments.length,
|
|
totalBytes: 0,
|
|
imageCount: 0,
|
|
pdfCount: 0,
|
|
recentAttachments: [] as typeof allAttachments,
|
|
},
|
|
);
|
|
|
|
return {
|
|
metrics: periodOverview.metrics,
|
|
accountsSnapshot,
|
|
invoicesSnapshot,
|
|
billsSnapshot: currentPeriodOverview.billsSnapshot,
|
|
goalsProgressData: categoryOverview.goalsProgressData,
|
|
paymentStatusData: currentPeriodOverview.paymentStatusData,
|
|
incomeExpenseBalanceData: periodOverview.incomeExpenseBalanceData,
|
|
pagadoresSnapshot,
|
|
notesData,
|
|
paymentConditionsData: currentPeriodOverview.paymentConditionsData,
|
|
paymentMethodsData: currentPeriodOverview.paymentMethodsData,
|
|
recurringExpensesData: currentPeriodOverview.recurringExpensesData,
|
|
installmentExpensesData: currentPeriodOverview.installmentExpensesData,
|
|
topEstablishmentsData: currentPeriodOverview.topEstablishmentsData,
|
|
topExpensesAll: currentPeriodOverview.topExpensesAll,
|
|
topExpensesCardOnly: currentPeriodOverview.topExpensesCardOnly,
|
|
purchasesByCategoryData: currentPeriodOverview.purchasesByCategoryData,
|
|
incomeByCategoryData: categoryOverview.incomeByCategoryData,
|
|
expensesByCategoryData: categoryOverview.expensesByCategoryData,
|
|
attachmentsSnapshot,
|
|
inboxSnapshot,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Cached dashboard data fetcher.
|
|
* Uses "use cache" with tags for revalidation on mutations.
|
|
* Cache is keyed by userId + period, and invalidated via user-scoped tags.
|
|
*/
|
|
export async function fetchDashboardData(userId: string, period: string) {
|
|
"use cache";
|
|
cacheTag(`dashboard-${userId}`);
|
|
cacheLife({ revalidate: 3 });
|
|
return fetchDashboardDataInternal(userId, period);
|
|
}
|
|
|
|
export type DashboardData = Awaited<ReturnType<typeof fetchDashboardData>>;
|