Skip to content

About

Full-stack reservation system built with Next.js and Express.js. Features RESTful APIs for user management and WebSockets for live availability updates, ensuring a stable, high-performance, and responsive booking experience

Resources

Stars

1 star

Watchers

1 watching

Forks

Repository files navigation

πŸ€ Sport Center Reservation API

Node.js Version TypeScript Prisma Express.js Socket.io License

🏒 Backend API untuk sistem reservasi fasilitas olahraga modern

πŸ“Š Arsitektur Cloud

Sistem ini didesain untuk dijalankan di infrastruktur cloud Azure dengan mempertimbangkan high availability, keamanan, dan skalabilitas.

Arsitektur Cloud

☁️ Komponen Utama

  • Frontend Tier (High Availability)

    • Multiple VM untuk redundansi dan load balancing
    • NGINX untuk hosting UI dan proxy ke API
  • Backend Tier (High Availability)

    • Multiple VM untuk redundansi dan load balancing
    • Express.js API dengan Node.js
    • Clustering dengan PM2 untuk memanfaatkan multi-core
  • Komponen Express Application

    • Routes - Mengelola endpoint API
    • Controllers - Logika bisnis untuk autentikasi, pengguna, admin, dan owner
    • Middlewares - Validasi, autentikasi, dan error handling
    • Repositories - Akses data dengan Prisma ORM
    • Socket Handlers - Manajemen koneksi real-time
    • Zod Schemas - Validasi request
    • Utils - Helper functions
  • Data Storage

    • Azure MySQL Database - Menyimpan data aplikasi
    • Azure Blob Storage - Menyimpan file dan gambar
    • NodeCache - Caching di memori aplikasi
  • Keamanan

    • Application Gateway
    • Network Security Groups
    • Azure Firewall
    • Key Vault untuk credential management
  • Monitoring

    • Azure Monitor
    • Application Insights
  • DevOps Services

    • CI/CD Pipeline
    • Source Repositories
    • Project Management

πŸ”„ High Availability & Scaling

  • Load balancer untuk mendistribusikan traffic
  • Multiple VM instance untuk redundansi
  • Auto-scaling berdasarkan CPU usage
  • Clustering dengan PM2 di setiap VM

πŸ”’ Keamanan

  • Virtual Network (VCN) untuk isolasi
  • Network Security Groups untuk kontrol akses
  • Key Vault untuk penyimpanan kredensial
  • HTTPS enforcement di semua endpoint publik

🌟 Fitur Utama

  • πŸ”’ Autentikasi & Otorisasi

    • JWT-based authentication
    • Role-based access control (Super Admin/Branch Admin/User)
    • Secure password hashing dengan bcrypt
  • πŸ“… Manajemen Reservasi

    • Real-time booking status via Socket.io
    • Pencarian & filter fasilitas olahraga
    • Sistem pembayaran terintegrasi dengan Midtrans
    • Review dan rating fasilitas
  • πŸ”” Notifikasi

    • Real-time updates via Socket.io
    • Activity log tracking
    • Status pembayaran dan booking
  • πŸ“Š Manajemen Cabang

    • Multiple branch management
    • Analisis pendapatan per cabang
    • Manajemen lapangan dan tipe lapangan
    • Sistem promosi dan diskon

πŸ›  Tech Stack

  • Runtime: Node.js v22.8.0
  • Language: TypeScript 5.0
  • Framework: Express.js
  • Database: MySQL + Prisma ORM
  • Real-time: Socket.io
  • Payment Gateway: Midtrans
  • File Storage: Cloudinary
  • Security: Helmet, CORS, Rate Limiting
  • Logging: Winston
  • Deployment: PM2 dengan clustering

πŸš€ Quick Start

Prerequisites

# Versi minimum yang dibutuhkan
Node.js >= v22.8.0
npm >= v10.8.2
MySQL >= 8.0

Instalasi

  1. Clone & Install Dependencies

    git clone <repository-url>
    cd backend
    npm install
  2. Setup Environment

    # Copy .env.example
    cp .env.example .env

    Edit .env dengan konfigurasi yang sesuai:

    # Database
    DATABASE_URL="mysql://user:password@localhost:3306/sport_center"
    
    # JWT
    JWT_ACCESS_TOKEN_SECRET=your_access_token_secret
    JWT_REFRESH_TOKEN_SECRET=your_refresh_token_secret
    
    # Midtrans
    MIDTRANS_SERVER_KEY=your_server_key
    MIDTRANS_CLIENT_KEY=your_client_key
    
    # Cloudinary
    CLOUDINARY_CLOUD_NAME=your_cloud_name
    CLOUDINARY_API_KEY=your_api_key
    CLOUDINARY_API_SECRET=your_api_secret
  3. Setup Database & Prisma

    # Generate Prisma Client
    npx prisma generate
    
    # Run migrations
    npx prisma migrate dev
    
    # Seed database
    npx prisma db seed
  4. Start Development Server

    npm run dev

    Server berjalan di http://localhost:3000

