Reservasi parkir membutuhkan pengelolaan lokasi, slot kendaraan, dan waktu pemesanan yang saling terhubung. Satu slot dapat digunakan pada beberapa periode, sehingga ketersediaannya perlu ditentukan berdasarkan jadwal reservasi.
Kebutuhan tersebut menjadi studi kasus dalam Online Parking Reservation System, final project peserta Bootcamp NodeJS Backend. Melalui proyek ini, peserta menyusun komponen backend untuk autentikasi, pengelolaan lokasi dan slot parkir, pencarian ketersediaan, serta pencatatan booking.
Sebagai penyelenggara, kami melihat proyek ini sebagai latihan menerjemahkan aturan layanan menjadi struktur database dan logika API, terutama ketika prosesnya melibatkan waktu, kepemilikan data, dan potensi pemesanan yang bertabrakan.
Studi Kasus: Reservasi Slot Parkir Berdasarkan Waktu
Proyek menggunakan skenario pemesanan slot parkir untuk mobil dan sepeda motor. Setiap lokasi memiliki alamat, jam operasional, tarif per jam, dan status aktif. Slot parkir terhubung dengan lokasi serta memiliki nomor, tipe kendaraan, dan statusnya sendiri.
Pengguna memberikan lokasi, waktu mulai, dan waktu selesai untuk mencari slot yang tersedia. Logika pencarian mengecualikan slot yang memiliki booking berstatus PENDING atau CONFIRMED dengan waktu yang bertumpang tindih.
Pendekatan ini memberikan konteks penting: ketersediaan slot bergantung pada periode yang diminta. Slot yang sudah dipesan pada pagi hari masih dapat tersedia untuk periode lain yang tidak berbenturan.
Apa yang Dikerjakan Peserta?
Peserta menyusun kode untuk beberapa kebutuhan utama:
- Registrasi dan login: memeriksa data wajib, mendeteksi email yang sudah terdaftar, melakukan hashing kata sandi, dan menerbitkan token.
- Pengelolaan lokasi parkir: menampilkan, menambahkan, dan memperbarui informasi lokasi beserta tarifnya.
- Pengelolaan slot: mencatat slot berdasarkan lokasi, memperbarui datanya, serta mencari ketersediaan berdasarkan waktu dan tipe kendaraan.
- Pembuatan booking: memvalidasi jadwal, memeriksa konflik, menghitung biaya, dan menghasilkan kode reservasi.
- Riwayat dan pembatalan: mengambil booking milik pengguna serta memeriksa ketentuan pembatalan.
Kode juga memuat fungsi untuk mengambil seluruh booking sebagai kebutuhan pengelolaan. Struktur proyek menggunakan folder konfigurasi, middleware, routes, controllers, dan utilitas untuk membagi tanggung jawab aplikasi.
Teknologi dan Tools yang Digunakan
Node.js digunakan untuk menjalankan JavaScript di sisi server. Express.js menangani routing, middleware, dan pemrosesan request.
MySQL menyimpan data pengguna, lokasi parkir, slot, dan booking. Akses database menggunakan mysql2, termasuk connection pool dan transaksi. Query berparameter digunakan untuk memasukkan nilai dari permintaan ke operasi database.
Untuk autentikasi, peserta menggunakan bcryptjs dalam hashing dan pemeriksaan kata sandi, serta jsonwebtoken untuk pengelolaan JWT. Middleware peran disiapkan untuk memeriksa apakah pengguna memiliki peran yang diizinkan.
dotenv digunakan untuk konfigurasi lingkungan, cors untuk pengaturan akses lintas origin, dan nodemon tercantum sebagai dependensi pengembangan.
Logika Booking dan Perhitungan Biaya
Pada fungsi pembuatan booking, peserta menerapkan pemeriksaan field wajib, validitas tanggal, urutan waktu, dan larangan memilih waktu mulai yang sudah lewat.
Kode kemudian memeriksa keberadaan slot, status aktifnya, serta reservasi lain yang berbenturan. Jika ditemukan konflik, fungsi menyiapkan respons penolakan dengan status HTTP 409.
Biaya dihitung berdasarkan selisih waktu mulai dan selesai. Durasi dibulatkan ke atas dalam satuan jam, kemudian dikalikan tarif lokasi. Dengan aturan tersebut, reservasi selama satu jam tiga puluh menit dihitung sebagai dua jam.
Kode booking memiliki batasan unik pada database. Implementasi juga memuat percobaan pembuatan kode kembali ketika terjadi duplikasi.
Insight: Transaksi dan Kepemilikan Data
Pembuatan booking melibatkan transaksi database dan FOR UPDATE untuk mengunci data yang diperiksa. Mekanisme ini ditujukan untuk mengoordinasikan permintaan yang mencoba memesan slot yang sama secara bersamaan.
Kasus tersebut memperkenalkan peserta pada persoalan konkurensi: hasil pencarian ketersediaan dapat berubah sebelum reservasi disimpan. Karena itu, pemeriksaan konflik kembali dilakukan dalam proses pembuatan booking.
Aspek lain yang terlihat adalah pembatasan berdasarkan kepemilikan. Fungsi detail dan pembatalan booking mencocokkan ID reservasi dengan ID pengguna. Pola ini menghubungkan identitas pengguna dengan data yang boleh diakses.
Pembatalan juga mengikuti aturan bisnis. Kode menolak pembatalan untuk booking yang sudah dibatalkan, selesai, atau telah memasuki waktu mulai.
Batas Implementasi yang Masih Perlu Diselesaikan
Pada versi kode yang tersedia, terdapat ketidaksesuaian antara isi file booking dan pemasangannya di aplikasi. File bookingRoutes.js berisi fungsi controller dan mengekspor objek, sementara aplikasi memasangnya sebagai router Express. File bookingController.js justru berisi konfigurasi router slot parkir.
Bagian ini perlu dirapikan sebelum alur booking dapat digunakan melalui endpoint sebagaimana dimaksud. Karena itu, showcase ini menggambarkan komponen dan logika yang telah ditulis, tanpa menyatakan seluruh API sudah berjalan atau lolos pengujian integrasi.
Manfaat Pembelajaran
Melalui proyek ini, peserta berlatih merancang relasi database, memvalidasi rentang waktu, menghitung biaya, mengatur autentikasi, dan membatasi akses berdasarkan kepemilikan data.
Bagi kami sebagai penyelenggara Bootcamp NodeJS Backend, studi kasus ini menyediakan bahan pembelajaran yang konkret tentang hubungan antara aturan bisnis dan implementasi teknis. Penyelesaian berikutnya mencakup perapian routing serta pengujian alur reservasi, konflik jadwal, dan pembatalan agar komponen yang telah disusun dapat bekerja bersama.