Skip to content

About

Production-grade Go REST API built with Gin, GORM, and Redis, featuring module-first architecture, Dependency Injection, graceful shutdown, Uber Zap logging, rate limiting, and Swagger OpenAPI

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

🚀 Catatan & Pencapaian Belajar Go (Golang)

Dokumen ini mencatat seluruh modul, konsep, dan aplikasi yang telah berhasil dipelajari dan dibangun dalam sesi latihan Go (Golang).

Pengembang: Kevin Pratama
Waktu Pembelajaran: ~17 Jam
Lokasi Proyek: d:\prog\belajar-go
GitHub Repository: https://github.com/mazkev/belajar-go
Dokumentasi Silabus Lengkap: SYLLABUS.md


🎟️ Sprint Ticket Completion Log

  • [TICKET-101] Soft Delete Implementation: Mengintegrasikan gorm.DeletedAt pada entity Todo untuk fitur pemulihan data (Audit Trail / Soft Delete).
  • [TICKET-102] Dashboard Summary Statistics Endpoint: Menambahkan endpoint GET /api/v1/todos/stats untuk mengembalikan ringkasan statistik todo (total, completed, pending, priority breakdown).
  • [TICKET-103] Export Todos to CSV File Endpoint: Menambahkan endpoint GET /api/v1/todos/export/csv yang memicu streaming unduhan file CSV (todos-export.csv) menggunakan paket standar encoding/csv & bytes.Buffer.
  • [TICKET-104] Change Password Feature Endpoint: Menambahkan endpoint PUT /api/v1/auth/change-password yang memverifikasi password lama dengan Bcrypt dan memperbarui password baru yang di-hash.
  • [TICKET-105] Bulk Delete Todos Endpoint: Menambahkan endpoint DELETE /api/v1/todos/bulk untuk menghapus banyak todo sekaligus berbasis SQL WHERE id IN ? AND user_id = ? dan pembersihan Redis cache.
  • [TICKET-106] Restore Deleted Todo Endpoint: Menambahkan endpoint PUT /api/v1/todos/:id/restore yang menggunakan GORM Unscoped() untuk memulihkan tugas yang terhapus (deleted_at = NULL).

🏆 Ringkasan Pencapaian (Achievements)

Dalam waktu sekitar 17 jam, pencapaian yang telah berhasil dikuasai meliputi:

  • Setup & Fondasi: go.mod, VS Code Extension, Global Cache tanpa node_modules.
  • Sintaks Dasar: Variabel, Pointer &, Loop for, switch-case tanpa break manual.
  • OOP khas Go: struct, Method Receiver (p *Produk), Multiple Return Values.
  • Error Handling: Penanganan error eksplisit khas Go (if err != nil).
  • Modular Sub-Package: Hak akses Public (Capitalized) vs Private (lowercase).
  • Konkurensi & Multithreading: Goroutines, Channels, sync.WaitGroup.
  • JSON & File System: json.Marshal, json.Unmarshal, os.ReadFile, os.WriteFile.
  • Aplikasi CLI Todo List: Persistensi data JSON lokal.
  • Production-Grade Clean Architecture: Pemisahan layer config, models, repositories, services, controllers, middlewares, utils.
  • Database Relasional & ORM: Integrasi SQLite (todos.db) & GORM (gorm.io/gorm) dengan Auto-Migration & Soft Delete (gorm.DeletedAt).
  • Autentikasi & Keamanan: Bcrypt Password Hashing & JWT Token (github.com/golang-jwt/jwt/v5).
  • Gin Web Framework: Refactoring REST API ke Gin Framework (github.com/gin-gonic/gin) dengan Route Grouping /api/v1 & RESTful URL Path Parameters.
  • User Ownership & Foreign Key: Menghubungkan entity Todo ke User (user_id Foreign Key) yang didapatkan secara otomatis dari klaim JWT Token.
  • Private Todos Query Filter: Memfilter query SELECT * FROM todos WHERE user_id = ? sehingga setiap user hanya bisa melihat daftar tugas miliknya sendiri secara privat.
  • Ownership Authorization Validation: Mengamankan endpoint update & delete dengan query ganda WHERE id = ? AND user_id = ?.
  • Pagination & Search Filtering: Fitur Paginasi (?page=1&limit=5) dan Pencarian SQL LIKE (?search=keyword) dengan metadata total data.
  • Automated Unit Testing: Pengujian otomatis dengan paket bawaan testing untuk Bcrypt Hashing & JWT Token (go test ./utils/... -v).
  • GORM Database Auto-Migration: Menambahkan kolom priority, avatar, dan deleted_at secara dinamis ke database SQLite tanpa kehilangan data lama.
  • Redis Caching Integration: Mengintegrasikan Redis Client (github.com/redis/go-redis/v9) dengan pola Cache Hit / Cache Miss & Graceful Fallback (MaxRetries: -1).
  • Swagger API Documentation UI: Mengintegrasikan Gin Swagger (github.com/swaggo/gin-swagger) di http://localhost:8080/swagger/index.html.
  • Uber Zap Structured Logging: Mengintegrasikan Uber Zap Logger (go.uber.org/zap) & Gin Middleware untuk mencatat pencatatan log JSON terstruktur (status, method, path, latency).
  • Environment Variable Management: Mengamankan rahasia sensitif (JWT Secret, DB Name, Port, Redis Addr) di file .env (github.com/joho/godotenv) & menyembunyikannya dari Git via .gitignore.
  • Production Graceful Shutdown: Penghentian server HTTP secara anggun menggunakan http.Server, Goroutines, os/signal, syscall.SIGINT/SIGTERM, dan context.WithTimeout(5s).
  • Dynamic Multi-Database Switcher: Berpindah database secara dinamis antara SQLite dan MySQL (gorm.io/driver/mysql) hanya dengan mengubah DB_DRIVER di .env.
  • Automated MySQL Database Creation: Membuat database MySQL secara otomatis (CREATE DATABASE IF NOT EXISTS) dari kode Go tanpa perlu SQL GUI manual.
  • Module-First Domain Architecture (DDD Structure): Refactoring struktur folder menjadi Domain/Module First Layout (modules/auth & modules/todo).
  • User Profile & Admin User List: Endpoint GET /api/v1/auth/me (profil diri) dan GET /api/v1/auth/users (daftar seluruh user terdaftar).
  • File Upload & Static File Server: Fitur unggah foto avatar (POST /api/v1/auth/avatar) dengan validasi ukuran (< 2MB) & ekstensi (.jpg/.png), penamaan file unik, dan penyajian file statis (r.Static("/uploads", "./uploads")).
  • Rate Limiting Security Middleware: Proteksi anti-spamming/DDoS menggunakan Token Bucket Algorithm (golang.org/x/time/rate) per Client IP Address dengan respon HTTP 429 Too Many Requests.
  • Automated Database Seeder: Script generator data dummy otomatis (go run main.go --seed) yang menggunakan GORM Batch Insert untuk menghasilkan 10 User & 50 Todo dummy dalam waktu < 1 detik.
  • Vanilla HTML/JS Single-Page Client: Aplikasi web frontend interaktif (public/index.html) yang disajikan di root URL http://localhost:8080 (r.StaticFile("/", "./public/index.html")).
  • Docker Containerization: Multi-Stage Build Dockerfile (~20MB app binary) & docker-compose.yml untuk mengorkestrasi Backend Go dan Redis Server secara super ringan & 100% offline vendor build.
  • Air Live Reload Tool: Integrasi hot reload server instant menggunakan air (github.com/air-verse/air).

