Config File

mengapa konfigurasi

best practise konfigurasi

Pada bab ini, kita akan membuat file konfigurasi menggunakan viper. Kode lengkap bisa dilihat di github.com/jacky-htg/api-go/02-config-file. Tapi disarankan untuk mengetik ulang kode dengan mengikuti pembahasan berikut agar terbiasa dengan sintaks golang.

Struktur folder bab config file adalah seperti gambar berikut ini.
[tampilkan gambar struktur folder]

Pertama, copy folder 01-simple, paste dengan nama 02-config-file. Lalu buat folder config yang berisi 2 file, yaitu file config.json dan config.go

File config.json berisi konfigurasi dari aplikasi kita dalam bentuk json, untuk sementara hanya kita isi dengan konfigurasi alamat port server.

{
    "server": {
        "address": ":9090"
    }
}

Sedangkan file config.go berisi kode menggunakan viper untuk membaca file config.json

package config

import (
    "github.com/spf13/viper"
    "fmt"
)

func init() {
    viper.SetConfigFile("./config/config.json")
    err := viper.ReadInConfig()
    if err != nil {
        fmt.Println(err.Error())
        panic(err.Error())
    }
}

func GetString(key string)(string) {
    return viper.GetString(key)
}

func GetInt(key string)(int) {
    return viper.GetInt(key)
}

Pada file main.go kita tambahkan import : "github.com/jacky-htg/api-go/02-config-file/config", dan pada func main(), ubah baris http.ListenAndServe menjadi : http.ListenAndServe(config.GetString("server.address"), router). Kode lengkap file main.go terlampir seperti di bawah ini:

package main

import (
    "github.com/gorilla/mux"
    "time"
    "net/http"
    "encoding/json"
    "strconv"
    "github.com/jacky-htg/api-go/02-config-file/config"
)

type User struct {
    ID            int64
    Name        string
    Email       string
    CreatedAt   time.Time
    UpdateAt    time.Time
    DeletedAt   time.Time
}

var users []User

func main() {
    router := mux.NewRouter()
    users = append(users, User{ ID: 1, Name: "Jacky Chan"})
    users = append(users, User{ ID: 2, Name: "Jet Lee", Email: "[email protected]"})

    router.HandleFunc("/api/users", GetUsersEndPoint).Methods("GET")
    router.HandleFunc("/api/users", CreateUserEndPoint).Methods("POST")
    router.HandleFunc("/api/users/{id}", GetUserEndPoint).Methods("GET")

    http.ListenAndServe(config.GetString("server.address"), router)
}

func GetUsersEndPoint(w http.ResponseWriter, _ *http.Request) {
    json.NewEncoder(w).Encode(users)
}

func CreateUserEndPoint(w http.ResponseWriter, req *http.Request) {
    var user User

    user.Name   = req.FormValue("name")
    user.Email  = req.FormValue("email")

    // Validation
    if len(user.Name) == 0 {
        json.NewEncoder(w).Encode("Please suplay valid name")
        return
    }

    if len(user.Email) == 0 {
        json.NewEncoder(w).Encode("Please suplay valid email")
        return
    }

    user.ID         = int64(len(users)+1)
    user.CreatedAt  = time.Now()

    users = append(users, user)    
    json.NewEncoder(w).Encode(user)
}

func GetUserEndPoint(w http.ResponseWriter, req *http.Request) {
    params := mux.Vars(req)
    id, _  := strconv.ParseInt(params["id"], 10, 64)

    for _, v := range users {
        if v.ID == id {
            json.NewEncoder(w).Encode(v)
            return
        }
    }      

    json.NewEncoder(w).Encode(&User{})
}

results matching ""

    No results matching ""