Files
NaMesa_site/docs/02_TECH_STACK.md

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