4.4 KiB
4.4 KiB
🛠️ Stack Tecnológica — ReservaMesa
Stack Principal
Frontend Framework
Next.js 14 (App Router)
- Server Components para performance
- Client Components para interatividade em tempo real
- API Routes para webhooks e integrações externas
- Middleware para proteção de rotas
Linguagem
TypeScript — tipagem estática, melhor DX, menos bugs em produção
Estilização
Tailwind CSS v3 + Shadcn/UI
- Design system consistente
- Componentes como: Calendar, Table, Dialog, Toast, Tabs
- Dark/Light mode nativo
Animações
Framer Motion — transições de página, animações de estado
Firebase (Base de Dados Existente)
Serviços Utilizados
| Serviço | Uso no Projeto |
|---|---|
| Firestore | Base de dados principal (reservas, mesas, restaurantes) |
| Firebase Auth | Autenticação de restaurantes |
| Firebase Storage | Imagens de restaurantes, logos |
| Firebase Functions | Triggers automáticos (confirmação de reserva, notificações) |
| Firebase Hosting | (opcional, substituível por Vercel) |
Estrutura do Firestore (Proposta)
/restaurants/{restaurantId}
- name: string
- email: string
- phone: string
- address: string
- capacity: number
- openingHours: map
- logoUrl: string
- settings: map
/restaurants/{restaurantId}/tables/{tableId}
- number: number
- capacity: number
- zone: "interior" | "exterior" | "vip"
- isActive: boolean
/restaurants/{restaurantId}/reservations/{reservationId}
- clientName: string
- clientPhone: string
- clientEmail: string
- date: timestamp
- timeSlot: string (ex: "19:00-21:00")
- partySize: number
- tableId: string (ref)
- status: "pending" | "confirmed" | "seated" | "completed" | "cancelled" | "no-show"
- notes: string
- createdAt: timestamp
- updatedAt: timestamp
/restaurants/{restaurantId}/timeslots/{slotId}
- time: string
- duration: number (minutos)
- maxCapacity: number
- isActive: boolean
/users/{userId}
- restaurantId: string
- role: "owner" | "manager" | "staff"
- name: string
- email: string
Real-Time Architecture
App Mobile (Cliente) ──┐
├──▶ Firestore ◀──▶ Dashboard Web (Restaurante)
Admin Dashboard ────────┘
onSnapshot()listeners para atualizações em tempo real- Sem necessidade de polling ou WebSockets adicionais
- Latência < 500ms para atualizações
Deploy & CI/CD
| Ferramenta | Papel |
|---|---|
| Vercel | Hosting + Deploy automático |
| GitHub | Repositório de código |
| GitHub Actions | CI: lint, type-check, testes |
| Firebase CLI | Deploy de Functions e Rules |
Variáveis de Ambiente Necessárias
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
Segurança — Firebase Rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Restaurante só acede aos seus próprios dados
match /restaurants/{restaurantId} {
allow read, write: if request.auth != null
&& request.auth.uid == restaurantId;
match /reservations/{reservationId} {
allow read, write: if request.auth != null
&& get(/databases/$(database)/documents/users/$(request.auth.uid))
.data.restaurantId == restaurantId;
}
match /tables/{tableId} {
allow read, write: if request.auth != null
&& get(/databases/$(database)/documents/users/$(request.auth.uid))
.data.restaurantId == restaurantId;
}
}
// App mobile pode criar reservas e ler disponibilidade
match /restaurants/{restaurantId}/reservations/{reservationId} {
allow create: if request.auth != null;
allow read: if request.auth != null
&& resource.data.clientId == request.auth.uid;
}
}
}
Dependências Principais
{
"dependencies": {
"next": "14.x",
"react": "18.x",
"typescript": "5.x",
"firebase": "10.x",
"tailwindcss": "3.x",
"@shadcn/ui": "latest",
"framer-motion": "11.x",
"date-fns": "3.x",
"recharts": "2.x",
"react-hook-form": "7.x",
"zod": "3.x",
"lucide-react": "latest"
}
}
Versão: 1.0.0 | Maio 2026