πŸš€ Deployment dengan PM2

  1. Build aplikasi:

    npm run build
  2. Jalankan dengan PM2:

    npm run start:prod
  3. Perintah pengelolaan:

    # Menghentikan aplikasi
    npm run stop:prod
    
    # Restart aplikasi
    npm run restart:prod
    
    # Monitoring
    npm run monitor:prod
    
    # Membersihkan log
    pm2 flush
    
    # Reset PM2
    pm2 reset all

πŸ”„ Panduan Menjalankan Aplikasi

πŸ’» Mode Development

Mode development dioptimalkan untuk kecepatan pengembangan dan debugging:

  1. Jalankan dalam mode development:

    npm run dev
  2. Fitur mode development:

    • Hot-reload dengan nodemon
    • Debugging lebih detail
    • Tidak ada kompresi response untuk memudahkan debugging
    • HTTPS enforcement dinonaktifkan
    • Automatic Prisma Client generation
  3. Debugging:

    # Jalankan dengan inspeksi node
    node --inspect src/app.ts
    
    # Atau dengan lebih banyak log
    DEBUG=* npm run dev

🏭 Mode Production

Mode production dioptimalkan untuk performa dan keamanan maksimal:

  1. Build aplikasi:

    npm run build
  2. Jalankan dalam cluster mode dengan PM2:

    npm run start:prod
  3. Fitur mode production:

    • Clustering untuk pemanfaatan multi-core
    • Kompresi response untuk kecepatan loading
    • Rate limiting untuk keamanan
    • Optimasi memori dengan garbage collection otomatis
    • HTTPS enforcement diaktifkan
    • Caching API selama 5 menit
  4. Monitoring dan pengelolaan:

    # Monitoring real-time
    npm run monitor:prod
    
    # Lihat log aplikasi
    pm2 logs
    
    # Tampilkan status instansi
    pm2 status
  5. Skalabilitas:

    • Aplikasi akan otomatis menyesuaikan jumlah instansi berdasarkan beban CPU
    • Port akan dialokasikan secara dinamis untuk setiap instansi
    • Batas memori dikontrol untuk mencegah overload server

πŸ“Š Perbandingan Mode

Fitur Development Production
Hot-reload βœ… ❌
Debugging Detail tinggi Minimal
Kompresi ❌ βœ…
Clustering ❌ βœ… (Auto-scaling)
Caching ❌ βœ… (5 menit)
HTTPS Opsional Wajib
Memory Limit Tidak dibatasi 200MB/instance
GC Manual ❌ βœ… (2 menit)
Rate Limiting Longgar Ketat (100/15min)

πŸ’ͺ Optimasi Performa

Aplikasi telah dioptimalkan untuk performa maksimal dengan:

🧠 Manajemen Memori

  • Batas memori: Maksimal 200MB per instance
  • Garbage Collection: Otomatis setiap 2 menit
  • V8 Engine: --max-old-space-size=200, --max-semi-space-size=64
  • Optimasi Flag: --optimize-for-size, --gc-interval=50

πŸ”„ Clustering & Scaling

  • Mode Cluster PM2: Pemanfaatan multi-core CPU
  • Auto-scaling: Berdasarkan beban CPU
  • Instance: Minimum 1, maksimum 2 untuk penggunaan memori optimal

🌐 Network Optimization

  • Kompresi: Dengan middleware compression
  • Caching: API responses selama 5 menit
  • WebSocket: Payload maksimum 50KB, optimasi ping interval

πŸ”’ Keamanan & Pembatasan

  • Rate Limiting: 100 request per 15 menit
  • Headers Keamanan: Dengan helmet
  • HTTPS Enforcement: Otomatis di production

⚑ Runtime Performance

  • Timeout: Listen timeout 5000ms, kill timeout 2000ms
  • Restart: Eksponensial backoff 50ms
  • Tracing: --trace-warnings, --trace-uncaught, --trace-sync-io

πŸ“ Struktur Project

backend/
β”œβ”€β”€ prisma/                 # Database schema & migrations
β”‚   β”œβ”€β”€ migrations/        # Database migrations
β”‚   β”œβ”€β”€ schema.prisma      # Prisma schema
β”‚   └── seeds/            # Database seeders
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ config/           # App configuration
β”‚   β”œβ”€β”€ controllers/      # Request handlers
β”‚   β”‚   β”œβ”€β”€ admin/       # Admin controllers
β”‚   β”‚   β”œβ”€β”€ owner/       # Owner controllers
β”‚   β”‚   └── user/        # User controllers
β”‚   β”œβ”€β”€ middlewares/      # Express middlewares
β”‚   β”œβ”€β”€ routes/           # API routes
β”‚   β”œβ”€β”€ socket-handlers/  # Socket.io handlers
β”‚   β”œβ”€β”€ utils/            # Helper functions
β”‚   β”œβ”€β”€ zod-schemas/      # Request validation
β”‚   └── app.ts           # App entry point
β”œβ”€β”€ .env                  # Environment variables
β”œβ”€β”€ ecosystem.config.js   # Konfigurasi PM2
└── package.json         # Dependencies

