|
| 1 | +# CODEBASE.md — AppCondomínio |
| 2 | + |
| 3 | +> Mapa de dependências de arquivos do projeto. |
| 4 | +> Lido pelo agente antes de modificar qualquer arquivo para garantir que todos os afetados sejam atualizados juntos. |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## 🗺️ Mapa de Dependências |
| 9 | + |
| 10 | +### Frontend (apps/web) |
| 11 | + |
| 12 | +#### Autenticação |
| 13 | +| Arquivo | Depende de | Afetados se modificado | |
| 14 | +|---------|-----------|----------------------| |
| 15 | +| `apps/web/src/app/login/page.tsx` | `hooks/useAuth.ts` | Nenhum | |
| 16 | +| `apps/web/src/hooks/useAuth.ts` | `app/login/page.tsx` | Todas as páginas protegidas | |
| 17 | + |
| 18 | +#### Páginas |
| 19 | +| Arquivo | Depende de | Afetados se modificado | |
| 20 | +|---------|-----------|----------------------| |
| 21 | +| `apps/web/src/app/moradores/page.tsx` | `data/mockData.ts`, `types/index.ts`, `/api/auth/register`, `/api/support/search` | Nenhum | |
| 22 | +| `apps/web/src/app/perfil/page.tsx` | `data/mockData.ts` | Nenhum | |
| 23 | +| `apps/web/src/app/portaria/page.tsx` | `data/mockData.ts`, `types/index.ts` | Nenhum | |
| 24 | +| `apps/web/src/app/suporte/page.tsx` | `/api/support/*` | Nenhum | |
| 25 | +| `apps/web/src/app/dashboard/page.tsx` | `data/mockData.ts` | Nenhum | |
| 26 | + |
| 27 | +#### Dados e Tipos |
| 28 | +| Arquivo | Depende de | Afetados se modificado | |
| 29 | +|---------|-----------|----------------------| |
| 30 | +| `apps/web/src/data/mockData.ts` | Nenhum | Todas as páginas que o importam | |
| 31 | +| `apps/web/src/types/index.ts` | Nenhum | `moradores/page.tsx`, `portaria/page.tsx`, `visitantes/page.tsx` | |
| 32 | + |
| 33 | +#### Layout e Global |
| 34 | +| Arquivo | Depende de | Afetados se modificado | |
| 35 | +|---------|-----------|----------------------| |
| 36 | +| `apps/web/src/app/layout.tsx` | `globals.css` | Todas as páginas | |
| 37 | +| `apps/web/src/app/globals.css` | Nenhum | Toda a aplicação | |
| 38 | + |
| 39 | +--- |
| 40 | + |
| 41 | +### Backend (apps/backend) |
| 42 | + |
| 43 | +#### Módulos |
| 44 | +| Arquivo | Depende de | Afetados se modificado | |
| 45 | +|---------|-----------|----------------------| |
| 46 | +| `apps/backend/src/app.module.ts` | `AuthModule`, `SupportModule`, `PrismaModule`, `ThrottlerModule` | Toda a aplicação | |
| 47 | +| `apps/backend/src/main.ts` | `app.module.ts`, `HttpExceptionFilter` | Toda a API | |
| 48 | + |
| 49 | +#### Auth |
| 50 | +| Arquivo | Depende de | Afetados se modificado | |
| 51 | +|---------|-----------|----------------------| |
| 52 | +| `apps/backend/src/auth/auth.module.ts` | `AuthService`, `AuthController`, `PrismaModule` | `app.module.ts` | |
| 53 | +| `apps/backend/src/auth/auth.service.ts` | `PrismaService`, `bcrypt`, `dto/login.dto.ts`, `dto/register.dto.ts` | `auth.controller.ts` | |
| 54 | +| `apps/backend/src/auth/auth.controller.ts` | `AuthService` | Rotas `/api/auth/*` | |
| 55 | +| `apps/backend/src/auth/dto/login.dto.ts` | `class-validator` | `auth.service.ts` | |
| 56 | +| `apps/backend/src/auth/dto/register.dto.ts` | `class-validator` | `auth.service.ts` | |
| 57 | + |
| 58 | +#### Support |
| 59 | +| Arquivo | Depende de | Afetados se modificado | |
| 60 | +|---------|-----------|----------------------| |
| 61 | +| `apps/backend/src/support/support.module.ts` | `SupportService`, `SupportController`, `PrismaModule` | `app.module.ts` | |
| 62 | +| `apps/backend/src/support/support.service.ts` | `PrismaService` | `support.controller.ts` | |
| 63 | +| `apps/backend/src/support/support.controller.ts` | `SupportService` | Rotas `/api/support/*` | |
| 64 | + |
| 65 | +#### Infraestrutura |
| 66 | +| Arquivo | Depende de | Afetados se modificado | |
| 67 | +|---------|-----------|----------------------| |
| 68 | +| `apps/backend/src/prisma/prisma.service.ts` | `@prisma/client`, `PrismaPg`, `pg` | Todos os services que usam Prisma | |
| 69 | +| `apps/backend/src/prisma/prisma.module.ts` | `PrismaService` | `auth.module.ts`, `support.module.ts` | |
| 70 | +| `apps/backend/src/common/filters/http-exception.filter.ts` | `@nestjs/common` | `main.ts` | |
| 71 | + |
| 72 | +--- |
| 73 | + |
| 74 | +## 🗄️ Schema Prisma (PostgreSQL) |
| 75 | + |
| 76 | +```prisma |
| 77 | +model User { |
| 78 | + id String @id @default(uuid()) |
| 79 | + email String @unique |
| 80 | + name String |
| 81 | + password String // bcrypt hash |
| 82 | + role String @default("resident") // "admin" | "resident" | "operator" |
| 83 | + createdAt DateTime @default(now()) |
| 84 | + updatedAt DateTime @updatedAt |
| 85 | +} |
| 86 | +
|
| 87 | +model SupportTicket { |
| 88 | + id String @id @default(uuid()) |
| 89 | + title String |
| 90 | + description String |
| 91 | + status String @default("open") |
| 92 | + priority String @default("medium") |
| 93 | + userId String? |
| 94 | + createdAt DateTime @default(now()) |
| 95 | + updatedAt DateTime @updatedAt |
| 96 | +} |
| 97 | +``` |
| 98 | + |
| 99 | +> ⚠️ Ao modificar o schema, **sempre** rodar `prisma migrate dev` e atualizar os services afetados. |
| 100 | +
|
| 101 | +--- |
| 102 | + |
| 103 | +## 🌐 Endpoints de API |
| 104 | + |
| 105 | +| Método | Rota | Serviço | Validação | |
| 106 | +|--------|------|---------|-----------| |
| 107 | +| `POST` | `/api/auth/register` | `AuthService.register` | `RegisterDto` (class-validator) | |
| 108 | +| `POST` | `/api/auth/login` | `AuthService.login` | `LoginDto` (class-validator) | |
| 109 | +| `GET` | `/api/support/search?q=` | `SupportService.search` | Parametrizado (Prisma) | |
| 110 | +| `POST` | `/api/support/tickets` | `SupportService.createTicket` | Body validation | |
| 111 | + |
| 112 | +--- |
| 113 | + |
| 114 | +## 🔗 Convenções de Código |
| 115 | + |
| 116 | +### Frontend (Next.js + Tailwind) |
| 117 | +- **Componentes**: `"use client"` apenas quando necessário |
| 118 | +- **Estilo**: Tailwind utility classes + CSS variables (`--font-manrope`) |
| 119 | +- **Estado**: `useState` + `useEffect` (sem biblioteca externa de estado) |
| 120 | +- **Fetch**: `fetch()` nativo com `encodeURIComponent()` para query params |
| 121 | + |
| 122 | +### Backend (NestJS) |
| 123 | +- **Padrão**: Module → Controller → Service → Prisma |
| 124 | +- **DTOs**: `class-validator` decorators para validação |
| 125 | +- **Erros**: `HttpException` com mensagens genéricas (sem information disclosure) |
| 126 | +- **Banco**: Sempre usar Prisma parametrizado — **nunca** string interpolation em queries |
| 127 | + |
| 128 | +### Segurança Obrigatória |
| 129 | +- Senhas: mínimo 8 chars, 1 maiúscula, 1 minúscula, 1 número, 1 especial (`@$!%*?&`) |
| 130 | +- Rate limiting: 10 req / 60s por IP |
| 131 | +- CORS: apenas `localhost:3000` em dev |
| 132 | +- Secrets: nunca hardcoded — usar `.env` |
| 133 | + |
| 134 | +--- |
| 135 | + |
| 136 | +## 📦 Dependências Principais |
| 137 | + |
| 138 | +### Frontend |
| 139 | +```json |
| 140 | +{ |
| 141 | + "next": "^15", |
| 142 | + "react": "^19", |
| 143 | + "tailwindcss": "^4", |
| 144 | + "lucide-react": "latest" |
| 145 | +} |
| 146 | +``` |
| 147 | + |
| 148 | +### Backend |
| 149 | +```json |
| 150 | +{ |
| 151 | + "@nestjs/core": "^11", |
| 152 | + "@nestjs/throttler": "^6", |
| 153 | + "@prisma/client": "^7", |
| 154 | + "bcrypt": "^5", |
| 155 | + "helmet": "^8", |
| 156 | + "class-validator": "^0.14", |
| 157 | + "pg": "^8" |
| 158 | +} |
| 159 | +``` |
| 160 | + |
| 161 | +--- |
| 162 | + |
| 163 | +## 🐳 Docker Compose |
| 164 | + |
| 165 | +| Serviço | Porta | Descrição | |
| 166 | +|---------|-------|-----------| |
| 167 | +| `web` | `3000` | Next.js frontend | |
| 168 | +| `backend` | `3001` | NestJS API | |
| 169 | +| `postgres` | `5432` | PostgreSQL 16 | |
| 170 | + |
| 171 | +```bash |
| 172 | +# Iniciar ambiente local |
| 173 | +npm run dev:local |
| 174 | + |
| 175 | +# Ver logs |
| 176 | +npm run dev:local:logs |
| 177 | + |
| 178 | +# Parar |
| 179 | +npm run dev:local:down |
| 180 | +``` |
| 181 | + |
| 182 | +--- |
| 183 | + |
| 184 | +> Última atualização: 2026-05-24 |
0 commit comments