feat: add full project - backend, frontend, docker, specs and configs
This commit is contained in:
parent
b77c7d5a01
commit
e6cb06255b
24489 changed files with 61341 additions and 36 deletions
113
.specify/features/006-client-area/plan.md
Normal file
113
.specify/features/006-client-area/plan.md
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
# Implementation Plan: Área do Cliente
|
||||
|
||||
**Branch**: `master` | **Date**: 2026-04-13 | **Spec**: [spec.md](.specify/features/006-client-area/spec.md)
|
||||
**Input**: Feature specification from `.specify/features/006-client-area/spec.md`
|
||||
**Depends On**: Feature 005 — `ClientUser` model, `require_auth` decorator, JWT middleware
|
||||
|
||||
## Summary
|
||||
|
||||
Implementação da Área do Cliente: favoritos (persistidos no backend), comparação de imóveis (localStorage), histórico de visitas e boletos. O backend expõe dois blueprints novos (`/api/v1/me` e `/api/v1/admin`) com autenticação JWT. O frontend adiciona rotas protegidas sob `/area-do-cliente`, contextos React para favoritos e comparação, e componentes de interação (HeartButton, ComparisonBar).
|
||||
|
||||
## Technical Context
|
||||
|
||||
**Language/Version**: Python 3.12 (backend) · TypeScript 5.5 (frontend)
|
||||
**Primary Dependencies**: Flask 3.x, SQLAlchemy 2.x, Pydantic v2, PyJWT (backend) · React 18, react-router-dom v6, Axios, Tailwind CSS 3.4 (frontend)
|
||||
**Storage**: PostgreSQL 16 — 3 novas tabelas: `saved_properties`, `visit_requests`, `boletos`
|
||||
**Testing**: pytest (backend) — testes de rotas com client fixture; Vite build check (frontend)
|
||||
**Target Platform**: Servidor Linux (Docker) + SPA na mesma origem via proxy Vite
|
||||
**Project Type**: Web service (Flask REST API) + SPA (React)
|
||||
**Performance Goals**: Favoritar/desfavoritar < 2 s; tabela de comparação renderizada < 1 s para 3 imóveis
|
||||
**Constraints**: Comparação não persiste no backend; admin sem UI no MVP; sem integração com gateway de pagamento
|
||||
**Scale/Scope**: MVP — funcionalidades essenciais da área logada; admin opera via API direta
|
||||
|
||||
## Constitution Check
|
||||
|
||||
*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*
|
||||
|
||||
| Princípio | Status | Observação |
|
||||
|-----------|--------|------------|
|
||||
| I. Design-First | ✅ PASS | Todos os novos componentes React usam tokens do DESIGN.md: fundo `#08090a`, painéis `#0f1011`, acento `#5e6ad2`/`#7170ff`. Nenhum estilo inline fora do sistema. |
|
||||
| II. Separation of Concerns | ✅ PASS | Flask retorna JSON puro; React é SPA. Contextos (`FavoritesContext`, `ComparisonContext`) são camada de estado frontend apenas. |
|
||||
| III. Spec-Driven | ✅ PASS | spec.md aprovado → plan.md (este arquivo) → tasks.md → implementação. |
|
||||
| IV. Data Integrity | ✅ PASS | Todas as entradas via Pydantic schemas. `amount` usa `Numeric(12, 2)`. Novas tabelas via migração Alembic. Foreign keys explicitamente anuláveis ou não-anuláveis conforme modelo. |
|
||||
| V. Security | ⚠️ PARTIAL | `/api/v1/me/*` protegido por `require_auth`. `/api/v1/admin/*` protegido por `require_auth` mas **sem verificação de role no MVP** — qualquer ClientUser autenticado pode acessar rotas admin. FR-018 exige 403 para token de ClientUser; esta verificação é **adiada** e documentada como dívida técnica (ver Complexity Tracking). |
|
||||
| VI. Simplicity First | ✅ PASS | Comparação em localStorage (sem backend). Sem gateway de pagamento. Admin sem UI. Nenhuma abstração nova sem 3+ usos concretos. |
|
||||
|
||||
**POST-DESIGN RE-CHECK**: ✅ Após Phase 1, o modelo de dados não introduz complexidade adicional. Violação de Princípio V documentada como dívida técnica deliberada para MVP.
|
||||
|
||||
## Project Structure
|
||||
|
||||
### Documentation (this feature)
|
||||
|
||||
```text
|
||||
.specify/features/006-client-area/
|
||||
├── plan.md # Este arquivo
|
||||
├── research.md # Fase 0 — decisões e alternativas
|
||||
├── data-model.md # Fase 1 — entidades e relacionamentos
|
||||
├── quickstart.md # Fase 1 — como rodar e testar localmente
|
||||
├── contracts/
|
||||
│ ├── me-favorites.md
|
||||
│ ├── me-visits.md
|
||||
│ ├── me-boletos.md
|
||||
│ └── admin.md
|
||||
└── tasks.md # Fase 2 (gerado por /speckit.tasks)
|
||||
```
|
||||
|
||||
### Source Code (repository root)
|
||||
|
||||
```text
|
||||
backend/
|
||||
├── app/
|
||||
│ ├── models/
|
||||
│ │ ├── saved_property.py # NOVO — SavedProperty
|
||||
│ │ ├── visit_request.py # NOVO — VisitRequest
|
||||
│ │ ├── boleto.py # NOVO — Boleto
|
||||
│ │ └── client_user.py # PRÉ-REQUISITO (Feature 005)
|
||||
│ ├── schemas/
|
||||
│ │ └── client_area.py # NOVO — todos os schemas de entrada/saída
|
||||
│ ├── routes/
|
||||
│ │ ├── client_area.py # NOVO — blueprint client_bp (/api/v1/me)
|
||||
│ │ └── admin.py # NOVO — blueprint admin_bp (/api/v1/admin)
|
||||
│ └── __init__.py # ATUALIZAR — registrar modelos e blueprints
|
||||
└── migrations/
|
||||
└── versions/
|
||||
└── xxxx_add_saved_properties_visit_requests_boletos.py # NOVO
|
||||
|
||||
frontend/
|
||||
└── src/
|
||||
├── types/
|
||||
│ └── clientArea.ts # NOVO — VisitRequest, Boleto, ComparisonState
|
||||
├── contexts/
|
||||
│ ├── ComparisonContext.tsx # NOVO — estado de comparação (localStorage)
|
||||
│ └── FavoritesContext.tsx # NOVO — favoritos (backend, apenas logado)
|
||||
├── components/
|
||||
│ ├── ComparisonBar.tsx # NOVO — barra flutuante rodapé
|
||||
│ ├── HeartButton.tsx # NOVO — toggle favorito
|
||||
│ ├── PropertyCard.tsx # ATUALIZAR — HeartButton + botão Comparar
|
||||
│ └── PropertyDetail/
|
||||
│ └── ContactSection.tsx # ATUALIZAR — criar VisitRequest se logado
|
||||
├── layouts/
|
||||
│ └── ClientLayout.tsx # NOVO — sidebar da área do cliente
|
||||
├── pages/
|
||||
│ └── client/
|
||||
│ ├── ClientDashboardPage.tsx # NOVO
|
||||
│ ├── FavoritesPage.tsx # NOVO
|
||||
│ ├── ComparisonPage.tsx # NOVO
|
||||
│ ├── VisitsPage.tsx # NOVO
|
||||
│ └── BoletosPage.tsx # NOVO
|
||||
├── services/
|
||||
│ └── clientArea.ts # NOVO — getFavorites, addFavorite, removeFavorite, getVisits, getBoletos
|
||||
└── App.tsx # ATUALIZAR — rotas protegidas + providers de contexto
|
||||
|
||||
backend/tests/
|
||||
├── test_client_area.py # NOVO — testes de rotas /me e /admin
|
||||
└── conftest.py # ATUALIZAR — fixture client_user + auth token
|
||||
```
|
||||
|
||||
**Structure Decision**: Web application (Option 2). Backend Flask REST API + frontend React SPA. Estrutura de arquivos segue o padrão já estabelecido no projeto (um arquivo por model, um arquivo por blueprint, schemas agrupados por domínio).
|
||||
|
||||
## Complexity Tracking
|
||||
|
||||
| Violação | Por que necessária | Alternativa mais simples rejeitada porque |
|
||||
|----------|-------------------|-------------------------------------------|
|
||||
| Princípio V: rotas `/api/v1/admin/*` sem verificação de role no MVP | Admin opera via API direta; implementar RBAC completo exige tabela de roles, seed e testes adicionais fora do escopo desta feature | Adicionar `require_admin_role` desde já acoplaria esta feature a Feature 005 e bloquearia o MVP sem benefício real — único usuário da API admin é o próprio dono da aplicação |
|
||||
Loading…
Add table
Add a link
Reference in a new issue