Bab 9: Studi Kasus dan Proyek Akhir
9.1. Studi Kasus: Sistem Login dengan Autentikasi JWT
Tujuan: Membangun sistem login yang aman menggunakan JSON Web Token (JWT).
Langkah-Langkah
1. Membuat Endpoint Register
-
Input:
email
,password
. -
Proses: Hash password menggunakan
bcrypt
. -
Output: Data pengguna tersimpan di database.
const bcrypt = require("bcrypt"); app.post("/register", async (req, res) => { const { email, password } = req.body; const hashedPassword = await bcrypt.hash(password, 10); await db.users.insert({ email, password: hashedPassword }); res.status(201).send("User registered"); });
2. Membuat Endpoint Login
-
Input:
email
,password
. -
Proses: Verifikasi email dan password. Jika valid, generate JWT.
-
Output: JWT untuk autentikasi.
const jwt = require("jsonwebtoken"); app.post("/login", async (req, res) => { const { email, password } = req.body; const user = await db.users.findOne({ email }); if (user && (await bcrypt.compare(password, user.password))) { const token = jwt.sign({ id: user.id }, "secretKey", { expiresIn: "1h" }); res.json({ token }); } else { res.status(401).send("Invalid credentials"); } });
3. Middleware untuk Validasi JWT
-
Fungsi: Melindungi endpoint agar hanya dapat diakses oleh pengguna yang sudah login.
const authenticate = (req, res, next) => { const token = req.headers.authorization?.split(" ")[1]; if (!token) return res.status(401).send("Access denied"); try { const decoded = jwt.verify(token, "secretKey"); req.user = decoded; next(); } catch { res.status(403).send("Invalid token"); } };
4. Melindungi Endpoint
app.get("/profile", authenticate, (req, res) => { res.send(`Hello user ${req.user.id}`); });
9.2. Studi Kasus: REST API untuk E-Commerce
Tujuan: Membuat REST API untuk manajemen produk dan pesanan.
Fitur Utama
- CRUD Produk
-
Endpoint untuk menambah, membaca, mengupdate, dan menghapus produk.
Contoh: Tambah Produkapp.post("/products", authenticate, async (req, res) => { const { name, price, stock } = req.body; const product = await db.products.insert({ name, price, stock }); res.status(201).json(product); });
- Manajemen Pesanan
-
Endpoint untuk membuat pesanan, melihat riwayat pesanan.
Contoh: Buat Pesananapp.post("/orders", authenticate, async (req, res) => { const { productId, quantity } = req.body; const order = await db.orders.insert({ userId: req.user.id, productId, quantity, }); res.status(201).json(order); });
- Filter dan Pagination
-
Contoh: Menampilkan produk dengan filter kategori dan harga.
app.get("/products", async (req, res) => { const { category, minPrice, maxPrice, page = 1, limit = 10 } = req.query; const products = await db.products .find({ category, price: { $gte: minPrice, $lte: maxPrice }, }) .skip((page - 1) * limit) .limit(limit); res.json(products); });
9.3. Proyek Akhir: Backend untuk Aplikasi HR
Tujuan: Mengembangkan backend untuk aplikasi HR yang mencakup modul: Recruitment, Training, dan Performance Management.
Fitur Utama
1. Recruitment
-
CRUD untuk Lowongan Kerja
app.post("/jobs", authenticate, async (req, res) => { const { title, description, requirements } = req.body; const job = await db.jobs.insert({ title, description, requirements }); res.status(201).json(job); });
-
Manajemen Lamaran Kerja
- Menyimpan data pelamar dan status lamaran.
2. Training
- Menyimpan data pelamar dan status lamaran.
-
CRUD untuk Program Pelatihan
- Input data seperti nama program, deskripsi, dan tanggal.
-
Pendaftaran Peserta Pelatihan
app.post("/trainings/:id/register", authenticate, async (req, res) => { const { userId } = req.body; await db.trainingParticipants.insert({ trainingId: req.params.id, userId }); res.status(201).send("User registered for training"); });
3. Performance Management
-
Evaluasi Kinerja
- Input dan laporan evaluasi kinerja karyawan.
4. Autentikasi Role-Based Access Control (RBAC)
- Input dan laporan evaluasi kinerja karyawan.
-
Admin dapat mengelola data karyawan, HR dapat melihat laporan, karyawan dapat melihat data pelatihan.
const authorize = roles => (req, res, next) => { if (!roles.includes(req.user.role)) { return res.status(403).send("Access denied"); } next(); }; app.post("/jobs", authenticate, authorize(["admin"]), async (req, res) => { // Logic khusus admin });
Integrasi
-
Database: PostgreSQL untuk data relasional seperti karyawan dan lowongan.
-
ORM: Sequelize untuk interaksi database.
-
Deployment: Gunakan Docker dan deploy ke AWS atau DigitalOcean.
Kesimpulan:
Bab ini memberikan studi kasus praktis dan proyek nyata yang mengintegrasikan berbagai aspek backend development. Proyek akhir bertujuan untuk mengaplikasikan semua konsep yang telah dipelajari, dari autentikasi hingga pengelolaan database dan infrastruktur.