change code for new version
This commit is contained in:
		
							parent
							
								
									f4da943b5d
								
							
						
					
					
						commit
						2e42b0a20a
					
				
							
								
								
									
										9
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										9
									
								
								go.mod
								
								
								
								
							| 
						 | 
				
			
			@ -4,7 +4,10 @@ go 1.16
 | 
			
		|||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/Masterminds/squirrel v1.5.0
 | 
			
		||||
	github.com/jmoiron/sqlx v1.3.4
 | 
			
		||||
	github.com/lib/pq v1.10.2
 | 
			
		||||
	github.com/logrusorgru/aurora v2.0.3+incompatible
 | 
			
		||||
	github.com/Selly-Modules/logger v0.0.2-0.20220824032830-595811dd1f20
 | 
			
		||||
	github.com/golang-migrate/migrate/v4 v4.15.2
 | 
			
		||||
	github.com/jackc/pgx/v4 v4.17.0
 | 
			
		||||
	github.com/volatiletech/sqlboiler/v4 v4.12.0
 | 
			
		||||
	golang.org/x/sys v0.0.0-20220823224334-20c2bfdbfe24 // indirect
 | 
			
		||||
	golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
package postgresql
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/Selly-Modules/logger"
 | 
			
		||||
	"github.com/golang-migrate/migrate/v4"
 | 
			
		||||
	"github.com/golang-migrate/migrate/v4/database/postgres"
 | 
			
		||||
	_ "github.com/golang-migrate/migrate/v4/source/file"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func runMigration(db *sql.DB, server string) {
 | 
			
		||||
	// init migrate data
 | 
			
		||||
	driver, _ := postgres.WithInstance(db, &postgres.Config{})
 | 
			
		||||
	m, err := migrate.NewWithDatabaseInstance(
 | 
			
		||||
		fmt.Sprintf("file:///%s", getMigrationDirectoryPath(server)),
 | 
			
		||||
		"postgres",
 | 
			
		||||
		driver,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// up
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		if err = m.Up(); err != nil && err.Error() != "no change" {
 | 
			
		||||
			logger.Error("run migration", logger.LogData{
 | 
			
		||||
				Source:  "runMigration",
 | 
			
		||||
				Message: err.Error(),
 | 
			
		||||
				Data:    nil,
 | 
			
		||||
			})
 | 
			
		||||
			fmt.Println("run schema migration error:", err.Error())
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Printf("⚡️[postgres]: done migration \n")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getMigrationDirectoryPath(server string) string {
 | 
			
		||||
	migrationDir := fmt.Sprintf("/external/postgresql/%s/migrations/sql", server)
 | 
			
		||||
 | 
			
		||||
	dirname, err := os.Getwd()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check path existed
 | 
			
		||||
	path := dirname + migrationDir
 | 
			
		||||
	if _, err = os.Stat(path); os.IsNotExist(err) {
 | 
			
		||||
		// Create if not existed
 | 
			
		||||
		err = os.Mkdir(path, 0755)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return path
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
package postgresql
 | 
			
		||||
 | 
			
		||||
import "github.com/volatiletech/null/v8"
 | 
			
		||||
 | 
			
		||||
func NewValidNullString(val string) null.String {
 | 
			
		||||
	return null.String{
 | 
			
		||||
		String: val,
 | 
			
		||||
		Valid:  true,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,50 +1,78 @@
 | 
			
		|||
package postgresql
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"github.com/Selly-Modules/logger"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	"github.com/jmoiron/sqlx"
 | 
			
		||||
	_ "github.com/lib/pq" // For postgres dialect
 | 
			
		||||
	"github.com/logrusorgru/aurora"
 | 
			
		||||
	_ "github.com/jackc/pgx/v4/stdlib"
 | 
			
		||||
	"github.com/volatiletech/sqlboiler/v4/boil"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	sqlxClient *sqlx.DB
 | 
			
		||||
)
 | 
			
		||||
type Config struct {
 | 
			
		||||
	Host               string
 | 
			
		||||
	Port               int
 | 
			
		||||
	User               string
 | 
			
		||||
	Password           string
 | 
			
		||||
	DBName             string
 | 
			
		||||
	SSLMode            string
 | 
			
		||||
	IsDebug            bool
 | 
			
		||||
	MaxOpenConnections int
 | 
			
		||||
	MaxIdleConnections int
 | 
			
		||||
	ConnectionLifetime time.Duration
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Connect to postgresql database
 | 
			
		||||
func Connect(host, user, password, dbname, port, sslmode string) error {
 | 
			
		||||
	// Connect string
 | 
			
		||||
	dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=%s TimeZone=UTC",
 | 
			
		||||
		host, user, password, dbname, port, sslmode,
 | 
			
		||||
	)
 | 
			
		||||
var db *sql.DB
 | 
			
		||||
 | 
			
		||||
	// TODO: write case for SSL mode
 | 
			
		||||
// Connect ...
 | 
			
		||||
func Connect(cfg Config, server string) {
 | 
			
		||||
	uri := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s",
 | 
			
		||||
		cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.DBName, cfg.SSLMode)
 | 
			
		||||
 | 
			
		||||
	db, err := sqlx.Connect("postgres", dsn)
 | 
			
		||||
	// connect
 | 
			
		||||
	c, err := sql.Open("pgx", uri)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatalln(err)
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println(aurora.Green("*** CONNECTED TO POSTGRESQL - SQLX: " + dsn))
 | 
			
		||||
 | 
			
		||||
	// Config connection pool
 | 
			
		||||
	sqlDB := db.DB
 | 
			
		||||
	sqlDB.SetMaxOpenConns(100)
 | 
			
		||||
	sqlDB.SetMaxIdleConns(20)
 | 
			
		||||
	sqlDB.SetConnMaxLifetime(time.Minute * 5)
 | 
			
		||||
 | 
			
		||||
	// Assign client
 | 
			
		||||
	sqlxClient = db
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	// ping
 | 
			
		||||
	if err = c.Ping(); err != nil {
 | 
			
		||||
		logger.Error("pgx ping", logger.LogData{
 | 
			
		||||
			Source:  "Connect",
 | 
			
		||||
			Message: err.Error(),
 | 
			
		||||
			Data:    cfg,
 | 
			
		||||
		})
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
// GetSqlxInstance ...
 | 
			
		||||
func GetSqlxInstance() *sqlx.DB {
 | 
			
		||||
	return sqlxClient
 | 
			
		||||
	// assign
 | 
			
		||||
	db = c
 | 
			
		||||
 | 
			
		||||
	// config
 | 
			
		||||
	if cfg.MaxOpenConnections == 0 {
 | 
			
		||||
		cfg.MaxOpenConnections = 25
 | 
			
		||||
	}
 | 
			
		||||
	if cfg.MaxIdleConnections == 0 {
 | 
			
		||||
		cfg.MaxIdleConnections = 25
 | 
			
		||||
	}
 | 
			
		||||
	if cfg.ConnectionLifetime == 0 {
 | 
			
		||||
		cfg.ConnectionLifetime = 5 * time.Minute
 | 
			
		||||
	}
 | 
			
		||||
	db.SetMaxOpenConns(cfg.MaxOpenConnections)
 | 
			
		||||
	db.SetMaxIdleConns(cfg.MaxIdleConnections)
 | 
			
		||||
	db.SetConnMaxLifetime(cfg.ConnectionLifetime)
 | 
			
		||||
 | 
			
		||||
	// run migration
 | 
			
		||||
	runMigration(db, server)
 | 
			
		||||
 | 
			
		||||
	// debug mode
 | 
			
		||||
	boil.DebugMode = cfg.IsDebug
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("⚡️[postgres]: connected to %s:%d \n", cfg.Host, cfg.Port)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetDB ...
 | 
			
		||||
func GetDB() *sql.DB {
 | 
			
		||||
	return db
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,38 @@
 | 
			
		|||
package postgresql
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golang.org/x/text/runes"
 | 
			
		||||
	"golang.org/x/text/transform"
 | 
			
		||||
	"golang.org/x/text/unicode/norm"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RemoveDiacritics ...
 | 
			
		||||
func RemoveDiacritics(s string) string {
 | 
			
		||||
	if s != "" {
 | 
			
		||||
		s = strings.ToLower(s)
 | 
			
		||||
		s = replaceStringWithRegex(s, `đ`, "d")
 | 
			
		||||
		t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
 | 
			
		||||
		result, _, _ := transform.String(t, s)
 | 
			
		||||
		result = replaceStringWithRegex(result, `[^a-zA-Z0-9\s]`, "")
 | 
			
		||||
 | 
			
		||||
		return result
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// replaceStringWithRegex ...
 | 
			
		||||
func replaceStringWithRegex(src string, regex string, replaceText string) string {
 | 
			
		||||
	reg := regexp.MustCompile(regex)
 | 
			
		||||
	return reg.ReplaceAllString(src, replaceText)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TransformKeywordToSearchString ...
 | 
			
		||||
func TransformKeywordToSearchString(keyword string) string {
 | 
			
		||||
	s := strings.Trim(keyword, " ")
 | 
			
		||||
	s = RemoveDiacritics(s)
 | 
			
		||||
	s = strings.ReplaceAll(s, " ", "&")
 | 
			
		||||
	return s + ":*" // For prefix search
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue