Panduan alur coding — Portal Berita (fullstack)

Memahami halaman publik + dashboard author/admin + backend API: alur sistem, alur coding, dan alur folder/file. Selaras dengan kode aktual proyek dan PERENCANAAN.md.

0 Gambaran project (tiga folder utama)

NEWS PKL/                 ← folder project (buka di VS Code / Cursor)
├── database/               ← schema.sql + seed.sql (PostgreSQL)
├── backend/                ← API Express + pg     → http://localhost:5000
└── frontend/               ← React + Vite         → http://localhost:5173
Yang dijalankanTerminalPerintahURL
DatabaseImport schema.sql + seed.sql ke PostgreSQL
API1cd backend lalu npm run dev:5000
Web2cd frontend lalu npm run dev:5173

Jalankan kedua terminal setelah database siap — web butuh API sudah hidup.

Penting: halaman React tidak mengakses PostgreSQL langsung. Jika backend mati, akan muncul Failed to fetch atau data kosong.

1 Frontend ↔ Backend (baca ini dulu)

1.1 Dua aplikasi terpisah

LapisanTeknologiTugas
FrontendReact (Vite) + BootstrapTampilan halaman, form, tabel, navigasi
BackendExpress + PostgreSQL (pg)Simpan/baca data, cek login JWT, kirim JSON

Browser hanya menampilkan React. React memanggil API lewat apiFetch di frontend/src/services/api.js ke http://localhost:5000/api/....

1.2 Login — dari tombol sampai dashboard

