refactor: faxina arquitetural — código morto, identificadores em inglês e estrutura padronizada

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>
This commit is contained in:
Felipe Coutinho
2026-05-06 18:42:54 +00:00
parent b9b843b9db
commit 7d0781b035
229 changed files with 415 additions and 872 deletions

View File

@@ -1,32 +1,5 @@
"use server";
import { generateInsightsAction as generateInsightsActionImpl } from "./actions/generate";
import {
deleteSavedInsightsAction as deleteSavedInsightsActionImpl,
loadSavedInsightsAction as loadSavedInsightsActionImpl,
saveInsightsAction as saveInsightsActionImpl,
export { generateInsightsAction } from "./actions/generate";
export {
deleteSavedInsightsAction,
saveInsightsAction,
} from "./actions/storage";
export async function generateInsightsAction(
...args: Parameters<typeof generateInsightsActionImpl>
): ReturnType<typeof generateInsightsActionImpl> {
return generateInsightsActionImpl(...args);
}
export async function saveInsightsAction(
...args: Parameters<typeof saveInsightsActionImpl>
): ReturnType<typeof saveInsightsActionImpl> {
return saveInsightsActionImpl(...args);
}
export async function loadSavedInsightsAction(
...args: Parameters<typeof loadSavedInsightsActionImpl>
): ReturnType<typeof loadSavedInsightsActionImpl> {
return loadSavedInsightsActionImpl(...args);
}
export async function deleteSavedInsightsAction(
...args: Parameters<typeof deleteSavedInsightsActionImpl>
): ReturnType<typeof deleteSavedInsightsActionImpl> {
return deleteSavedInsightsActionImpl(...args);
}

View File

@@ -5,10 +5,7 @@ import { z } from "zod";
import { savedInsights } from "@/db/schema";
import { getUser } from "@/shared/lib/auth/server";
import { db } from "@/shared/lib/db";
import {
type InsightsResponse,
InsightsResponseSchema,
} from "@/shared/lib/schemas/insights";
import type { InsightsResponse } from "@/shared/lib/schemas/insights";
import type { ActionResult } from "./types";
const periodSchema = z
@@ -115,62 +112,6 @@ export async function saveInsightsAction(
}
}
export async function loadSavedInsightsAction(period: string): Promise<
ActionResult<{
insights: InsightsResponse;
modelId: string;
createdAt: Date;
} | null>
> {
try {
const user = await getUser();
const validatedPeriod = periodSchema.safeParse(period);
if (!validatedPeriod.success) {
return {
success: false,
error: validatedPeriod.error.issues[0]?.message ?? "Período inválido",
};
}
period = validatedPeriod.data;
const result = await db
.select()
.from(savedInsights)
.where(
and(
eq(savedInsights.userId, user.id),
eq(savedInsights.period, period),
),
)
.limit(1);
if (result.length === 0) {
return {
success: true,
data: null,
};
}
const saved = result[0];
const insights = InsightsResponseSchema.parse(JSON.parse(saved.data));
return {
success: true,
data: {
insights,
modelId: saved.modelId,
createdAt: saved.createdAt,
},
};
} catch (error) {
console.error("Error loading saved insights:", error);
return {
success: false,
error: "Erro ao carregar análise salva. Tente novamente.",
};
}
}
export async function deleteSavedInsightsAction(
period: string,
): Promise<ActionResult<void>> {

View File

@@ -21,7 +21,7 @@ import {
savedInsightsQueryKey,
useSavedInsights,
} from "@/features/insights/hooks/use-saved-insights";
import { EmptyState } from "@/shared/components/empty-state";
import { EmptyState } from "@/shared/components/feedback/empty-state";
import { Alert, AlertDescription } from "@/shared/components/ui/alert";
import { Button } from "@/shared/components/ui/button";
import { Card, CardContent, CardHeader } from "@/shared/components/ui/card";

View File

@@ -3,8 +3,8 @@
import { useQuery } from "@tanstack/react-query";
import { z } from "zod";
import type { SavedInsightsRecord } from "@/features/insights/queries";
import { fetchJson } from "@/shared/lib/fetch-json";
import { InsightsResponseSchema } from "@/shared/lib/schemas/insights";
import { fetchJson } from "@/shared/utils/fetch-json";
const savedInsightsRecordSchema = z.object({
insights: InsightsResponseSchema,