MVP 1 - Web - Foundation Layer¶
Atualizado: 2026-03-27
Objetivo¶
Estabelecer uma camada de infraestrutura reutilizável no auraxis-web antes de codificar as
regras de negócio dos módulos. O princípio central é: cada módulo não deve reinventar HTTP
handling, toast, paginação, validação ou componentes genéricos — esses insumos ficam prontos
na base para consumo imediato.
Motivação¶
O auraxis-web possui seis módulos com integração API pendente (goals, portfolio,
alerts, simulations, shared-entries, subscription). Sem uma base comum, cada módulo
acumularia boilerplate idêntico, pontos de falha independentes e comportamento inconsistente
ao usuário. Qualquer mudança global (ex: formato de toast de erro) exigiria edição em N
arquivos.
Escopo¶
WF — Foundation Layer¶
| Task | Entregável | Caminho |
|---|---|---|
| WF1 | Interceptors HTTP globais + ApiResponse<T>, PaginatedResponse<T> |
app/core/api/ |
| WF2 | createApiQuery + createApiMutation (factories sobre Vue Query) |
app/core/query/ |
| WF3 | Utils globais: date, number, string, validators (CPF, CNPJ, telefone) |
app/utils/ |
| WF4 | Zod schemas reutilizáveis: CPF, CNPJ, telefone, moeda, data, paginação | app/core/validation/schemas/ |
| WF5 | Stores Pinia: useUiStore (sidebar, theme, modal stack) + useFiltersStore |
app/stores/ |
| WF6 | Composables: useToast, usePagination, useFilters, useConfirm, useErrorBoundary |
app/composables/ |
| WF7 | Shared UI Kit: UiConfirmDialog, UiFilterBar, UiPagination, UiStatusBadge, UiCurrencyDisplay |
app/shared/components/ |
WI — Integração mock → API real¶
| Task | Página | Endpoints |
|---|---|---|
| WI1 | goals.vue |
GET /goals |
| WI2 | portfolio.vue |
GET /wallet |
| WI3 | alerts.vue |
GET /alerts, PATCH /alerts/:id/read, DELETE /alerts/:id |
| WI4 | simulations.vue |
GET /simulations, DELETE /simulations/:id |
| WI5 | shared-entries.vue |
GET /shared-entries?direction=sent/received, DELETE /shared-entries/:id |
| WI6 | subscription.vue |
GET /subscriptions/me, GET /subscriptions/plans, POST /subscriptions/checkout |
WB — Bug Fixes e Completude¶
| Task | Problema | Solução |
|---|---|---|
| WB1 | plans.vue com referência quebrada ao PlanCard antigo; tools.vue com placeholder <h1> |
Remover/redirecionar plans.vue; implementar tools.vue como hub NaiveUI |
Arquitetura da Foundation Layer¶
app/core/api/ — HTTP¶
http-client.ts (existente — createHttpClient + X-API-Contract: v2)
interceptors.ts (novo — 401 logout, 403 toast, 5xx toast)
types.ts (novo — ApiResponse<T>, PaginatedResponse<T>, ApiError)
O interceptors.ts é registrado no createHttpClient via axios.interceptors.response.use.
Nenhum módulo precisa tratar esses erros individualmente.
app/core/query/ — Vue Query factories¶
use-api-query.ts (createApiQuery — wrapper sobre useQuery)
use-api-mutation.ts (createApiMutation — wrapper sobre useMutation)
Contrato de uso:
// Módulo de goals
const { data, isLoading } = createApiQuery(['goals'], goalsApi.getGoals);
// Módulo de alerts (com mutation)
const deleteMutation = createApiMutation(
alertsApi.deleteAlert,
{ invalidates: [['alerts']], successMessage: 'Alerta removido' }
);
O factory encapsula: queryKey, staleTime padrão (5 min), retry em 500, normalização de
erro via useErrorBoundary.
app/core/validation/schemas/ — Zod¶
common.ts — cpfSchema, cnpjSchema, phoneSchema, currencySchema, dateSchema
pagination.ts — paginationParamsSchema
Schemas importados diretamente em formulários VeeValidate via toTypedSchema().
app/utils/ — Utilitários puros¶
currency.ts (existente — formatCurrency)
date.ts (novo — formatDate, formatRelativeTime, formatDateRange)
number.ts (novo — formatPercentage, formatDecimal, clamp)
string.ts (novo — truncate, capitalize)
validators.ts (novo — isCPF, isCNPJ, isPhone)
app/stores/ — Pinia¶
session.ts (existente — token/cookie)
user.ts (existente — profile, isProfileComplete)
ui.ts (novo — sidebarCollapsed, activeTheme, modalStack)
filters.ts (novo — filtros globais reativos, debounce, syncWithQueryString)
app/composables/ — Composables¶
useToast.ts (novo — wrapper NaiveUI $message com API padronizada)
usePagination.ts (novo — page/limit/total reativos + métodos)
useFilters.ts (novo — estado + debounce + sync query string)
useConfirm.ts (novo — dialog de confirmação via $dialog NaiveUI)
useErrorBoundary.ts (novo — normaliza ApiError → mensagem pt-BR amigável)
app/shared/components/ — UI Kit¶
UiListPanel/ (existente)
UiSurfaceCard/ (existente)
UiEmptyState/ (existente)
UiSegmentedControl/ (existente)
UiConfirmDialog/ (novo — NModal de confirmação reutilizável)
UiFilterBar/ (novo — NInput + NSelect + NDatePicker combinados)
UiPagination/ (novo — NPagination configurado)
UiStatusBadge/ (novo — NTag semântico por status string)
UiCurrencyDisplay/ (novo — formatCurrency + cor condicional)
Sequência de execução recomendada¶
Fase 1 — Core (desbloqueador)
WF1 → WF2 → WF3 → WF4 → WF5
Fase 2 — Composables + UI Kit
WF6 → WF7
Fase 3 — Integração (paralelo após WF1 + WF2)
WB1 (sem dependência)
WI1, WI2, WI4 (sem mutations complexas)
WI3, WI5 (com mutations + optimistic update)
WI6 (checkout — maior risco)
Critérios de qualidade¶
- Cobertura ≥ 85% em todos os arquivos novos (lines/functions/statements/branches)
- Zero elementos HTML puros em páginas (apenas componentes NaiveUI ou Shared UI Kit)
- Todos os componentes novos com stories Storybook (mínimo 3 variações)
pnpm quality-checkpassando no branch antes de abrir PR- Responsive validado em 375px, 768px e 1280px
Referências¶
app/core/http/http-client.ts— client HTTP existenteapp/composables/useAuth/— exemplo de API adapter existenteapp/shared/components/UiListPanel/— exemplo de componente shared existente.context/61_design_source_of_truth.md— contrato canônico de design para bootstrap de agentesdocs/wiki/MVP-1-Web-Rebrand-Total-2026-04.md— direção oficial do rebrand webdocs/wiki/MVP-1-Web-Design-System-v3-Market-Pulse.md— tokens/componentes/estados oficiais do webTASKS.md— status de execução das tasks WF/WI/WB