Ini adalah layanan backend untuk proyek Bebasblog, sebuah API RESTful yang dibangun untuk mendukung platform blogging atau media sosial. Layanan ini menyediakan autentikasi pengguna, manajemen profil, dan penanganan postingan dengan fitur seperti unggahan gambar (via Cloudinary), like, dan komentar. Proyek ini dikembangkan menggunakan TypeScript, Express, dan Mongoose, dengan dukungan untuk autentikasi Google OAuth.
π₯ Postman Collection: Dokumentasi API Bebasblog
- Fitur Utama Backend
- Teknologi yang Digunakan
- Konsep yang Diterapkan
- Struktur Proyek
- Daftar Endpoint API
- Setup Variabel Environment
- Instalasi & Menjalankan
- Manajemen Pengguna & Autentikasi:
- Registrasi pengguna baru dengan validasi dasar.
- login manual dengan perbandingan password yang di-hash menggunakan bcryptjs.
- Autentikasi pihak ketiga menggunakan Google OAuth 2.0 via Passport.js.
- Pembuatan dan verifikasi JSON Web Token (JWT) untuk mengamankan endpoint.
- Memperbarui profil pengguna (foto profil, username, email, password, bio).
- Manajemen Postingan:
- Membuat postingan dengan gambar yang dapat diunggah via Cloudinary.
- Mengelola postingan pengguna (CRUD: Create, Read, Update, Delete).
- Fitur interaksi seperti like dan komentar pada postingan.
- Penanganan File:
- Endpoint untuk menerima unggahan gambar postingan.
- Middleware (
multer
) untuk memvalidasi dan memproses file. - Integrasi dengan Cloudinary untuk menyimpan gambar di cloud.
- Runtime: Node.js
- Language: TypeScript
- Framework: Express.js
- Database: MongoDB dengan Mongoose sebagai ODM (Object Data Modeling).
- Autentikasi:
jsonwebtoken
untuk JWT.bcryptjs
untuk hashing password.passport
&passport-google-oauth20
untuk Google OAuth.
- Penanganan File:
multer
untuk menanganimultipart/form-data
.multer-storage-cloudinary
untuk integrasi Cloudinary.
- Environment Variables:
dotenv
Proyek ini dibangun di atas beberapa konsep dan pola arsitektur perangkat lunak yang penting:
- RESTful API Design: Mendesain endpoint berdasarkan sumber daya seperti
users
danposts
. - Pola MVC (Model-View-Controller): Diterapkan dengan memisahkan:
- Model: Skema Mongoose di dalam folder
/models
. - View: (Dalam konteks API) Didefinisikan oleh Rute di dalam folder
/routes
. - Controller: Logika bisnis yang menjembatani model dan rute, di dalam folder
/controllers
.
- Model: Skema Mongoose di dalam folder
- Middleware: Penggunaan middleware untuk autentikasi, validasi file, dan fungsi lainnya.
- Keamanan:
- Password Hashing: Menyimpan password pengguna dengan aman.
- Stateless Authentication: Menggunakan JWT untuk otorisasi permintaan.
/bebasblog-backend
βββ src/ # File utama server Express
βββ /config # File konfigurasi (database, passport, cloudinary)
β βββ env.js
β βββ db.js
β βββ passport.js
βββ /controllers # Logika bisnis untuk setiap rute API
β βββ authController.js
β βββ userController.js
β βββ postController.js
βββ /middleware # Middleware kustom (auth, upload)
β βββ authMiddleware.js
β βββ uploadMiddleware.js
βββ /models # Skema database Mongoose
β βββ UserModel.js
β βββ PostModel.js
β βββ CommentModel.js
βββ /routes # Definisi rute-rute API
β βββ authRoutes.js
β βββ userRoutes.js
β βββ postRoutes.js
βββ index.ts
βββ .env # (Contoh) File variabel environment (tidak di-commit)
POST /api/auth/register
- Mendaftarkan pengguna baru.POST /api/auth/login
- Login pengguna.
GET /api/users/me
- Mendapatkan profil pengguna saat ini (Terproteksi).PUT /api/users/me
- Memperbarui profil pengguna saat ini (Terproteksi).PUT /api/users/me
- Memperbarui gambar profil pengguna (Terproteksi).PUT /api/users/me/password
- Memperbarui kata sandi pengguna saat ini (Terproteksi).GET /api/users/:username/posts
- Menampilkan seluruh posts pengguna.GET /api/users/:username
- Menampilkan Nama, Bio, jumlah like dan jumlah Posts pengguna.
POST /api/posts
- Membuat postingan baru (Terproteksi).GET /api/posts
- Mendapatkan semua postingan.GET /api/posts/:id
- Mendapatkan postingan spesifik berdasarkan ID.PUT /api/posts/:id
- Memperbarui postingan spesifik (Terproteksi).DEL /api/posts/:id
- Menghapus postingan spesifik (Terproteksi).POST /api/posts/:id/like
- Menyukai postingan spesifik (Terproteksi).DEL /api/posts/:id/like
- Membatalkan like pada postingan spesifik (Terproteksi).POST /api/posts/:id/comments
- Menambahkan komentar pada postingan spesifik (Terproteksi).GET /api/posts/:id/comments
- Mendapatkan semua komentar untuk postingan spesifik.
Buat file .env
di direktori root backend dan isi dengan variabel berikut:
MONGO_URI=
JWT_SECRET=
PORT=5000
FRONTEND_URL=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
- Dari direktori root proyek, masuk ke folder backend:
cd bebasblog-backend
- Install semua dependensi:
npm install
- Pastikan file
.env
sudah diisi dengan benar. - Jalankan server development:
npm run dev
- Server akan berjalan di
http://localhost:5000
(atau port yang didefinisikan di.env
).