Sistema completo de reservas de hotΓ©is com arquitetura moderna e escalΓ‘vel
- Sobre o projeto
- Funcionalidades
- Arquitetura
- Tecnologias
- Estrutura do Banco de Dados
- API Reference
- InstalaΓ§Γ£o
O JalaBooking Γ© uma plataforma moderna de reservas hoteleiras que oferece uma experiΓͺncia completa tanto para hΓ³spedes quanto para gestores de hotΓ©is. O sistema foi projetado com foco em escalabilidade, seguranΓ§a e performance, implementando as melhores prΓ‘ticas de desenvolvimento de software.
- GestΓ£o Precisa de InventΓ‘rio: DistinΓ§Γ£o clara entre tipos de quarto e quartos fΓsicos individuais.
- Sistema Anti-Overbooking: TransaΓ§Γ΅es atΓ΄micas com bloqueios pessimistas.
- SeguranΓ§a Robusta: AutenticaΓ§Γ£o JWT com rotaΓ§Γ£o de refresh tokens.
- Arquitetura ExtensΓvel: Preparado para funcionalidades futuras (RBAC, painel admin).
- PolΓtica de Cancelamento Inteligente: Regras de negΓ³cio aplicadas no backend.
- β Cadastro e autenticaΓ§Γ£o segura de usuΓ‘rios.
- π Busca avanΓ§ada de hotΓ©is por localizaΓ§Γ£o, datas e capacidade.
- π·οΈ Filtros de preΓ§o e ordenaΓ§Γ£o de resultados.
- π CriaΓ§Γ£o de reservas com verificaΓ§Γ£o de disponibilidade em tempo real.
- π VisualizaΓ§Γ£o do histΓ³rico de reservas (futuras e passadas).
- β Cancelamento de reservas com polΓtica automΓ‘tica (gratuito atΓ© 3 dias antes).
- π€ GestΓ£o de perfil pessoal.
- π Controle de acesso baseado em funΓ§Γ΅es (RBAC ready).
- π‘οΈ ProteΓ§Γ£o contra race conditions na criaΓ§Γ£o de reservas.
- π Refresh token rotation para seguranΓ§a aprimorada.
- π Sistema de disponibilidade computada dinamicamente.
- ποΈ Modelo de dados normalizado e otimizado.
βββββββββββββββββββββββββββββββββββββββ
β Frontend (Angular + Viun) β
β - Components - Services - Guards β
βββββββββββββββ¬ββββββββββββββββββββββββ
β REST API
βββββββββββββββΌββββββββββββββββββββββββ
β NestJS Backend β
βββββββββββββββββββββββββββββββββββββββ€
β Controllers Layer β
β - Decorators - DTOs - Pipes β
βββββββββββββββββββββββββββββββββββββββ€
β Services Layer β
β - Business Logic - Validators β
βββββββββββββββββββββββββββββββββββββββ€
β Repository Layer β
β - Prisma ORM - Entities β
βββββββββββββββββββββββββββββββββββββββ€
β Database Layer β
β PostgreSQL / MySQL β
βββββββββββββββββββββββββββββββββββββββ
User (1) ββββββ< (N) Booking
β
Hotel (1) βββ< (N) RoomType (1) βββ< (N) Room
β
βββ< (1) Booking
DecisΓ£o ArquitetΓ΄nica crΓtica: A separaΓ§Γ£o entre RoomType (categoria abstrata) e Room (unidade fΓsica) permite gestΓ£o precisa de inventΓ‘rio e previne overbooking.
- Framework: NestJS 10+
- Runtime: Node.js (β₯18.0.0)
- Linguagem: TypeScript 5+
- ORM: Prisma
- Banco de Dados: PostgreSQL (recomendado) / MySQL
- AutenticaΓ§Γ£o: @nestjs/jwt + @nestjs/passport
- Criptografia: bcrypt
- ValidaΓ§Γ£o: class-validator + class-transformer
- DocumentaΓ§Γ£o: @nestjs/swagger (OpenAPI)
- Testes: Jest + Supertest
- Config Management: @nestjs/config
- Framework: Angular 17+
- Linguagem: TypeScript 5+
- State Management: RxJS + Services
- Roteamento: Angular Router
- RequisiΓ§Γ΅es HTTP: HttpClient (Angular)
- FormulΓ‘rios: Reactive Forms
- ValidaΓ§Γ£o: Validators personalizados
- EstilizaΓ§Γ£o: SCSS + Angular Material (opcional)
- Testes: Jasmine + Karma
CREATE TABLE Users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
firstName VARCHAR(100) NOT NULL,
lastName VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
birthDate DATE NOT NULL,
role VARCHAR(50) NOT NULL DEFAULT 'USER',
createdAt TIMESTAMP NOT NULL DEFAULT NOW(),
updatedAt TIMESTAMP NOT NULL DEFAULT NOW()
);CREATE TABLE Hotels (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL,
city VARCHAR(100) NOT NULL,
country VARCHAR(100) NOT NULL,
description TEXT,
imageUrl VARCHAR(255),
rating DECIMAL(2,1)
);
CREATE INDEX idx_hotels_city ON Hotels(city);CREATE TABLE RoomTypes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotelId UUID NOT NULL REFERENCES Hotels(id) ON DELETE CASCADE,
name VARCHAR(100) NOT NULL,
description TEXT,
capacity INT NOT NULL,
basePricePerNight DECIMAL(10,2) NOT NULL
);CREATE TABLE Rooms (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
roomTypeId UUID NOT NULL REFERENCES RoomTypes(id) ON DELETE CASCADE,
roomNumber VARCHAR(20) NOT NULL,
status VARCHAR(50) NOT NULL DEFAULT 'AVAILABLE'
);CREATE TABLE Bookings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
userId UUID NOT NULL REFERENCES Users(id) ON DELETE CASCADE,
roomId UUID NOT NULL REFERENCES Rooms(id) ON DELETE CASCADE,
checkInDate DATE NOT NULL,
checkOutDate DATE NOT NULL,
totalPrice DECIMAL(10,2) NOT NULL,
status VARCHAR(50) NOT NULL DEFAULT 'CONFIRMED',
createdAt TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_bookings_dates ON Bookings(checkInDate, checkOutDate);- Node.js (β₯18.0.0)
- PostgreSQL (β₯14.0) ou MySQL (β₯8.0)
- npm ou pnpm
- Angular CLI (
npm install -g @angular/cli) - NestJS CLI (
npm install -g @nestjs/cli) - Git
π©π»βπ» Gabriela Diniz Santos;
π¨π½βπ» Leonardo Ferreira Lima.