A full-stack hotel booking application built with Flutter (Frontend) and Dart Frog (Backend) with PostgreSQL database. This application allows users to search for hotels, view details, make bookings, and leave reviews.
- Features
- Architecture
- Database Schema
- Prerequisites
- Installation & Setup
- Running the Application
- Technologies Used
- Troubleshooting
- ๐ Hotel Search - Search hotels by location with radius-based filtering
- ๐จ Hotel Listings - Browse hotels with detailed information
- ๐๏ธ Room Categories - View different room types and availability
- ๐ Booking System - Book rooms with check-in/check-out dates
- โญ Reviews & Ratings - Read and write hotel reviews
- ๐ฏ Advanced Filters - Filter by star rating, property type, price, and more
- ๐ฑ Multi-Platform - Runs on iOS, Android, Web, and Windows
- ๐๏ธ Hotel Management - Add, update, and delete hotels
- ๐ Data Seeding - Generate fake data for testing (1000+ hotels)
- ๐ API Secret Key - Admin operations protected by secret key
This application follows a 3-tier architecture:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PRESENTATION LAYER โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Flutter Frontend (BLoC Pattern) โ โ
โ โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Auth Page โ โ Hotel List โ โ Hotel Details โ โ โ
โ โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Auth Bloc โ โ Hotel Bloc โ โ Repositories โ โ โ
โ โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ HTTP/REST API
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ APPLICATION LAYER โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Dart Frog Backend (RESTful API) โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ API Routes (v1) โ โ โ
โ โ โ /auth/signup /auth/signin /hotels /search โ โ โ
โ โ โ /hotels/:id/room /hotels/:id/review โ โ โ
โ โ โ /hotels/:id/room/:id/booking โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Middleware Layer โ โ โ
โ โ โ Auth โ DB Connection โ Services โ Logging โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Controllers & Services โ โ โ
โ โ โ AuthController HotelController BookingService โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ SQL Queries
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ DATA LAYER โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ PostgreSQL Database โ โ
โ โ โโโโโโโโ โโโโโโโโโ โโโโโโโโ โโโโโโโโโโโ โโโโโโโโโ โ โ
โ โ โUsers โ โHotels โ โRooms โ โBookings โ โReviewsโ โ โ
โ โ โโโโโโโโ โโโโโโโโโ โโโโโโโโ โโโโโโโโโโโ โโโโโโโโโ โ โ
โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโโโ โ โ
โ โ โAddress โ โContact โ โDetails โ โLocalities โ โ โ
โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโโโ โ โ
โ โ โ โ
โ โ Triggers: Auto-update hotel ratings โ โ
โ โ Functions: Distance calculation (geolocation) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
apps/frontend/
โโโ lib/
โ โโโ app/
โ โ โโโ <feature>/ # Feature-based organization
โ โ โ โโโ bloc/ # State management (BLoC)
โ โ โ โโโ view/ # UI components & pages
โ โโโ data/
โ โ โโโ client/ # HTTP clients (e.g., Dio)
โ โ โโโ model/ # Data models
โ โ โโโ repository/ # Data repositories
โ โโโ config/ # App configuration (routes, theme)
โ โโโ l10n/ # Internationalization
apps/backend/
โโโ routes/
โ โโโ api/v1/
โ โ โโโ <resource>/ # Resource endpoints
โ โ โ โโโ index.dart # GET / POST
โ โ โ โโโ [id].dart # Dynamic routes
โ โโโ index.dart # Root endpoint
โโโ lib/
โ โโโ controller/ # Request handlers & validation
โ โโโ service/ # Business logic
โ โโโ middleware/ # Auth, logging, injection
โ โโโ models/ # Re-exports from shared packages
โ โโโ database/
โ โโโ extensions/ # *Db classes (HotelDb, UserDb, etc.)
โ โโโ tables.dart # Table name constants
packages/
โโโ models/ # booking_models: Shared DTOs (Hotel, User, Booking, etc.)
โ โโโ lib/src/ # common model files
โโโ utils/ # booking_utils: Shared utilities & API constants
โโโ lib/src/
โโโ endpoints.dart # API endpoint constants
โโโ rating_utils.dart
erDiagram
users ||--o{ bookings : makes
users ||--o{ reviews : writes
hotels ||--o{ rooms : contains
hotels ||--o{ reviews : receives
hotels ||--|| address : has
hotels ||--|| contact : has
hotels ||--|| details : has
rooms ||--o{ bookings : has
users {
varchar id PK
varchar name
varchar email
varchar password
varchar access_token
varchar profile_image
bigint phone
date date_of_birth
varchar city
varchar state
varchar country
bigint pincode
}
hotels {
integer id PK
varchar name
text description
varchar property_type
varchar chain
integer star
real rating
integer rooms_starting_price
varchar cover_image
}
address {
serial id PK
varchar street
varchar city
varchar state
varchar country
bigint pincode
real latitude
real longitude
integer hotel_id FK
}
contact {
serial id PK
bigint phone
varchar email
varchar website
integer hotel_id FK
}
details {
serial id PK
text[] amenities
text[] rules
text[] preferences
text[] hotel_images
integer hotel_id FK
}
rooms {
serial id PK
varchar category
text description
integer price
integer count
integer capacity
text[] amenities
text[] room_images
integer hotel_id FK
}
bookings {
serial id PK
varchar status
date booking_date
date checkin
date checkout
integer rooms
integer guests
integer room_id FK
varchar user_id FK
}
reviews {
serial id PK
real rating
text review
text[] guest_images
integer hotel_id FK
varchar user_id FK
}
localities {
serial id PK
text name
real latitude
real longitude
}
- Users can make multiple Bookings and write multiple Reviews
- Hotels have one Address, one Contact, and one Details record
- Hotels contain multiple Rooms and receive multiple Reviews
- Rooms can have multiple Bookings
- Localities are used for geolocation-based search
distance()- Calculates distance between two coordinates (geolocation search)update_hotel_rating()- Automatically updates hotel rating when a review is added
Before you begin, ensure you have the following installed:
- Flutter SDK: >= 3.35.0
- Dart SDK: >= 3.9.0 (comes with Flutter)
- PostgreSQL: >= 15.x
- Docker & Docker Compose: (Optional, for containerized setup)
- Melos: Install with
dart pub global activate melos - Dart Frog CLI: Install with
dart pub global activate dart_frog_cli - Very Good CLI: Install with
dart pub global activate very_good_cli
- OS: macOS, Linux, or Windows
- RAM: Minimum 8GB recommended
- Storage: 5GB free space
git clone https://github.com/G1Joshi/Booking-App.git
cd Booking-AppThis command installs dependencies for all packages and links them.
melos run installTo initialize the database, you first need to start the backend services (which includes the database container).
- Start Backend: Follow the instructions in Running the Application to start the backend.
- Initialize Schema: Once the backend is running, run the following SQL scripts in order:
apps/backend/queries/
โโโ drop/
โโโ tables/
โโโ functions/
โโโ triggers/
โโโ seed/
This project uses Melos to manage scripts. You can run the backend and frontend using the following commands from the root of the project.
melos run run:backendThis command will:
- Start the Docker containers (PostgreSQL).
- Start the Dart Frog development server on port
8090.
Server will start at: http://localhost:8090
melos run run:frontendThis command will run the frontend in Chrome (Web) with the development flavor.
| Technology | Purpose |
|---|---|
| Flutter | Cross-platform UI framework |
| Dart | Programming language |
| flutter_bloc | State management (BLoC) |
| Dio | HTTP client for API calls |
| shared_preferences | Local storage for tokens |
| flutter_rating_bar | Rating UI component |
| shimmer | Loading shimmer animations |
| equatable | Value equality for BLoC |
| intl | Internationalization & formats |
| Technology | Purpose |
|---|---|
| Dart Frog | Backend REST API framework |
| Dart | Programming language |
| PostgreSQL | Relational database |
| postgres | PostgreSQL driver for Dart |
| uuid | UUID v4 for access token generation |
| Technology | Purpose |
|---|---|
| Docker | Containerization |
| Docker Compose | Multi-container orchestration |
| Adminer | Database management tool |
| Melos | Monorepo management |
melos run test:backendmelos run test:frontendmelos run test:modelsmelos run test:utilsIssue: Database connection failed
Solution:
1. Check if PostgreSQL is running: pg_isready
3. Ensure database exists: psql -l
Issue: Cannot connect to backend
Solution:
1. Verify backend is running on localhost:8080
2. Check API_URL in lib/config/apis.dart
3. For physical devices, use network IP instead of localhost
Jeevan Joshi (@G1Joshi)
- Very Good Ventures for Flutter best practices
- Dart Frog Team for the amazing backend framework
- Invertase for
Melosto manage monorepo - Flutter Community for continuous support
Happy Coding! ๐