README ¶
Latihan kumpul disini
Backend Package
Pada bagian ini dijelaskan bagaimana membangun otorisasi pada backend, beberapa langkah yang dilakukan :
- Membuat database backend
- Membuat function golang
- Membuat package golang dan merilisnya
Pastikan github pages sudah jalan di repo masing-masing.
Basis data
Dalam memilih basis data skala enterprise harus mengacu pada hasil survey Gartner.Buatlah masing-masing basis data dari studi kasus yang dipilih :
-
MySQL : https://www.freemysqlhosting.net/, https://www.db4free.net/, https://remotemysql.com/
-
Jika belum punya akun silahkan buat akun menggunakan akun Github (sign in)
Pada saat deploy Pilih Free Plan, Provider pilih Google Cloud, Region Pilih Jakarta, Nama Cluster sesuaikan saja, kemudian Create Pada security quickstart silahkan pilih username dan password (Jangan lupa untuk save password di notepad kalian), kemudian create user
Untuk Tahap 2, klik Add Current My IP Address Jika sudah klik Finish and Close
Jika belum punya MongoDB Compass, silahkan download terlebih dahulu
Buka Mongo DB Compas, Kemudian Add New Connection, copy paste connection string pada gambar di atas, ganti Passwordnya dengan yang tadi sudah disimpan dan hapus kurung sikunya Hasilnya seperti ini Struktur tabel/collection di MongoDB terlihat seperti JSON Pada mongodb.com untuk dapat diakses pada semua IP Address, klik ALLOW ACCESS FROM ANYWHERE atau dengan menuliskan 0.0.0.0/0
Pengembangan Backend
Pada sesi ini kita akan mencoba mengembangkan package golang. Langkah untuk membuat backend di golang :
- Instalasi golang (https://go.dev/dl/)
- Definisikan dahulu struct
- Buatlah package dan fungsi menggunakan struct tersebut
- Fungsi mengakses langsung database
Struct di golang
Komunikasi di golang menggunakan json dipermudah dengan adanya struct type. Struct type ini akan mendefinisikan bagaimana bentuk json yang berkomunikasi dari frontend menuju backend. Sebelumnya inisiasi dulu package yang akan kita buat, masuk ke folder kerja kita dan lakukan inisialisasi package
go mod init github.com/{username github kalian}/{nama repo kalian}/Week4/Site/{NPM masing-masing}
Buat file type.go pada folder tersebut. Kemudian isilah dengan struct yang akan kita buat. Perlu digaris bawahi dan wajib ada atribut :
- bson : mendefinisikan nama field pada collection di database mongoDB
- json : mendefinisikan nama atribut pada pertukaran json melalui API
- omitempty : diperbolehkan tidak diisi / nullable
- [] menunjukan data array didalam array
package namapackage
import (
"go.mongodb.org/mongo-driver/bson/primitive"
)
type Karyawan struct {
ID primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
Nama string `bson:"nama,omitempty" json:"nama,omitempty"`
Phone_number string `bson:"phone_number,omitempty" json:"phone_number,omitempty"`
Jabatan string `bson:"jabatan,omitempty" json:"jabatan,omitempty"`
Jam_kerja []JamKerja `bson:"jam_kerja,omitempty" json:"jam_kerja,omitempty"`
Hari_kerja []string `bson:"hari_kerja,omitempty" json:"hari_kerja,omitempty"`
}
type JamKerja struct {
Durasi int `bson:"durasi,omitempty" json:"durasi,omitempty"`
Jam_masuk string `bson:"jam_masuk,omitempty" json:"jam_masuk,omitempty"`
Jam_keluar string `bson:"jam_keluar,omitempty" json:"jam_keluar,omitempty"`
Gmt int `bson:"gmt,omitempty" json:"gmt,omitempty"`
Hari []string `bson:"hari,omitempty" json:"hari,omitempty"`
Shift int `bson:"shift,omitempty" json:"shift,omitempty"`
Piket_tim string `bson:"piket_tim,omitempty" json:"piket_tim,omitempty"`
}
type Presensi struct {
ID primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
Longitude float64 `bson:"longitude,omitempty" json:"longitude,omitempty"`
Latitude float64 `bson:"latitude,omitempty" json:"latitude,omitempty"`
Location string `bson:"location,omitempty" json:"location,omitempty"`
Phone_number string `bson:"phone_number,omitempty" json:"phone_number,omitempty"`
Datetime primitive.DateTime `bson:"datetime,omitempty" json:"datetime,omitempty"`
Checkin string `bson:"checkin,omitempty" json:"checkin,omitempty"`
Biodata Karyawan `bson:"biodata,omitempty" json:"biodata,omitempty"`
}
type Lokasi struct {
ID primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
Nama string `bson:"nama,omitempty" json:"nama,omitempty"`
Batas Geometry `bson:"batas,omitempty" json:"batas,omitempty"`
Kategori string `bson:"kategori,omitempty" json:"kategori,omitempty"`
}
type Geometry struct {
Type string `json:"type" bson:"type"`
Coordinates interface{} `json:"coordinates" bson:"coordinates"`
}
Kompilasi dependensi dengan perintah
go mod tidy
Fungsi di golang
Edit Environtments Variables pada Windows Buka MongoDB Compass, kemudian pilih copy connection string Paste pada environments variables, kemudian simpan Jika sudah, close text editor (misal VSCode), kemudian buka lagi VSCodenya
Disini dipelajari bagaimana membuat fungsi dan menggunakan environment variabel di golang. Pertama simpan dahulu MONGOSTRING koneksi mongodb di environtment variabel windows atau sistem operasi. Buat file {nama file}.go yang berisi
package namapackage
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"os"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var MongoString string = os.Getenv("MONGOSTRING")
func MongoConnect(dbname string) (db *mongo.Database) {
client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(MongoString))
if err != nil {
fmt.Printf("MongoConnect: %v\n", err)
}
return client.Database(dbname)
}
func InsertOneDoc(db string, collection string, doc interface{}) (insertedID interface{}) {
insertResult, err := MongoConnect(db).Collection(collection).InsertOne(context.TODO(), doc)
if err != nil {
fmt.Printf("InsertOneDoc: %v\n", err)
}
return insertResult.InsertedID
}
func InsertPresensi(long float64,lat float64, lokasi string, phonenumber string, checkin string, biodata Karyawan) (InsertedID interface{}) {
var presensi Presensi
presensi.Latitude = long
presensi.Longitude = lat
presensi.Location = lokasi
presensi.Phone_number = phonenumber
presensi.Datetime = primitive.NewDateTimeFromTime(time.Now().UTC())
presensi.Checkin = checkin
presensi.Biodata = biodata
return InsertOneDoc("tes_db", "presensi", presensi)
}
func GetKaryawanFromPhoneNumber(phone_number string) (staf Presensi) {
karyawan := MongoConnect("tes_db").Collection("presensi")
filter := bson.M{"phone_number": phone_number}
err := karyawan.FindOne(context.TODO(), filter).Decode(&staf)
if err != nil {
fmt.Printf("getKaryawanFromPhoneNumber: %v\n", err)
}
return staf
}
rapihkan dependensi
go mod tidy
Testing Fungsi
Buat file dengan format {namafile}_test.go
package namapackage
import (
"fmt"
"testing"
)
func TestInsertPresensi(t *testing.T) {
long := 98.345345
lat := 123.561651
lokasi := "Rumah"
phonenumber := "68122221814"
checkin := "masuk"
biodata := Karyawan{
Nama : "Drake",
Phone_number : "628456456211",
Jabatan : "Rakyat Biasa",
}
hasil:=InsertPresensi(long ,lat , lokasi , phonenumber , checkin , biodata )
fmt.Println(hasil)
}
func TestGetKaryawanFromPhoneNumber(t *testing.T) {
phonenumber := "68122221814"
biodata:=GetKaryawanFromPhoneNumber(phonenumber)
fmt.Println(biodata)
}
Jalankan testing
go test
Berhasil create dan view
Untuk melihat hasil test pada MongoDB Compass
Untuk menjalankan run test per fungsi bisa menggunakan perintah
go test -run ^NAMAFUNCTION$
Publish Package
Setting dahulu environtment variabel di windows : GOPROXY=proxy.golang.org
lakukan langkah berikut :
git tag
git tag v0.0.1
git push origin --tags
go list -m github.com/indrariksa/ws@v0.0.1
Jika sudah seharusnya package kalian ada di pkg.go.dev. Butuh waktu mungkin sekitar 1 minggu untuk rilis