A RESTful API for a forum application built with Node.js and Express, featuring authentication, thread management, and comment functionality.
- Runtime: Node.js (ESM / ES Modules)
- Framework: Express v5
- Database: PostgreSQL (
pg) - Authentication: JSON Web Token (
jsonwebtoken), Bcrypt (bcrypt) - ID Generator: Nanoid
- DI Container: instances-container
- Migration: node-pg-migrate
- Testing: Vitest, Supertest
- Linter: ESLint
- Dev Server: Nodemon
Project ini menggunakan Clean Architecture untuk memisahkan tanggung jawab setiap lapisan kode secara tegas, sehingga mudah diuji, dipelihara, dan dikembangkan secara independen.
┌─────────────────────────────────────┐
│ Frameworks & Drivers │ ← Express, PostgreSQL, JWT, Bcrypt
├─────────────────────────────────────┤
│ Interface Adapters │ ← HTTP Handlers, Repositories (impl)
├─────────────────────────────────────┤
│ Use Cases / Services │ ← Business logic aplikasi
├─────────────────────────────────────┤
│ Entities / Domain │ ← Model domain, business rules inti
└─────────────────────────────────────┘
| Layer | Lokasi | Tanggung Jawab |
|---|---|---|
| Entities / Domain | src/Domains/ |
Model bisnis inti dan validasi domain |
| Use Cases | src/*/use_case/ |
Orkestrasi alur bisnis aplikasi |
| Interface Adapters | src/*/handler/, src/*/repository/ |
Menghubungkan use case dengan framework |
| Frameworks & Drivers | src/Infrastructures/ |
Express server, koneksi database, library eksternal |
- Dependency Rule: Ketergantungan hanya boleh mengarah ke dalam — layer luar boleh bergantung pada layer dalam, tidak sebaliknya.
- Repository Pattern: Layer use case berkomunikasi dengan database melalui interface repository, bukan langsung ke PostgreSQL. Implementasinya ada di layer infrastructure.
- Dependency Injection: Seluruh dependensi di-inject melalui
instances-container, sehingga mudah di-mock saat testing. - Framework Independence: Business logic tidak bergantung pada Express maupun PostgreSQL secara langsung, sehingga bisa diganti tanpa mengubah use case.
HTTP Request
│
▼
Express Router
│
▼
Handler (Interface Adapter)
│ — memanggil —
▼
Use Case (Business Logic)
│ — melalui interface —
▼
Repository (Interface Adapter)
│ — implementasi —
▼
PostgreSQL (Infrastructure)
Pastikan kamu sudah menginstal:
- Node.js >= 18.x
- PostgreSQL >= 13.x
- npm >= 9.x
git clone https://github.com/username/forum-api.git
cd forum-apinpm installBuat file .env di root project:
# HTTP SERVER
HOST=localhost
PORT=3000
# POSTGRES
PGHOST=localhost
PGUSER=developer
PGDATABASE=forumapi
PGPASSWORD=supersecretpassword
PGPORT=5432
# POSTGRES TEST
PGHOST_TEST=localhost
PGUSER_TEST=developer
PGDATABASE_TEST=forumapi_test
PGPASSWORD_TEST=supersecretpassword
PGPORT_TEST=5432
# TOKENIZE
ACCESS_TOKEN_KEY=your_access_token_secret_key
REFRESH_TOKEN_KEY=your_refresh_token_secret_key
ACCCESS_TOKEN_AGE=3000Buat file .test.env di root project:
# POSTGRES TEST
PGHOST=localhost
PGUSER=developer
PGDATABASE=forumapi_test
PGPASSWORD=supersecretpassword
PGPORT=5432
# TOKENIZE
ACCESS_TOKEN_KEY=your_access_token_secret_key
REFRESH_TOKEN_KEY=your_refresh_token_secret_key
ACCCESS_TOKEN_AGE=3000
⚠️ Jangan gunakan nilai secret key dari contoh di atas untuk production! Generate key acak yang kuat, misalnya dengan perintah:node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
Masuk ke PostgreSQL dan buat database untuk development dan testing:
CREATE DATABASE forumapi;
CREATE DATABASE forumapi_test;Pastikan user developer sudah memiliki akses ke kedua database tersebut.
npm run migrate upnpm run migrate:test upnpm run start:devnpm startServer akan berjalan di http://localhost:3000 (sesuai konfigurasi .env).
npm testnpm run test:watchnpm run test:coveragePeriksa kualitas kode dengan ESLint:
npm run lint| Script | Deskripsi |
|---|---|
npm start |
Menjalankan server production |
npm run start:dev |
Menjalankan server development dengan nodemon |
npm test |
Menjalankan semua unit/integration test |
npm run test:watch |
Menjalankan test dalam watch mode |
npm run test:coverage |
Menjalankan test dengan laporan coverage |
npm run migrate up |
Menjalankan migrasi database development |
npm run migrate:test up |
Menjalankan migrasi database testing |
npm run lint |
Menjalankan ESLint untuk seluruh codebase |
forum-api/
├── src/
│ ├── app.js # Entry point aplikasi
│ ├── ... # Source code lainnya
├── migrations/ # File migrasi database
├── tests/ # File testing
├── .env # Environment variable (development)
├── .test.env # Environment variable (testing)
├── package.json
└── README.md
ISC