[Buka http://localhost:5173/login]
        │
        ▼
Login.jsx  →  authService.login(email, password)
        │         POST http://localhost:5000/api/auth/login
        ▼
authController.login  →  bcrypt.compare  →  JWT + { id, nama, email, role }
        │
        ▼
setAuth(token, user)  →  localStorage "token" + "user"
        │
        ▼
Navigate: role === "admin"  → /dashboard/admin
          role === "author" → /dashboard/author
        │
        ▼
ProtectedRoute cek getUser().role  →  AdminLayout / AuthorLayout

1.3 Contoh: author menulis berita

Di browser (frontend)Di server (backend)
FormBerita.jsx — form + upload gambarPOST /api/berita (FormData)
BeritaSaya.jsx — tabel berita sayaGET /api/berita/mine
Edit → form terisi data lamaGET /api/berita/:id lalu PUT /api/berita/:id
Hapus + konfirmasiDELETE /api/berita/:id

Request yang butuh login memakai header (otomatis di apiFetch):

Authorization: Bearer <token dari localStorage>

1.4 Peta halaman ↔ API utama

AreaHalaman (contoh)Service / API
PublikHome.jsx, ListBerita.jsx, DetailBerita.jsx, Kategori.jsxberitaService, infoWebService.getInfoWeb
AuthLogin.jsx, Daftar.jsxauthService.login / register
AuthorDashboard, BeritaSaya, FormBerita, Profil/api/berita/mine, CRUD /api/berita, /api/auth/me
AdminListUser, ListBerita, InfoWeb, ProfiladminService/api/admin/..., PUT /api/info-web

Routing: frontend/src/routes/index.jsx. Panggilan API: folder frontend/src/services/.

1.5 Batasan penting (supaya tidak bingung)

2 Alur sistem (siapa ngapain)

2.1 Diagram umum fullstack

┌─────────────┐     HTTP (JSON)      ┌─────────────┐     SQL      ┌────────────┐
│   Browser   │ ◄──────────────────► │   Backend   │ ◄──────────► │ PostgreSQL │
│  React Vite │   localhost:5000     │   Express   │              │  (DB news) │
│    :5173    │                      │             │              │            │
└─────────────┘                      └─────────────┘              └────────────┘

2.2 Tiga area pengguna

PenggunaFrontendBackendKeterangan
Publik/, /berita, /kategori/:slugGET /api/berita, /headline, /info-webTanpa login
Author/daftar, /login/dashboard/author/*/api/berita/mine, CRUD berita, /auth/meJWT role author
Admin/login/dashboard/admin/*/api/admin/..., PUT /info-webJWT role admin

2.3 Alur singkat: publik baca berita

  1. Buka Home → getHeadline() + getBerita({ limit }) + getInfoWeb().
  2. Klik kartu → /berita/:idgetBeritaById(id).
  3. Filter kategori → /kategori/teknologigetBerita({ kategori: "Teknologi" }).

2.4 Alur singkat: admin moderasi

  1. Login admin → dashboard hitung author/berita/headline dari API admin.
  2. List berita → set headline (PATCH .../headline) atau cabut (DELETE .../headline).
  3. Hapus berita / hapus author → backend hapus record + file gambar di uploads/.
  4. Info Web → form + FormData logo → PUT /api/info-web.

3 Alur coding (satu request masuk sampai keluar)

3.1 Backend — urutan eksekusi (MVC API)

Browser / React (apiFetch)
    → server.js                 (Express, CORS, JSON, static /uploads)
    → routes/*.js               (cocokkan URL + method)
    → middlewares/              (auth JWT, role, multer upload)
    → controllers/              (validasi, aturan bisnis, success/fail)
    → models/                   (query SQL parameterized $1, $2, ...)
    → config/db.js              (Pool PostgreSQL)
    → respons JSON balik ke React

Kenapa urutannya begitu? Route = peta URL, controller = logika, model = data. Ganti query cukup di models/.

3.2 Frontend — urutan eksekusi

Page (mis. BeritaSaya.jsx / Home.jsx)
    → services/beritaService.js   (getBeritaSaya, getBerita, ...)
    → services/api.js apiFetch()  (base URL + Bearer token)
    → fetch → backend
    → setState(...) → render (tabel / BeritaCard)

Konfigurasi: frontend/.envVITE_API_URL=http://localhost:5000.

3.3 Contoh: author klik “Hapus berita”

LangkahLapisanApa yang terjadi
1UIBeritaSaya.handleDelete(id) + confirm
2beritaService.jsDELETE /api/berita/:id + Bearer
3beritaRoutes.jsauth + role author → beritaController.remove
4ControllerCek berita milik req.user.id
5ModelDELETE FROM berita WHERE id = $1 AND author_id = $2
6fileHelperHapus file di uploads/berita/...
7UIload() — ambil daftar lagi

4 Alur folder & file (mulai baca dari mana)

4.1 Pohon folder backend (inti)

backend/
├── server.js                 ← ① PINTU MASUK
├── .env                      ← ② PORT, JWT_SECRET, DB_*, FRONTEND_URL
├── config/db.js              ← ③ Pool PostgreSQL
├── routes/                   ← ④ auth, berita, admin, infoWeb
├── middlewares/              ← ⑤ auth, role, upload
├── controllers/              ← logika + JSON
├── models/                   ← SQL per tabel
├── utils/response.js, fileHelper.js
└── uploads/berita|logo|sosmed/

4.2 Pohon folder frontend (inti)

frontend/src/
├── main.jsx, App.jsx         ← ①② entry + Router
├── routes/index.jsx          ← ③ semua <Route> + ProtectedRoute
├── services/                 ← ④ api.js + *Service.js
├── pages/public|dashboard/   ← halaman
├── components/layout|berita|home|auth|common
└── styles/custom.css

4.3 Urutan belajar (disarankan)

UrutanBaca / kerjakanKenapa
1Jalankan DB + backend + frontend; buka Home & login seedPahami hasil dulu
2routes/index.jsx + Home.jsxURL browser ↔ fetch API
3services/api.js + beritaService.jsCara React memanggil backend
4beritaRoutes.jsberitaController.jsberitaModel.jsSatu fitur end-to-end (MVC)
5authRoutes + authMiddleware + ProtectedRouteLogin & proteksi role
6Dashboard author lalu adminBedakan hak akses
7server.js + database/schema.sqlMenyatukan semuanya

4.4 Folder vs MVC

FolderPeranCatatan
routes/RoutingURL → middleware → controller
controllers/ControllerValidasi + success() / fail()
models/ModelSQL dengan $1, $2
middlewares/FilterJWT, role, multer
pages/ + components/ViewReact menampilkan JSON

View HTML server tidak ada — tampilan ada di React; backend hanya JSON (+ file statis /uploads).

5 Ringkasan endpoint API

Base URL: http://localhost:5000/api

MethodPathAuthFungsi
POST/auth/registerDaftar author
POST/auth/loginLogin → token + user
GET/PUT/auth/meJWTProfil sendiri
GET/berita, /headline, /:idBaca berita publik
GET/berita/mineauthorBerita milik saya
POST/PUT/DELETE/berita, /berita/:idauthorCRUD milik sendiri
GET/PUT/DELETE/admin/users...adminKelola author
GET/DELETE/admin/berita...adminModerasi (tanpa edit isi)
PATCH/DELETE/admin/berita/:id/headlineadminSet / cabut headline
GET/info-webBaca info situs
PUT/info-webadminUpdate info + logo

6 Database (PostgreSQL)

FileFungsi
database/schema.sqlCREATE TABLE + ENUM + relasi
database/seed.sqlAdmin, author contoh, berita, 1 baris info_web
TabelModelDipakai untuk
usersuserModel.jsLogin, register, profil, kelola author
beritaberitaModel.jsPortal berita + CRUD + headline
info_webinfoWebModel.jsNama situs, kontak, logo, sosmed (1 baris)
Query wajib parameterized ($1, $2) — jangan gabung string user ke SQL.

7 Upload gambar

TopikNilai
MiddlewareuploadMiddleware.js (multer)
BeritaField form gambaruploads/berita/
Info weblogo_webuploads/logo/; logo_wa/logo_iguploads/sosmed/
Batasanjpg / png / webp; ukuran max dari UPLOAD_MAX_MB (default 2)
URL di browserimageUrl(path)http://localhost:5000/uploads/...
Fallbackpublic/placeholder-image.jpg + onError

8 Ringkasan

  1. Frontend React dan backend Express adalah dua aplikasi; data lewat REST JSON.
  2. Backend mengikuti Routes → Middleware → Controller → Model → PostgreSQL.
  3. Frontend: Page → Service → apiFetch → setState → tampilan.
  4. Role menentukan dashboard dan endpoint: publik / author / admin.
  5. Pelajari satu fitur utuh dulu (misalnya list berita Home), baru perluas ke auth dan dashboard.
Dokumen pasangan: docs/STRUKTUR-PROJECT.html (peta folder & file). Acuan desain & aturan bisnis: PERENCANAAN.md.