Pada tahapan ini kita akan membuat main
fungsi dari projek yang sudah kita buat. Pada fungsi main
kita akan menambahkan beberapa inisialisasi fungsi yang memang pada main fungsi itu digunakan untuk menginisialisasi semua resources
yang dibutuhkan oleh projek misalkan koneksi database, inisialisasi handler, usecase dan repository yang sebelumnya sudah kita buat.
HTTP Router yang kita gunakan pada projek kali ini yaitu
github.com/julienschmidt/httprouter
Jadi kita perlu menambahkan terlebih dahulu package tersebut ke dalam projek kita dengan menggunakan perintah golang module.
go get github.com/julienschmidt/httprouter
Konfigurasi HTTP Router dan HTTP ServerA
Pertama, kita buat file main.go
pada folder cmd
lalu isi file tersebut dengan kode dibawha ini.
package cmd
import (
"database/sql"
"github.com/julienschmidt/httprouter"
httpHandler "github.com/santekno/learn-golang-restful/delivery/http"
mysqlRepository "github.com/santekno/learn-golang-restful/repository/mysql"
articleUsecase "github.com/santekno/learn-golang-restful/usecase/article"
)
func main() {
router := httprouter.New()
repository := mysqlRepository.New(&sql.DB{})
articleUsecase := articleUsecase.New(repository)
articleHandler := httpHandler.New(articleUsecase)
router.GET("/api/articles", articleHandler.GetAll)
router.GET("/api/articles/:article_id", articleHandler.GetByID)
router.POST("/api/articles/", articleHandler.Store)
router.PUT("/api/articles/:article_id", articleHandler.Update)
router.DELETE("/api/articles/:article_id", articleHandler.Delete)
server := http.Server{
Addr: "localhost:3000",
Handler: router,
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
}
Bisa kita lihat pertama inisialisasi yang dilakukan yaitu
router := httprouter.New()
Inisialisasi httprouter
ini dilakukan setiap ada inisialisasi REST API jika kita menggunakan package dari julienschmidt/httprouter
.
Selanjutnya kita inisialisasi repository, usecase dan handler layer yang sebelumnya sudah kita buat.
repository := mysqlRepository.New(&sql.DB{})
articleUsecase := articleUsecase.New(repository)
articleHandler := httpHandler.New(articleUsecase)
Pada inisialisasi repository kita perlu menambahkan koneksi database ke dalam layer tersebut yang akan dijelaskan di bagaian konfigurasi koneksi database.
Dilanjutkan dengan membuat setiap endpoint yang sebelumnya kita definisikan menggunakan API Spesification. Pastikan method dan entrypoint yang dibuat sama seperti pada dokumentasi.
router.GET("/api/articles", articleHandler.GetAll)
router.GET("/api/articles/:article_id", articleHandler.GetByID)
router.POST("/api/articles/", articleHandler.Store)
router.PUT("/api/articles/:article_id", articleHandler.Update)
router.DELETE("/api/articles/:article_id", articleHandler.Delete)
Dan yang terakhir yaitu HTTP Server untuk membuat REST API server kita ke publik dengan konfigurasi seperti ini.
server := http.Server{
Addr: "localhost:3000",
Handler: router,
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
Konfigurasi Koneksi Database MySQL
Pada koneksi database ini kita menggunakan package tambahan agar mendukung koneksi ke dalam database MySQL yaitu
github.com/go-sql-driver/mysql
Maka kita perlu menambahkan terlebih dahulu package/libary tersebut dengan perintah ini.
go get github.com/go-sql-driver/mysql
Lalu kita buat folder pkg/database
dan buat file mysql.go
lalu isi file tersebut dengan kode dibawah ini.
package database
import (
"database/sql"
"os"
"gorm.io/driver/mysql"
)
unc New() *sql.DB {
cfg := mysql.Config{
User: os.Getenv("DATABASE_USER"),
Passwd: os.Getenv("DATABASE_PASS"),
Net: "tcp",
Addr: os.Getenv("DATABASE_ADDRESS"),
DBName: os.Getenv("DATABASE_NAME"),
AllowNativePasswords: true,
ParseTime: true,
}
var err error
db, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil {
log.Fatal(err)
}
pingErr := db.Ping()
if pingErr != nil {
log.Fatal(pingErr)
}
fmt.Println("Connected!")
return db
}
Pada projek ini kita hanya melakukan konfigurasi dasar saja diantaranya yaitu
Konfigurasi | Informasi |
---|---|
User | user koneksi yang dibutuhkan untuk ke database mysql |
Passwd | passowrd untuk user yang dibutuhkan untuk koneksi ke database mysql |
Net | protokol yang digunakan untuk koneksi ke database |
Addr | alamat yang menunjukkan server dari database |
DBName | nama dari database yang dituju |
Selanjutnya tambahkan koneksi database tersebut ke dalam file main.go
dan ubah fungsi main()
seperti dibawah ini.
func main() {
// inisialisasi http router
router := httprouter.New()
// inisialisasi database
db := database.New()
// inisialisasi repository
repository := mysqlRepository.New(db)
// inisialisasi usecase
articleUsecase := articleUsecase.New(repository)
// inisialisasi handler
articleHandler := httpHandler.New(articleUsecase)
// entrypoint
router.GET("/api/articles", articleHandler.GetAll)
router.GET("/api/articles/:article_id", articleHandler.GetByID)
router.POST("/api/articles/", articleHandler.Store)
router.PUT("/api/articles/:article_id", articleHandler.Update)
router.DELETE("/api/articles/:article_id", articleHandler.Delete)
}
Membuat file .env
Kita akan membuat semua konfigurasi tersebut disimpan dalam satu file .env
sehingga ketika kita ingin mengubah semua konfigurasi lebih mudah dan gampang tinggal menggantinya pada file tersebut. Maka kita akan coba buat file .env
dan isi file tersebut dengan ini.
DATABASE_USER=development
DATABASE_PASS=d3v3l0pm3nt
DATABASE_ADDRESS=localhost:3306
DATABASE_NAME=article
lalu tambahkan library package ini agar bisa membaca file .env
go get github.com/joho/godotenv
dan tambahkan kode dibawah ini pada file main.go
paling atas dari fungsi main()
.
err := godotenv.Load(".env")
if err != nil {
log.Fatalf("error loading .env file")
}