Golib เป็นโปรเจ็คที่รวบรวมเอา Package ที่มีการใช้งานบ่อยๆ มาแพ็ครวมกัน และทำ function พร้อม configuration พื้นฐานให้สามารถนำไปใช้งานได้ง่ายๆ
⚙️ Installation
ใช้ได้กับ Go version 1.21
ขึ้นไป ซึ่งสามารถดาวโหลด และติดตั้งได้ที่นี่ Go Download
หลังจากนั้นก็เริ่มต้นโปรเจ็คใหม่ของคุณ และใช้คำสั่ง go get
เพื่อติดตั้ง golib ใช้งาน
go get -u github.com/patcharp/golib/v2
🎯 สารบัญ package ในโปรเจ็ค
- cache สำหรับการเชื่อมต่อหา Redis และ Key-Value อื่นๆ ที่ใช้ Protocol มาตรฐานของ Redis มีทั้งการเชื่อมต่อแบบ node เดี่ยว และแบบ cluster
- crontab สำหรับสร้าง crontab service ในตัว Go Application
- crypto ใช้เกี่ยวกับการเข้ารหัสข้อมูล ทั้ง shared key และ public key และการเข้ารหัสแบบ default ของ crypto-js ใน node.js
- database สำหรับการเชื่อมต่อ database ชนิดต่างโดยใช้ GORM มี function keepalive สำหรับ automatic reconnection ได้เอง
- geomap สำหรับคำนวน geomap แบบใช้ polygon และ พิกัด latitude, longitude
- hashing ใช้ hash ข้อมูลแบบมาตรฐาน โดยใช้ algorithm ของ SHA256, SHA1
- helper function ช่วยเหลือต่างๆ ประกอบไปด้วยการแปลงวันเดือนปี การ response api body ของ gofiber และการแปลงวันเดือนปีให้เป็นภาษาไทย
- imagik สำหรับการประมวลผลรูปภาพ (image processing) และการ grab รูปภาพจาก website
- lokilog เป็น log output ของ logrus เพื่อ push ขึ้นไปยัง Grafana Loki
- mq สำหรับการเชื่อมต่อหา RabbitMQ โดยใช้ Protocol AMPQ
- one package ช่วยเหลือสำหรับ INET One Platform ซึ่งตอนนี้ประกอบไปด้วย OneChat, CMP และ OneID
- requests function สำหรับ Call API โดยใช้แรงบันดาลใจมาจาก lib requests ของ Python ที่สามารถ Customize parameter ต่างๆ ได้เอง
- server เป็น package สำหรับการทำ web application โดยใช้ Go Fiber และเครื่องมือช่วยเหลือต่างๆ เพื่อให้การพัฒนา web application ง่ายขึ้น
- util function utilities ต่างๆ ที่จะรวมรวบเครื่องไม้เครื่องมือมาไว้ใช้งานประกอบไปด้วย
- httputil สำหรับ web application ไม่ว่าจะ header และ function อำนวยความสะดวก
- function common ต่างๆ เช่นกัน getenv, atoi, atof, contain
👀 ตัวอย่างการใช้งาน
ตัวอย่างการใช้งาน package หรือ function สำหรับอำนวยความสะดวกต่างๆ ของ package นี้
📖 Web Api โดยใช้ package server และ helper
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/patcharp/golib/v2/server"
"github.com/sirupsen/logrus"
"net/http"
)
func main() {
s := server.New(server.Config{
Host: "127.0.0.1",
Port: "5000",
HealthCheck: true,
RequestId: true,
})
s.App().Get("/api/hello", func(ctx *fiber.Ctx) error {
return ctx.Status(http.StatusOK).JSON(fiber.Map{
"message": "Hello GoLib v2",
})
})
s.App().Get("/api/hello_v2", func(ctx *fiber.Ctx) error {
return helper.HttpOk(ctx, fiber.Map{
"message": "Hello GoLib v2",
})
})
if err := s.Run(); err != nil {
logrus.Errorln("Start server error ->", err)
}
}
📖 การเรียก API โดยใช้ package requests
package main
import (
"github.com/patcharp/golib/v2/requests"
"github.com/sirupsen/logrus"
)
func main() {
url := "https://www.google.com"
resp, err := requests.Get(
url, // url
nil, // header
nil, // body
0, // timeout (second)
)
if err != nil {
logrus.Errorln("Request to", url, "error ->", err)
return
}
logrus.Infoln("Response code:", resp.Code)
logrus.Infoln("Response body:", string(resp.Body))
}
📖 การ Connect ไป Database โดยใช้ MySQL หรือ MariaDB พร้อมทั้ง Query ข้อมูลจาก database
package main
import (
"errors"
"github.com/patcharp/golib/v2/database"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
)
type User struct {
Id int64
Name string
}
func main() {
db := database.NewMySqlWithConfig(database.MySQLConfig{
Host: "127.0.0.1",
Port: "3306",
Username: "username",
Password: "password",
DatabaseName: "db_name",
DebugMode: true,
},
)
if err := db.Connect(); err != nil {
logrus.Errorln("Connect to database error ->", err)
return
}
defer db.Close()
// Query all users in table
var users []User
if err := db.Ctx().Find(&users).Error; err != nil {
logrus.Errorln("Query all user in users table error ->", err)
return
}
logrus.Infoln("=== Query all users in table ===")
for _, u := range users {
logrus.Infoln("ID:", u.Id, "\tName:", u.Name)
}
// Query specific user where id equal to 10
var user User
if err := db.Ctx().Where("id=?", 10).Take(&user).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
logrus.Errorln("User who has id = 10 was not found")
return
}
// Unknown error occur
logrus.Errorln("Query specific user error ->", err)
return
}
logrus.Infoln("=== Specific user who has id equal to 10 is ===")
logrus.Infoln("ID:", user.Id, "\tName:", user.Name)
}
👍 Contribute
ถ้าคุณชอบที่สามารถนำไปใช้งานได้ในโครงการของคุณ และต้องการขอบคุณ กรุณากดให้ GitHub Star แก่เราด้วย เพื่อเป็นกำลังใจให้พัฒนาต่อไป
🚀 Release log
v2.0.10 - 8 Dec 2023
- go.mod
- 🐞 แก้ไข 3rd party MySQL package มีปัญหา error หลังจากที่ import ไปใช้
- 🐞 Update 3rd part package version
- ⚡️ ปรับ Go version ให้เป็น Go 1.21
- crypto
- ✨ เพิ่มฟังชัน AESByteEncrypt, AESByteDecrypt สำหรับเข้ารหัสข้อมูลประเภท Byte
- ✨ เพิ่มฟังชัน EncryptTokenWithSign, DecryptTokenWithVerifySign เพื่อแนบ Signature และ Verify Signature
- ⚡️ ปรับฟัง EncryptToken, DecryptToken ให้ไม่ต้อง Verify Signature และแนบ Signature
- 🐞 แก้ไขฟังชัน VerifySignedByRSAKey ให้ verify signature ได้
- 🐞 แก้ไขฟังชัน EncodeJWTAccessToken ให้ใช้ RS256 แทนของเดิมที่ key ยาวเกิน
- database
- ✨ เพิ่มฟังชัน SetDebug สำหรับ set debug database
- 🐞 แก้ไข Gorm logger ให้ log severity เหมือนกันกับ database config
- imagik
- ✨ เพิ่มฟังชันสำหรับ New struct => NewImagikFromFile, NewImagikFromByte, NewImagikFromUrl
- ✨ เพิ่มฟังชัน ResizeWithFilter ให้สามารถกำหนด filter algorithm ได้เอง
- ✨ เพิ่มฟังชัน ExportAsFileWithQuality ให้สามารถกำหนด JPEG Quality ได้
- server
- ⚡️ ปรับปรุง ErrorHandler ของ DefaultConfig ให้เป็นตาม DefaultErrorHandler
- 🐞 แก้ไข Skipper ให้สามารถใช้งานได้ตามที่ตั้งค่าไป
v2.0.9 - 29 Aug 2023
- crypto
- ✨ เพิ่ม function ให้สามารถ hash password โดยกำหนดรอบได้เอง
- database
- 🐞 แก้ไข Debug parameter ให้สามารถ enable debug ได้จริง
- ⚡️ ปรับปรุง Gorm connection และเพิ่ม New function ของ MySQL โดยเฉพาะ
- ⚡️ ปรับปรุง Log output ของ gorm ให้ใช้โดยใช้ Logrus
- ✨ เพิ่ม Model type ที่ใช้ ksuid แทนการใช้ uuid
- helper
- ✨ เพิ่ม Error 413 Entity too large, 429 Too many request error
- ✨ เพิ่ม Type Today สำหรับต้องการใช้งานเรียกวันที่ปัจจุบัน และ set เวลาเป็น 00:00:00
- mq
- ⚡️ ปรับปรุง Lib rabbitmq ใหม่ทั้งหมด และไปใช้ amqp มาตรฐานของ rabbitmq
- 🐞 แก้ไข Connection ที่ไม่สามารถ reconnect ไปหา server เองได้
- server
- ✨ เพิ่ม request id middleware ให้เรียกใช้ได้
- ✨ เพิ่ม log middleware ให้ไปใช้ Logrus
- ✨ เพิ่ม route /api/-/health สำหรับ healthcheck และไม่ทำการ print access log ให้เรียกใช้ได้
- 🐞 แก้ไข default server error ให้แสดงผลให้ถูกต้อง
- 🐞 แก้ไขให้ fiber print stacktrace หาก service เกิด crash และ return server error ออกไปหา client
- httputil
- ✨ เพิ่ม function สำหรับดึงค่า ksuid จาก fiber context param
- 🛠 เปลี่ยน function สำหรับดึงค่า uid จาก fiber context param ให้สื่อความหมาย
- util
- 🚧 ลบ function time ที่ซ้ำกับ package today
💻 Code Contributors
⚠️ License
Copyright (c) 2021 Patcharapong and Contributors โดยที่ GoLib นี้เป็น Open Source ที่ทุกคนสามารถนำไปใช้งานได้ฟรี ภายใต้อนุสัญญา MIT License ตาม package ต้นทางที่เราได้นำมาใช้งาน