free-api-news — REST API untuk News App Flutter

REST API Go + PostgreSQL sebagai backend nyata untuk dua iterasi News App Flutter (Provider/MVVM dan BLoC/Clean Architecture), live di VPS dengan JWT access token dan refresh token rotation.

Role
Solo backend engineer + API designer
Ownership
Solo builder: desain skema, handler, service, SQL migrations, auth flow, Swagger doc, Makefile, deploy ke VPS, serta maintain endpoint berdasarkan kebutuhan dua Flutter client.
Team
Solo project
Period
2026
Focus
Backend, Backend Developer

Overview

free-api-news adalah backend REST API yang dibangun untuk menemani project belajar Flutter. Daripada memakai public mock API, saya bikin sendiri dengan Go + PostgreSQL supaya bisa mendesain kontrak endpoint, error shape, dan alur auth yang pas untuk latihan Clean Architecture di sisi Flutter. API ini di-deploy ke VPS dan dipakai oleh dua app Flutter (news-app-mvvm dan news-app) sebagai single source of truth.

Tech & Libraries

Teknologi dan library yang dipakai atau disentuh di project ini:

Go 1.22PostgreSQLJWT (HS256)bcryptSwagger (OpenAPI)MakefilesystemdSQL migrationsREST APIIDCloudHost VPS (Ubuntu)

Problem

Latihan Flutter Clean Architecture yang layak butuh backend nyata, bukan mock. Mock server tidak mereproduksi latensi, error transport, token expiry, atau refresh rotation, sehingga layer data dan interceptor di Flutter tidak terlatih secara jujur. Mengandalkan public news API juga membatasi eksperimen fitur seperti bookmark server-side, admin article CRUD, atau kontrak error yang konsisten.

My Role & Ownership

Solo builder: desain skema, handler, service, SQL migrations, auth flow, Swagger doc, Makefile, deploy ke VPS, serta maintain endpoint berdasarkan kebutuhan dua Flutter client.

Technical Approach

Membangun REST API Go dengan PostgreSQL berdasarkan struktur project modular (cmd, internal/config, domain, repository, service, handler, middleware, router, util, migrations). Autentikasi memakai JWT access token singkat 15 menit plus opaque refresh token 7 hari yang disimpan di tabel tokens dan dirotasi penuh setiap panggil /refresh.

Endpoint bookmark, news feed, article detail, categories, dan admin article creation dirancang sesuai kebutuhan spesifik Flutter client, sehingga kontrak response terasa alami dari UI sampai backend.

Dokumentasi API ditulis lewat Swagger, migrasi dipegang sebagai file SQL berurutan, dan deploy ke VPS memakai Makefile plus systemd service. Dengan cara ini iterasi fitur di Flutter langsung punya backend pendampingnya di produksi, termasuk update profile, upload avatar, dan OAuth social login.

Architecture Notes

Arsitektur modular per domain: domain (entities + interfaces) menjadi kontrak, repository mengurus akses PostgreSQL, service memegang business logic, handler menghubungkan HTTP dan service, middleware menangani CORS, logging, dan Bearer auth. Entry point cmd/api/main.go bertanggung jawab menyusun dependency dan menjalankan router dengan graceful shutdown.

Token strategy dirancang supaya Flutter client bisa belajar interceptor refresh: access token JWT HS256 15 menit disimpan di memory/secure storage, refresh token opaque 7 hari disimpan di tabel tokens dengan flag is_revoked, dan rotasi penuh dijalankan setiap /refresh dipanggil.

Trade-offs

Memakai JWT + opaque refresh di tabel tokens alih-alih pure stateless karena ingin bisa merevoke refresh secara eksplisit saat logout atau rotasi; konsekuensinya tiap /refresh satu round trip ke DB. Migrasi SQL dikelola manual dengan file berurutan alih-alih framework seperti goose atau migrate; cukup untuk skala project belajar dan membuat setiap perubahan skema tetap terbaca.

Swagger ditulis manual (bukan generated dari struct tags) untuk kontrol penuh pada shape response, trade-off-nya perlu disiplin menjaga swagger dan implementasi tetap sejalan.

Implementation Highlights

  • JWT access token 15 menit untuk stateless check plus opaque refresh token 7 hari di DB; /refresh merotasi pair dan merevoke refresh token lama.
  • Skema DB terdokumentasi (users, tokens, categories, articles) dengan index khusus email, refresh_token, slug, published_at, dan flag is_revoked.
  • Struktur project berlapis (domain, repository, service, handler, middleware, router) dengan util untuk JWT, bcrypt, dan response helper.
  • Swagger (swagger.yaml + docs.go) menjadi kontrak acuan Flutter client supaya DTO di Dart tetap sinkron.
  • Middleware CORS, request logger, dan graceful shutdown supaya deploy tidak tiba-tiba drop koneksi saat update.
  • Upload image endpoint (multipart) untuk avatar profile yang nanti dipakai news-app dengan crop + compress di sisi Flutter.

Results

  • Menunjukkan kemampuan mendesain backend nyata untuk mendukung latihan Flutter Clean Architecture: kontrak endpoint yang rapi, token strategy dua-layer, error shape yang konsisten, dan deploy yang beneran live di VPS, bukan mock lokal.
  • Live di http://103.181.143.73:8081 dan dipakai oleh dua Flutter app (news-app-mvvm dan news-app) sebagai backend pendamping belajar.
  • Swagger UI publik di /swagger/index.html dan health check di /health.
  • Full auth lifecycle: register, login, logout, refresh dengan rotasi token, dan /auth/me untuk update profile.
  • Endpoint news: categories, feed dengan pagination, article detail by slug, upload image, plus admin article creation.
  • Migrasi SQL eksplisit plus deploy ke VPS via Makefile dan systemd service.
  • Access token TTL 15 menit dan refresh token TTL 7 hari dengan rotasi penuh setiap /refresh.
  • Endpoint terdokumentasi: auth (register/login/logout/refresh/me), news (categories/feed/detail), upload, admin article create.
  • Public proof: live di http://103.181.143.73:8081 dan Swagger UI di /swagger/index.html.

Links