🏛️ Arsitektur Proyek (Enterprise Production Grade Final Layout)

d:\prog\belajar-go\
├── config/
│   ├── database.go         # Dynamic DB Switcher (SQLite/MySQL), Variadic InitDB & Auto-Create DB
│   ├── redis.go            # Koneksi Client Redis & Ping Healthcheck (MaxRetries: -1 Fallback)
│   └── logger.go           # Inisialisasi Uber Zap Production JSON Logger
├── docs/
│   └── docs.go             # Embedded Swagger OpenAPI Specification
├── modules/
│   ├── auth/               # 📦 MODUL AUTH (Mandiri & Terisolasi)
│   │   ├── model.go        # Struct Entity User (dengan Avatar field)
│   │   ├── repository.go   # Query Database User (Create, FindByEmail, FindByID, Update, FindAll)
│   │   ├── service.go      # Logika Bisnis Auth, GetProfile, ChangePassword, UpdateAvatar, GetAllUsers
│   │   └── controller.go   # Gin Handler Register, Login, ChangePassword, UploadAvatar, GetAllUsers
│   └── todo/               # 📦 MODUL TODO (Mandiri & Terisolasi)
│       ├── model.go        # Struct Entity Todo (dengan GORM DeletedAt Soft Delete)
│       ├── repository.go   # Query Database Todo (FindByUserID, Create, Update, Delete)
│       ├── service.go      # Logika Bisnis Todo (Redis Caching, RestoreTodo, BulkDelete, GetTodoStats & ExportTodosCSV)
│       └── controller.go   # Gin Handler REST API Todo List, RestoreTodo, BulkDelete, GetTodoStats & ExportTodos
├── public/
│   └── index.html          # 🎨 INTERACTIVE HTML/JS FRONTEND CLIENT (dengan Tombol Download CSV)
├── seeder/
│   └── seeder.go           # 🌾 PACKAGE DATABASE SEEDER (Batch Insert Data Dummy)
├── middlewares/
│   ├── auth_middleware.go         # Gin JWT Auth Middleware (Set user_id ke Context)
│   ├── logger_middleware.go       # Gin Uber Zap Middleware (Mencatat HTTP Method, Status, Latency)
│   └── rate_limiter_middleware.go # Gin Rate Limiter Anti-Spam Middleware (HTTP 429 Protection)
├── uploads/                # 🖼️ FOLDER LOKAL PENYIMPANAN FILE UPLOAD
├── utils/
│   ├── jwt.go              # Helper Bcrypt Hashing & JWT Signing/Validation
│   └── jwt_test.go         # Unit Test Otomatis untuk Bcrypt & JWT Token Validation
├── Dockerfile              # 🐳 Multi-Stage Build Docker Deployment Setup (-mod=vendor)
├── docker-compose.yml      # 🐳 Docker Compose Orchestration (Go + Redis)
├── SYLLABUS.md             # 📚 Dokumentasi Silabus 11 Modul & Pengertian Aplikasi Lengkap
├── .env                    # Variabel Konfigurasi Rahasia (Tersembunyi dari Git)
├── .env.example            # Template Panduan Konfigurasi Rahasia
├── test.http               # VS Code REST Client Test Suite (Gin Version)
└── main.go                 # Gin Router, CLI Flag --seed, Init Configs, Swagger & Shutdown

About

Production-grade Go REST API built with Gin, GORM, and Redis, featuring module-first architecture, Dependency Injection, graceful shutdown, Uber Zap logging, rate limiting, and Swagger OpenAPI

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages