Ini merupakan program template untuk Backend Go menggunakan REST API.
Ini adalah requirement untuk menjalankan template ini:
- Go v1.19.3
- Docker (Optional)
- Postgresql (Optional, when using docker)
- GNU Make 4.3 (Optional, when using docker)
- Minio (Optional, when using docker)
- Google wire v0.5.0 (https://github.com/google/wire)
- Air command line (https://github.com/cosmtrek/air)
Untuk menjalankan server ini, gunakan:
make watch
Atau, jika menggunakan docker, kamu dapat gunakan:
docker compose up
Program ini akan dimulai dari modul app. Saat ada request masuk, berikut alurnya:
- Program akan memanggil modul
middleware
untuk menjalankan seluruh middleware yang terdaftarkan. - Program akan memanggil module
routes
untuk menyocokan rute yang sesuai. - Saat menemukan rute yang sesuai, modul
routes
akan memanggil modulcontroller
. - Modul controller akan melakukan parsing data dan validasi input pengguna lalu akan melempar hasil parsing pada modul
service
. - Pada modul
service
, proses bisnis akan dilakukan. Modul ini bisa saja memanggil modulrepository
untuk mengambil data, modullib.storage
untuk melakukan operasi dengan S3 Bucket, dan lainnya. - Hasil operasi
service
akan dikembalikan padacontroller
. Controller akan melakukan parsing data dan mengirimkan hasilnya pada pengguna.
Berikut ini adalah struktur proyek ini:
Folder app
digunakan untuk menyimpan kelas yang berkaitan dengan sistem internal server. Terdapat beberapa file penting diantarnaya adalah sebagai berikut:
- File
di.go
digunakan untuk menambahkan referensi pada dependency injection. Injector yang kami gunakan adalah Google wire. - File
wire_gen.go
merupakan file hasil generate dari google wire. File ini tidak boleh diubah sama sekali.
Folder config
merupakan folder yang digunakan untuk menghubungkan environment variable dengan sistem. Setiap field konfigurasi perlu memiliki types
yang berbeda apabila ingin dilakukan inject pada kelas lain.
Setiap kali pembuatan type baru, pastikan untuk membuat implementasi method UnmarshalText
agar env dapat diconvert menjadi types tersebut.
Setiap field yang akan ditambahkan pada program ini perlu didaftarkan pada struct config
. Lalu, agar field tersebut dapat diakses melalui dependency injection, field tersebut perlu ditambahkan pada app/di.go
.
Folder controller
ditujukan untuk menyimpan semua controller yang dibutuhkan. Controller harus dikelompokan sesuai dengan fungsinya. Controller yang memiliki kategori fungsi yang berbeda perlu dibuat modul terpisah untuk kerapihan.
Setiap modul controller perlu memiliki interface yang menyatakan daftar fungsi controller yang tersedia. Fungsi yang terdaftar di controller haruslah bertipe http.HandlerFunc
.
Pada controller
terdapat beberapa proses yang perlu dilakukan:
- Melakukan parsing body data serta data-data yang dibutuhkan oleh
service
. - Melakukan validasi input.
- Menambahkan dokumentasi mengenai endpoint.
Folder ini menyimpan dokumentasi yang digenerate dari swag.
Folder embed
digunakan untuk menyimpan file-file yang akan dicompile bersama program.
Folder lib
ditujukan untuk menyimpan juga kode program yang berkaitan dengan sistem dan juga kode program yang tidak berkaitan dengan folder lainnya.
Folder middleware menyimpan segala middleware yang tersedia pada program.
Folder ini digunakan untuk menyimpan struktur data dari program. Terdapat dua buah subfolder yang ada pada folder ini, yaitu:
- Folder
domain
digunakan untuk menyimpan struktur data basis data. - Folder
web
digunakan untuk menyimpan struktur data respons.
Folder ini digunakan untuk menyimpan handler menuju basis data. Repository hanya boleh menghubungkan satu buah tabel saja, bila memerlukan pemrosesan lebih dari dua tabel, lakukan pada service
.
Folder ini berisi routes yang digunakan pada API ini. Semua struct yang ada pada kelas ini harus memiliki skema sebagaimana interface BaseChiRoute
.
Folder ini untuk menyimpan segala kode program yang berkaitan dengan pemrosesan request.