README.md 3.77 KB

Go Webserver Boilerplate

Created for: Departemen Transformasi Digital Universitas Indonesia Updated At: 21 February 2025

Pendahuluan

Repositori ini digunakan sebagai referensi project menggunakan golang.

Prerequisites

Package list

  • Fiber v3
  • Gorm (ORM)
  • go-dotenv

Memulai

Install seluruh software yang terdapat di prerequisites. Khusus **windows gunakan git bash selama menjalankan project**

Clone repository

git clone git@gitlab.ui.ac.id:dtd/go-webserver-boilerplate.git

Build example

make build <app-name>

Start Project

Environment Variable

  • Salin .env dari .env.example
cp .env.example .env
  • Isi seluruh value yang dibutuhkan di .env

Start binary

./bin/<app-name>

Dokumentasi

Migrasi

Migrasi pada projek ini menggunakan goose, untuk membuat migrasi jalankan

goose --dir migration/postgres <migration-name> sql

isi file sql yang di-generate oleh goose di folder migration/postgres

Menjalankan migrasi

make migration-postgres

Memeriksa status migrasi

make migration-postgres-status

Struktur Folder

|- cmd/
|   |- app-1/
|   |     |- main.go (entrypoint untuk aplikasi app-1)
|   |- <app-lain>
|- internal/
|   |- domain/
|   |     |-base.go
|   |     |-error.go
|   |- handler/
|   |     |-specification
|   |     |-base.go
|   |     |-error.go
|   |-repository/
|   |     |-postgresql/
|   |-service/
|- migration/
    |-postgres/

cmd

Folder ini digunakan sebagai kumpulan apps yang nantinya dapat dijalankan.

Contoh:

  • app-1: Fiber
  • app-2: Scheduler
  • app-3: worker

Setiap apps, harus memiliki file entrypoint atau package main.

internal

Folder ini digunakan sebagai kumpulan core logic yang nantinya akan digunakan untuk setiap apps. Sehingga, jika app-1 dan app-2 memiliki logic yang sama, dapat berbagi core logic.

domain

Folder ini digunakan sebagai kontrak dari setiap module yang nantinya akan diimplementasi. Contoh nama file user.go auth.go.

Dalam satu file di domain, setidaknya harus memiliki:

package domain

type User struct {
ID             int
IdentityNumber string
Email          string
Name           string
}


type UserService interface {}

type UserRepository interface {}

UserService

interface tersebut berisi function yang nantinya akan diimplementasi di folder service.

UserRepository

interface tersebut berisi function yang nantinya akan diimplementasi di folder repository.

handle

Folder ini digunakan sebagai handler untuk setiap apps.

Contohnya adalah UserHandler digunakan untuk handle api/v1/user

Jika terdapat dependencies injection maka type yang digunakan adalah interface yang terdapat di domain.

repository

Folder ini digunakan untuk mengakses database, didalam folder ini kontrak yang dibuat di domain harus diimplementasi sesuai dengan driver yang digunakan.

Contoh:

  • Pada example project ini, terdapat driver postgresql menggunakan gorm. Sehingga terdapat package postgresql dan terdapat file user.go untuk mengimplementasikan user repository yang terdapat di domain user.

service

Folder ini digunakan untuk business logic dari aplikasi. Suatu service harus mengimplementasikan kontrak UserService yang dibuat di domain.User.

Jika terdapat dependencies injection maka type yang digunakan adalah interface yang terdapat di domain.

migration

Kumpulan migration untuk database. Migration digunakan untuk memastikan perubahan database dapat dikelola dengan baik.

postgres

Migration yang berkaitan dengan database PostgreSQL