Bookshelf API adalah sebuah layanan RESTful API yang dibangun menggunakan Node.js dan Hapi Framework. API ini menyediakan fungsionalitas dasar untuk mengelola data koleksi buku, seperti menambah, menampilkan, mengubah, dan menghapus buku. Proyek ini menggunakan in-memory array sebagai basis data, yang berarti semua data akan di-reset setiap kali server dihentikan.
Proyek ini dirancang untuk menunjukkan kemampuan dalam membangun backend API yang terstruktur dan memenuhi kriteria RESTful.
- Create: Menambahkan data buku baru ke dalam rak.
- Read:
- Menampilkan seluruh daftar buku dengan data ringkas (
id,name,publisher). - Mendukung query parameter untuk memfilter buku berdasarkan
name, statusreading, dan statusfinished. - Menampilkan informasi detail dari satu buku berdasarkan ID-nya.
- Menampilkan seluruh daftar buku dengan data ringkas (
- Update: Memperbarui data buku yang sudah ada berdasarkan ID.
- Delete: Menghapus data buku dari rak berdasarkan ID.
- Node.js: Lingkungan eksekusi JavaScript di sisi server.
- Hapi: Framework Node.js yang rich dan terkonfigurasi untuk membangun aplikasi dan layanan API.
- nanoid: Library untuk menghasilkan ID unik yang aman dan ringkas untuk setiap buku.
- nodemon: Utilitas untuk development yang secara otomatis me-restart server setiap ada perubahan pada kode.
- ESLint: Alat untuk menjaga konsistensi dan kualitas kode.
Untuk menjalankan proyek ini secara lokal, ikuti langkah-langkah di bawah ini:
-
Clone repositori ini:
git clone [https://github.com/NaulanDarmawan/Bookshelf_API.git](https://github.com/NaulanDarmawan/Bookshelf_API.git)
-
Masuk ke direktori proyek:
cd Bookshelf_API -
Install semua dependency yang dibutuhkan:
npm install
-
Jalankan server:
- Untuk mode development (dengan auto-reload saat ada perubahan kode):
npm run start-dev
- Untuk mode production:
npm run start
- Untuk mode development (dengan auto-reload saat ada perubahan kode):
-
Server akan berjalan pada
http://localhost:9000.
Berikut adalah daftar endpoint yang tersedia beserta detail penggunaannya.
Menyimpan objek buku baru ke dalam array books.
- Endpoint:
/books - Method:
POST - Body Request (
application/json):{ "name": "Buku A", "year": 2020, "author": "John Doe", "summary": "Lorem ipsum dolor sit amet", "publisher": "Dicoding Indonesia", "pageCount": 100, "readPage": 25, "reading": false } - Validasi:
- Properti
namewajib diisi. Jika tidak, respons akan400 Bad Requestdengan pesan "Gagal menambahkan buku. Mohon isi nama buku". - Nilai
readPagetidak boleh lebih besar daripageCount. Jika lebih besar, respons akan400 Bad Requestdengan pesan "Gagal menambahkan buku. readPage tidak boleh lebih besar dari pageCount".
- Properti
- Respon Sukses (
201 Created):{ "status": "success", "message": "Buku berhasil ditambahkan", "data": { "bookId": "a1b2c3d4e5f6g7h8" } } - Respon Gagal Lainnya (
500 Internal Server Error): Terjadi jika buku gagal dimasukkan ke array karena alasan yang tidak terduga.
Mengambil daftar buku. Mendukung penyaringan melalui query parameter.
- Endpoint:
/books - Method:
GET - Query Parameters (Opsional):
name(string): Tampilkan buku yang namanya mengandung string ini (pencarian case-insensitive).- Contoh:
GET /books?name=dicoding
- Contoh:
reading(number): Filter berdasarkan status dibaca.1untuktrue,0untukfalse.- Contoh:
GET /books?reading=1
- Contoh:
finished(number): Filter berdasarkan status selesai dibaca.1untuktrue,0untukfalse.- Contoh:
GET /books?finished=0
- Contoh:
- Respon Sukses (
200 OK):{ "status": "success", "data": { "books": [ { "id": "a1b2c3d4e5f6g7h8", "name": "Buku A", "publisher": "Dicoding Indonesia" }, { "id": "i9j0k1l2m3n4o5p6", "name": "Buku B", "publisher": "Penerbit Y" } ] } }
Mengambil informasi lengkap sebuah buku berdasarkan ID.
- Endpoint:
/books/{bookId} - Method:
GET - Respon Sukses (
200 OK):{ "status": "success", "data": { "book": { "id": "a1b2c3d4e5f6g7h8", "name": "Buku A", "year": 2020, "author": "John Doe", "summary": "Lorem ipsum dolor sit amet", "publisher": "Dicoding Indonesia", "pageCount": 100, "readPage": 25, "finished": false, "reading": false, "insertedAt": "2024-06-30T12:00:00.000Z", "updatedAt": "2024-06-30T12:00:00.000Z" } } } - Respon Gagal (
404 Not Found): Terjadi jikabookIdtidak ditemukan.{ "status": "fail", "message": "Buku tidak ditemukan" }
Memperbarui data buku yang sudah ada berdasarkan ID.
- Endpoint:
/books/{bookId} - Method:
PUT - Body Request (
application/json):{ "name": "Buku A (Edisi Revisi)", "year": 2021, "author": "John Doe", "summary": "Ringkasan yang sudah diperbarui.", "publisher": "Dicoding Indonesia", "pageCount": 120, "readPage": 120, "reading": false } - Validasi:
- Aturan validasi sama seperti pada endpoint
POST /books(nama wajib ada,readPagetidak boleh >pageCount).
- Aturan validasi sama seperti pada endpoint
- Respon Sukses (
200 OK):{ "status": "success", "message": "Buku berhasil diperbarui" } - Respon Gagal (
404 Not Found): Terjadi jikabookIdtidak ditemukan untuk diperbarui.{ "status": "fail", "message": "Gagal memperbarui buku. Id tidak ditemukan" }
Menghapus data buku berdasarkan ID.
- Endpoint:
/books/{bookId} - Method:
DELETE - Respon Sukses (
200 OK):{ "status": "success", "message": "Buku berhasil dihapus" } - Respon Gagal (
404 Not Found): Terjadi jikabookIdtidak ditemukan untuk dihapus.{ "status": "fail", "message": "Buku gagal dihapus. Id tidak ditemukan" }