A comprehensive hotel booking and reservation management system built with Go backend and HTML/CSS/JavaScript frontend, featuring room availability checking, reservation management, and administrative dashboard.
- Room Management: Multiple room types (General's Quarters, Major's Suite)
- Reservation System: Complete booking workflow with availability checking
- User Authentication: Secure login system for administrators
- Admin Dashboard: Comprehensive reservation management interface
- Email Integration: Automated email notifications for bookings
- Session Management: Secure session handling with SCS
- Database Integration: PostgreSQL with migration support
- Form Validation: Client and server-side validation
- Responsive Design: Mobile-friendly Bootstrap interface
- Calendar Integration: Visual availability calendar
- Search Functionality: Advanced availability search
- Language: Go 1.23.4
- Router: Chi Router (github.com/go-chi/chi/v5)
- Database: PostgreSQL
- Session Management: SCS (github.com/alexedwards/scs/v2)
- CSRF Protection: NoSurf (github.com/justinas/nosurf)
- Email: Simple Mail (github.com/xhit/go-simple-mail/v2)
- Database Migrations: Buffalo Pop/Fizz
- Framework: Server-side rendered HTML templates
- Styling: Bootstrap 5
- JavaScript: Vanilla JS with SweetAlert2
- Icons: Font Awesome
- Date Picker: Vanillajs-datepicker
- Notifications: Notie.js
- Database: PostgreSQL
- Migration Tool: Buffalo Pop
- Template Engine: Go HTML templates
- Build Tool: Go build system
bookings/
βββ cmd/ # Application entry points
β βββ web/ # Web application
β βββ main.go # Main application entry
β βββ routes.go # HTTP routes configuration
β βββ middlewares.go # HTTP middleware
β βββ send-mail.go # Email service
β βββ *_test.go # Web layer tests
βββ internal/ # Private application code
β βββ config/ # Application configuration
β β βββ config.go # Config structures
β βββ drivers/ # Database drivers
β β βββ drivers.go # Database connection
β βββ forms/ # Form handling and validation
β β βββ forms.go # Form validation logic
β β βββ errors.go # Form error handling
β β βββ forms_test.go # Form tests
β βββ handlers/ # HTTP request handlers
β β βββ handlers.go # Route handlers
β β βββ handlers_test.go # Handler tests
β β βββ setup_test.go # Test setup utilities
β βββ helpers/ # Utility functions
β β βββ helpers.go # Helper functions
β βββ models/ # Data models
β β βββ models.go # Database models
β β βββ templatedata.go # Template data structures
β βββ render/ # Template rendering
β β βββ render.go # Template renderer
β β βββ render_test.go # Render tests
β β βββ setup_test.go # Render test setup
β βββ repository/ # Data access layer
β βββ repository.go # Repository interfaces
β βββ dbrepo/ # Database repository implementations
βββ templates/ # HTML templates
β βββ base.layout.tmpl # Base layout template
β βββ admin.layout.tmpl # Admin layout template
β βββ home.page.tmpl # Homepage template
β βββ about.page.tmpl # About page template
β βββ contact.page.tmpl # Contact page template
β βββ generals.page.tmpl # General's Quarters room page
β βββ majors.page.tmpl # Major's Suite room page
β βββ search-availability.page.tmpl # Search form
β βββ make-reservations.page.tmpl # Reservation form
β βββ reservation-summary.page.tmpl # Booking summary
β βββ choose-room.page.tmpl # Room selection
β βββ login.page.tmpl # Admin login
β βββ admin-dashboard.page.tmpl # Admin dashboard
β βββ admin-reservations-calender.page.tmpl # Calendar view
β βββ admin-all-reservations.page.tmpl # All reservations
β βββ admin-new-reservations.page.tmpl # New reservations
β βββ admin-reservation-show.page.tmpl # Reservation details
βββ static/ # Static assets
β βββ css/ # Stylesheets
β β βββ styles.css # Custom styles
β βββ js/ # JavaScript files
β β βββ app.js # Application JavaScript
β βββ images/ # Image assets
β β βββ outside.png # Hotel exterior
β β βββ tray.png # Service tray
β β βββ woman-laptop.png # Hero image
β β βββ generals-quarters.png # Room image
β β βββ marjors-suite.png # Room image
β βββ admin/ # Admin panel assets
β βββ css/ # Admin stylesheets
β βββ js/ # Admin JavaScript
β βββ images/ # Admin images
β βββ vendors/ # Third-party libraries
βββ migrations/ # Database migrations
β βββ schema.sql # Complete database schema
β βββ *_create_*.up.fizz # Forward migrations
β βββ *_create_*.down.fizz # Rollback migrations
β βββ *_seed_*.sql # Database seeding
βββ email-templates/ # Email templates
β βββ basic.html # Basic email template
βββ html-source/ # Static HTML source files
β βββ index.html # Homepage source
β βββ about.html # About page source
β βββ contact.html # Contact page source
β βββ generals.html # General's room source
β βββ majors.html # Major's room source
β βββ make-reservation.html # Reservation form source
β βββ reservation.html # Reservation page source
βββ logs/ # Application logs
βββ go.mod # Go module definition
βββ go.sum # Go module checksums
βββ database.yml.example # Database configuration template
βββ run.sh # Application startup script
βββ update.sh # Update script
βββ testdbconnection.go # Database connection test
βββ .gitignore # Git ignore rules
βββ README.md # This file
- Go: 1.23.4 or later
- PostgreSQL: 12.0 or later
- Buffalo CLI: For database migrations (optional)
git clone https://github.com/karthikbhandary2/bookings.git
cd bookings# Create database
createdb bookings
# Create user (optional)
psql -c "CREATE USER bookings_user WITH PASSWORD 'your_password';"
psql -c "GRANT ALL PRIVILEGES ON DATABASE bookings TO bookings_user;"Update the database connection string in cmd/web/main.go:
db, err := drivers.ConnectSQL("host=localhost port=5432 dbname=bookings user=your_user password=your_password")Or create a database.yml file from the example:
cp database.yml.example database.yml
# Edit database.yml with your database credentials# If you have Buffalo CLI installed
buffalo pop migrate
# Or execute the schema directly
psql -d bookings -f migrations/schema.sqlgo mod tidyUpdate configuration in cmd/web/main.go:
// Set to true for production
app.InProduction = false
// Update port if needed
const portNumber = ":8080"chmod +x run.sh
./run.shgo build -o bookings cmd/web/*.go
./bookings- Frontend: http://localhost:8080
- Admin Panel: http://localhost:8080/admin/dashboard (after login)
# Build and run application
./run.sh
# Update dependencies
./update.sh
# Test database connection
go run testdbconnection.go
# Run tests
go test ./...
# Build for production
go build -o bookings cmd/web/*.go# Using Buffalo CLI
buffalo pop generate migration create_new_table
# Manual migration files in migrations/ directory# Run seed files
psql -d bookings -f migrations/seed_rooms_table.postgres.up.sql
psql -d bookings -f migrations/seed_restrictions_table.postgres.up.sqlGET /- Homepage with hero carouselGET /about- About pageGET /contact- Contact pageGET /generals-quarters- General's Quarters room detailsGET /majors-suite- Major's Suite room detailsGET /search-availability- Room availability searchPOST /search-availability- Process availability searchPOST /search-availability-json- AJAX availability searchGET /choose-room/:id- Room selectionGET /make-reservation- Reservation formPOST /make-reservation- Process reservationGET /reservation-summary- Booking confirmation
GET /admin/dashboard- Admin dashboardGET /admin/reservations-new- New reservationsGET /admin/reservations-all- All reservationsGET /admin/reservations-calendar- Calendar viewGET /admin/reservations/:src/:id/show- Reservation detailsPOST /admin/reservations/:src/:id- Update reservationPOST /admin/process-reservation/:src/:id/:action- Process reservation actions
GET /user/login- Login pagePOST /user/login- Process loginPOST /user/logout- Logout
// User represents system users (admins)
type User struct {
ID int
FirstName string
LastName string
Email string
Password string
AccessLevel int
CreatedAt time.Time
UpdatedAt time.Time
}
// Room represents hotel rooms
type Room struct {
ID int
RoomName string
CreatedAt time.Time
UpdatedAt time.Time
}
// Reservation represents guest bookings
type Reservation struct {
ID int
FirstName string
LastName string
Email string
Phone string
StartDate time.Time
EndDate time.Time
RoomID int
CreatedAt time.Time
UpdatedAt time.Time
Room Room
Processed int
}
// RoomRestriction represents room availability restrictions
type RoomRestriction struct {
ID int
StartDate time.Time
EndDate time.Time
RoomID int
ReservationID int
RestrictionID int
CreatedAt time.Time
UpdatedAt time.Time
Room Room
Reservation Reservation
Restriction Restriction
}# Run all tests
go test ./...
# Run tests with coverage
go test -cover ./...
# Run specific package tests
go test ./internal/handlers -v
go test ./internal/forms -v
go test ./internal/render -v
# Run tests with race detection
go test -race ./...Configure email settings in cmd/web/send-mail.go:
// Update SMTP settings
m := mail.NewMSG()
m.SetServer("your-smtp-server.com")
m.SetAuthentication("username", "password")
m.SetPort(587)
m.SetEncryption(mail.EncryptionSTARTTLS)- Responsive Design: Bootstrap 5 responsive grid system
- Interactive Calendar: Date picker for reservation dates
- Form Validation: Real-time client-side validation
- Notifications: Toast notifications for user feedback
- Modal Dialogs: SweetAlert2 for confirmations
- Image Carousel: Hero image slideshow on homepage
- SweetAlert2: Beautiful alert dialogs
- Notie: Lightweight notifications
- Vanillajs-datepicker: Date selection widget
- Bootstrap 5: UI framework and components
- Dashboard: Overview of reservations and statistics
- Calendar View: Visual representation of bookings
- Reservation Management: CRUD operations for bookings
- User Authentication: Secure admin login system
- Responsive Tables: Mobile-friendly data tables
- CSRF Protection: NoSurf middleware for CSRF token validation
- Session Security: Secure session configuration with SCS
- Input Validation: Server-side form validation
- SQL Injection Protection: Parameterized database queries
- Authentication: Admin-only access to management features
- Secure Cookies: HTTPOnly and Secure cookie flags in production
For production deployment:
// In cmd/web/main.go
app.InProduction = true
// Update database connection for production
db, err := drivers.ConnectSQL("host=prod-db port=5432 dbname=bookings user=prod_user password=prod_pass sslmode=require")- Database: Set up production PostgreSQL instance
- Environment: Set
app.InProduction = true - SSL: Configure HTTPS and secure cookies
- Email: Configure production SMTP settings
- Logging: Set up proper log rotation
- Monitoring: Implement health checks and monitoring
- Backup: Set up database backup strategy
Create a Dockerfile:
FROM golang:1.23.4-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o bookings cmd/web/*.go
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/bookings .
COPY --from=builder /app/templates ./templates
COPY --from=builder /app/static ./static
COPY --from=builder /app/email-templates ./email-templates
EXPOSE 8080
CMD ["./bookings"]- users: System administrators
- rooms: Available room types
- reservations: Guest bookings
- restrictions: Restriction types (reservation, owner block)
- room_restrictions: Room availability restrictions
- Reservations belong to Rooms
- Room Restrictions link Rooms, Reservations, and Restrictions
- Users manage the system through admin interface
-
Database Connection Failed
# Check PostgreSQL status sudo systemctl status postgresql # Verify connection parameters in main.go # Check database exists: psql -l
-
Template Not Found
# Ensure templates directory exists and contains .tmpl files # Check template cache configuration in main.go
-
Static Files Not Loading
# Verify static directory structure # Check file permissions: chmod -R 644 static/
-
Port Already in Use
# Change port in main.go const portNumber = ":8081" # Or kill existing process sudo lsof -ti:8080 | xargs kill -9
-
Migration Errors
# Check database connection # Verify migration files syntax # Run migrations manually: psql -d bookings -f migrations/schema.sql
For support and questions:
- Check the existing documentation
- Review the code comments in handlers and models
- Test database connection with
testdbconnection.go - Examine log files in the
logs/directory
This project is part of a learning exercise for Go web development with hotel booking system implementation.
Happy Booking! π¨