Substitui o portal Vite+Vue puro por Nuxt 3 com BFF embutido (Nitro server
routes) e fluxo de autenticação Keycloak via token-handler pattern.
Server (BFF):
- server/api/auth/{login,callback,refresh,logout,me}.ts — Keycloak PKCE
- server/api/proxy/[...path].ts — proxy autenticado pro core-api com tenant
- server/utils/{session,keycloak,pkce,redis,tenant,prefeitura}.ts
- server/middleware/csrf.ts — Origin check + header X-Requested-With
Auth (token-handler pattern):
- JWT vive só server-side em Redis; cliente recebe cookie session-id opaco
- Refresh transparente quando access_token expira
- Multi-tenant via hostname → X-Municipio/X-Dominio injetados no proxy
- Realm dedicado: modumfiscal-portal-{env}
Frontend (Nuxt):
- src/pages/** (file-based routing) substitui src/views/
- Plugins SSR: prefeitura (bootstrap pré-hidratação) + auth (hidrata user via /api/auth/me)
- Composables useAuth, useApi, useLoginModal, useFocusLoginInput
- Modal global de login quando middleware /portal/** bloqueia
- Splash overlay no boot esconde flash do preset inicial pro tema dinâmico
- DocumentoInput bloqueia campo quando user autenticado (pré-preenche em certidão/IPTU)
Removidos:
- index.html, vite.config.js, src/main.js, src/router/
- src/config/apiClient.js (substituído por \$fetch via /api/proxy)
- src/services/{auth,prefeitura}Service.js (lógica migrada pra composables/plugins)
- src/mocks/ (não mais usado)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
87 lines
3.4 KiB
JavaScript
87 lines
3.4 KiB
JavaScript
// Todas as chamadas vão via /api/proxy/** (BFF injeta Bearer + tenant headers).
|
|
// Cada método retorna o envelope cru do core-api: { data, message, statusCode, ... }
|
|
// — exceto rotas binárias (PDF), que retornam ArrayBuffer.
|
|
|
|
const FETCH_HEADERS = { 'X-Requested-With': 'fetch' }
|
|
|
|
function proxyUrl(path) {
|
|
return `/api/proxy${path}`
|
|
}
|
|
|
|
export const portalService = {
|
|
// ─── Painel ──────────────────────────────────────────────────────────────
|
|
getPainelResumo() {
|
|
return $fetch(proxyUrl('/contribuinte/painel/resumo'), { headers: FETCH_HEADERS })
|
|
},
|
|
|
|
getAtividades(pagina = 0, tamanho = 5) {
|
|
return $fetch(proxyUrl('/contribuinte/painel/atividades'), {
|
|
headers: FETCH_HEADERS,
|
|
query: { pagina, tamanho },
|
|
})
|
|
},
|
|
|
|
// ─── Débitos ─────────────────────────────────────────────────────────────
|
|
getDebitos(params = {}) {
|
|
return $fetch(proxyUrl('/contribuinte/debitos'), {
|
|
headers: FETCH_HEADERS,
|
|
query: params,
|
|
})
|
|
},
|
|
|
|
emitirGuia(idDebito) {
|
|
return $fetch(proxyUrl(`/contribuinte/debitos/${idDebito}/guia`), {
|
|
headers: FETCH_HEADERS,
|
|
responseType: 'arrayBuffer',
|
|
})
|
|
},
|
|
|
|
// ─── Certidões ───────────────────────────────────────────────────────────
|
|
getCertidoes() {
|
|
return $fetch(proxyUrl('/contribuinte/certidoes'), { headers: FETCH_HEADERS })
|
|
},
|
|
|
|
reemitirCertidao(idCertidao) {
|
|
return $fetch(proxyUrl(`/contribuinte/certidoes/${idCertidao}/pdf`), {
|
|
headers: FETCH_HEADERS,
|
|
responseType: 'arrayBuffer',
|
|
})
|
|
},
|
|
|
|
// ─── Alvarás ─────────────────────────────────────────────────────────────
|
|
getAlvaras(params = {}) {
|
|
return $fetch(proxyUrl('/contribuinte/alvaras'), {
|
|
headers: FETCH_HEADERS,
|
|
query: params,
|
|
})
|
|
},
|
|
|
|
// ─── Pagamentos ──────────────────────────────────────────────────────────
|
|
getPagamentos(params = {}) {
|
|
return $fetch(proxyUrl('/contribuinte/pagamentos'), {
|
|
headers: FETCH_HEADERS,
|
|
query: params,
|
|
})
|
|
},
|
|
|
|
getComprovante(idPagamento) {
|
|
return $fetch(proxyUrl(`/contribuinte/pagamentos/${idPagamento}/comprovante`), {
|
|
headers: FETCH_HEADERS,
|
|
responseType: 'arrayBuffer',
|
|
})
|
|
},
|
|
|
|
// ─── Dados cadastrais ────────────────────────────────────────────────────
|
|
getDadosCadastrais() {
|
|
return $fetch(proxyUrl('/contribuinte/dados'), { headers: FETCH_HEADERS })
|
|
},
|
|
|
|
atualizarContato(payload) {
|
|
return $fetch(proxyUrl('/contribuinte/dados/contato'), {
|
|
method: 'PUT',
|
|
headers: FETCH_HEADERS,
|
|
body: payload,
|
|
})
|
|
},
|
|
}
|