Dokumen ini berisi rangkuman perubahan yang telah dilakukan (Migrasi MinIO & Refactoring) serta panduan bagi tim pengembang untuk melanjutkan pengembangan fitur selanjutnya dan juga sebagai dokumentasi.
Berikut adalah komponen utama yang telah diperbarui dan fungsinya:
- Fungsi: Service pusat untuk menangani semua upload file ke MinIO.
- Kenapa dibuat?: Supaya tidak duplikasi code upload di setiap handler. Semua fitur (Gallery, Pengurus, Blog) wajib lewat service ini.
- Fitur: Auto-rename file (UUID), validasi tipe & size file aman, retry logic, dan logging ke database
file_uploads.
Kami menerapkan pola Clean Architecture yang lebih rapi:
Handler ⇒ Service ⇒ Model (Repository)
- Service Layer: Logic bisnis (seperti validasi, panggil storage service) dipindah ke sini. Handler hanya fokus terima request dan return response.
- Contoh Penerapan:
Gallery: sudah pakaiGalleryServicePengurus: sudah pakaiPengurusServiceBlog: sudah pakaiBlogService
- Fitur ini sebelumnya belum komplit, sekarang sudah FULLY IMPLEMENTED.
- CRUD Lengkap: Create, List, GetByID, Update, Delete, dan ListByKategori.
- Swagger: Dokumentasi API sudah update dan bisa dites.
- Memperbaiki bug
strconvdiUploadHandleryang bikin backend restart terus menerus. - Memperbaiki validasi
user_idagar konsisten pakai tipeint(bukan string) sesuai middleware Auth.
Jika tim ingin membuat fitur baru atau melanjutkan fitur Work dan User, WAJIB mengikuti alur ini agar code tetap bersih dan tidak "spaghetti".
Saat membuat fitur baru, jangan langsung coding di Handler! Ikuti urutan ini:
Pastikan struct database dan interface ke GORM sudah siap dan support method yang dibutuhkan.
- Contoh: Cek
internal/database/model/blog.gountuk referensi.
Jangan akses DB langsung dari Handler! Buat file service baru.
- Buat file misal:
internal/service/work_service.go. - Inject model ke dalam service struct.
- Masukkan logic bisnis di sini.
- Contoh: Lihat
internal/service/blog_service.go.
Handler sekarang harusnya "bodoh" (hanya terima input & return JSON).
- Inject Service ke dalam Handler struct (bukan DB langsung).
- Panggil method service.
- Jangan ada logic upload manual di sini, panggil
StorageService.
- Inject dependency di
routes.go: Model -> Service -> Handler. - Daftarkan route baru.
Service Pattern:
type WorkService struct {
Model *model.WorkModel
}
func NewWorkService(m *model.WorkModel) *WorkService {
return &WorkService{Model: m}
}
// Logic function
func (s *WorkService) CreateWork(data *model.Work) error {
return s.Model.InsertWork(data)
}Handler Injection Pattern:
type WorkHandler struct {
Service *service.WorkService // Pakai Service, jangan DB!
}
func NewWorkHandler(s *service.WorkService) *WorkHandler {
return &WorkHandler{Service: s}
}Summary Akhir:
Backend sekarang sudah STABLE. Swagger Documentation di endpoint /swagger/index.html adalah sumber kebenaran (Source of Truth) untuk frontend developer tapi tolong api tolong dites dulu sebelum digunakan (wajib).