❓ Troubleshooting & FAQ

Masalah Umum

  1. πŸ› Aplikasi tidak dapat dimulai

    • Periksa port 3000 sudah digunakan atau tidak
    • Periksa status database MySQL
    • Cek file log di logs/err.log
  2. πŸ“ˆ Memori tinggi

    • Jalankan npm run monitor:prod untuk memantau penggunaan
    • Turunkan nilai max_instances jika diperlukan
    • Cek bottleneck dengan monitoring
  3. 🐒 Performa lambat

    • Optimasi query database
    • Kurangi jumlah instance pada server dengan CPU terbatas
    • Cek logs untuk blocking operations

πŸ“š API Documentation

Base URL

http://localhost:3000/api/v1

Endpoints

πŸ” Auth
  • POST /auth/register - Register user baru
  • POST /auth/login - Login user
  • POST /auth/refresh - Refresh access token
  • POST /auth/logout - Logout user
🏒 Branch
  • GET /branches - List semua cabang
  • GET /branches/:id - Detail cabang
  • POST /branches - Tambah cabang baru (Super Admin)
  • PUT /branches/:id - Update cabang
  • DELETE /branches/:id - Hapus cabang
⚽ Field
  • GET /fields - List semua lapangan
  • GET /fields/:id - Detail lapangan
  • POST /fields - Tambah lapangan baru (Admin)
  • PUT /fields/:id - Update lapangan
  • DELETE /fields/:id - Hapus lapangan
πŸ“… Booking
  • GET /bookings - List reservasi user
  • POST /bookings - Buat reservasi baru
  • GET /bookings/:id - Detail reservasi
  • DELETE /bookings/:id - Batalkan reservasi
πŸ’° Payment
  • GET /payments - List pembayaran user
  • GET /payments/:id - Detail pembayaran
  • POST /payments/notification - Webhook Midtrans

πŸ”§ Scripts

{
  "dev": "npx prisma generate && nodemon src/app.ts",
  "build": "tsc",
  "start": "node dist/app.js",
  "lint": "eslint . --ext .ts --fix",
  "start:prod": "pm2 start ecosystem.config.js --node-args='--expose-gc'",
  "stop:prod": "pm2 stop ecosystem.config.js",
  "restart:prod": "pm2 restart ecosystem.config.js",
  "monitor:prod": "pm2 monit"
}

πŸ“ License

Distributed under the MIT License. See LICENSE for more information.


Made with ❀️ by PBL Team

Konfigurasi Environment

Aplikasi ini menggunakan sistem konfigurasi berbasis tipe dengan nilai default yang sudah disediakan, sehingga tidak memerlukan file .env secara mayoritas. Berikut cara konfigurasi:

Cara 1: Tanpa File .env (Rekomendasi untuk Pengembangan)

Aplikasi akan menggunakan nilai default yang aman untuk pengembangan. Anda dapat langsung menjalankan aplikasi tanpa membuat file .env apapun. Sistem akan menampilkan informasi nilai default yang digunakan.

# Cukup jalankan aplikasi
npm run dev

Cara 2: Dengan File Environment (Untuk Production)

Untuk lingkungan production atau jika Anda perlu mengubah nilai default:

  1. Salin file .env.type sebagai referensi:

    # Untuk development
    cp .env.type .env.development
    
    # Untuk production
    cp .env.type .env.production
  2. Edit file tersebut dengan konfigurasi yang sesuai.

  3. Aplikasi akan mencari file konfigurasi dengan prioritas:

    • .env.{NODE_ENV} (misalnya .env.development atau .env.production)
    • .env (sebagai fallback)
    • Nilai default yang dikodekan dalam aplikasi

Cara Kerja

Semua variabel lingkungan didefinisikan sebagai tipe di src/types/env.ts dan memiliki nilai default di dalam kode. Sistem akan:

  1. Mencoba memuat file lingkungan yang sesuai
  2. Jika tidak ditemukan, menggunakan nilai default
  3. Memberikan peringatan untuk nilai-nilai kritis yang menggunakan default di lingkungan production

Catatan Keamanan: Di lingkungan production, pastikan Anda mengatur variabel lingkungan kritis seperti JWT_SECRET, kredensial database, dan kunci API. Meskipun ada nilai default, nilai tersebut tidak boleh digunakan di production.

About

Full-stack reservation system built with Next.js and Express.js. Features RESTful APIs for user management and WebSockets for live availability updates, ensuring a stable, high-performance, and responsive booking experience

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages