diff --git a/.gitignore b/.gitignore
index 2b7a3f1..0e4f3b1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,5 @@ main
.DS_St*
dist
-SSL
\ No newline at end of file
+SSL
+*.config.json
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 70eae82..d6adbd2 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -108,6 +108,14 @@
"args": ["--dev"],
"program": "${workspaceFolder}/servers/jwelly/mysql-to-surreal/main.go"
},
+ {
+ "name": "Run Jwelly Adapter Server",
+ "type": "go",
+ "request": "launch",
+ "mode": "auto",
+ "args": ["--dev"],
+ "program": "${workspaceFolder}/servers/jwelly/ecommerce-adapter/main.go"
+ },
{
"name": "Run Jwelly App Main Server",
"type": "go",
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..153f5bb
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,46 @@
+{
+ "cSpell.words": [
+ "Acno",
+ "Akshat",
+ "bamt",
+ "damt",
+ "DSTAMPID",
+ "ecommerce",
+ "EXWT",
+ "Firestore",
+ "gofiber",
+ "Igroup",
+ "itemtag",
+ "itno",
+ "itrans",
+ "ITRNID",
+ "itrnview",
+ "jpillora",
+ "jwelly",
+ "jwtv",
+ "kacno",
+ "Karigar",
+ "lamt",
+ "LESSWT",
+ "MAMT",
+ "metalwt",
+ "mysqldb",
+ "robfig",
+ "rpsoftech",
+ "samt",
+ "SITEID",
+ "soham",
+ "SPRICE",
+ "STAMPID",
+ "tdate",
+ "TGDID",
+ "tgno",
+ "TPRE",
+ "TSNO",
+ "Tunch",
+ "UNITID",
+ "vono",
+ "vtgno",
+ "Wstg"
+ ]
+}
diff --git a/apps/sohan/whatsapp/auto-download/index.go b/apps/sohan/whatsapp/auto-download/index.go
index 8e86912..3f6e52d 100644
--- a/apps/sohan/whatsapp/auto-download/index.go
+++ b/apps/sohan/whatsapp/auto-download/index.go
@@ -1,4 +1,4 @@
-package sohan_whatsapp_auto_download
+package soham_whatsapp_auto_download
import (
"crypto/sha256"
@@ -15,7 +15,8 @@ import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/widget"
- sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
+ soham_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
+ utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
utility_functions_gzip "github.com/rpsoftech/golang-servers/utility/functions/gzip"
)
@@ -114,7 +115,7 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string {
if runtime.GOOS == "windows" {
serverBinary = "whatsapp-client.exe"
}
- serverBinary = filepath.Join(sohan_whatsapp_keys.ConfigDir, serverBinary)
+ serverBinary = filepath.Join(soham_whatsapp_keys.ConfigDir, serverBinary)
if checkAndRunCalled {
return serverBinary
}
@@ -142,7 +143,7 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string {
needDownload := false
- if _, err := os.Stat(serverBinary); os.IsNotExist(err) {
+ if exist, _ := utility_functions.Exist(serverBinary); !exist {
needDownload = true
}
@@ -157,7 +158,7 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string {
})
err := downloadFileWithProgress(cloud.URL, gzipFile, progress)
if err != nil {
- if _, err := os.Stat(serverBinary); os.IsNotExist(err) {
+ if exist, _ := utility_functions.Exist(serverBinary); !exist {
panic(fmt.Errorf("File Downloading Failed"))
// needDownload = true
}
@@ -222,8 +223,8 @@ func downloadFileWithProgress(url string, filepath string, progress *widget.Prog
func replaceBinarySafe(tmpFile string, serverBinary string) error {
// stop server first
- if sohan_whatsapp_keys.ServerCmd != nil && sohan_whatsapp_keys.ServerCmd.Process != nil {
- sohan_whatsapp_keys.ServerCmd.Process.Kill()
+ if soham_whatsapp_keys.ServerCmd != nil && soham_whatsapp_keys.ServerCmd.Process != nil {
+ soham_whatsapp_keys.ServerCmd.Process.Kill()
time.Sleep(3 * time.Second)
}
@@ -232,7 +233,7 @@ func replaceBinarySafe(tmpFile string, serverBinary string) error {
os.Remove(backup)
- if _, err := os.Stat(serverBinary); err == nil {
+ if exist, _ := utility_functions.Exist(serverBinary); exist {
os.Rename(serverBinary, backup)
}
diff --git a/apps/sohan/whatsapp/config/index.go b/apps/sohan/whatsapp/config/index.go
index 370e1cc..5f958ec 100644
--- a/apps/sohan/whatsapp/config/index.go
+++ b/apps/sohan/whatsapp/config/index.go
@@ -17,7 +17,7 @@ import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"github.com/google/uuid"
- sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
+ soham_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config"
whatsapp_interfaces "github.com/rpsoftech/golang-servers/interfaces/whatsapp"
utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
@@ -40,17 +40,17 @@ func init() {
log.Fatal(err)
}
// fmt.Println(dirname)
- sohan_whatsapp_keys.HomeDir = dirname
- sohan_whatsapp_keys.ConfigDir = filepath.Join(dirname, ".wabot_service")
- sohan_whatsapp_keys.ServerConfigFilePath = filepath.Join(sohan_whatsapp_keys.ConfigDir, whatsapp_config.ServerConfigFileName)
+ soham_whatsapp_keys.HomeDir = dirname
+ soham_whatsapp_keys.ConfigDir = filepath.Join(dirname, ".wabot_service")
+ soham_whatsapp_keys.ServerConfigFilePath = filepath.Join(soham_whatsapp_keys.ConfigDir, whatsapp_config.ServerConfigFileName)
}
func ValidateConfig() (bool, *whatsapp_interfaces.IServerConfig) {
- if _, err := utility_functions.Exist(sohan_whatsapp_keys.ServerConfigFilePath); errors.Is(err, os.ErrNotExist) {
- // panic(fmt.Errorf("CONFIG_NOT_EXIST_ON_PATH %s", sohan_whatsapp_keys.ServerConfigFilePath))
+ if _, err := utility_functions.Exist(soham_whatsapp_keys.ServerConfigFilePath); errors.Is(err, os.ErrNotExist) {
+ // panic(fmt.Errorf("CONFIG_NOT_EXIST_ON_PATH %s", soham_whatsapp_keys.ServerConfigFilePath))
return false, nil
}
- config, err := readConfigFileAndReturniserverConfig(sohan_whatsapp_keys.ServerConfigFilePath)
+ config, err := readConfigFileAndReturniserverConfig(soham_whatsapp_keys.ServerConfigFilePath)
if err != nil {
return false, nil
// panic(err)
@@ -141,7 +141,7 @@ func ValidUUID(uuidstring string) (bool, string) {
}
func QrCodeApiCall(token string) (bool, string) {
- req, err := http.NewRequest("GET", sohan_whatsapp_keys.QRCODEURL, nil)
+ req, err := http.NewRequest("GET", soham_whatsapp_keys.QRCODEURL, nil)
if err != nil {
fmt.Println(err)
@@ -171,7 +171,7 @@ func QrCodeApiCall(token string) (bool, string) {
return true, qrcodeRespo.QrCode
}
func LoginApiCall(token string) (bool, error) {
- req, err := http.NewRequest("GET", sohan_whatsapp_keys.LoginStatusURL, nil)
+ req, err := http.NewRequest("GET", soham_whatsapp_keys.LoginStatusURL, nil)
if err != nil {
fmt.Println(err)
diff --git a/apps/sohan/whatsapp/keys/index.go b/apps/sohan/whatsapp/keys/index.go
index fcb4b53..8c89eeb 100644
--- a/apps/sohan/whatsapp/keys/index.go
+++ b/apps/sohan/whatsapp/keys/index.go
@@ -1,4 +1,4 @@
-package sohan_whatsapp_keys
+package soham_whatsapp_keys
import "os/exec"
diff --git a/apps/sohan/whatsapp/main.go b/apps/sohan/whatsapp/main.go
index a0fe8a2..e77db8c 100644
--- a/apps/sohan/whatsapp/main.go
+++ b/apps/sohan/whatsapp/main.go
@@ -15,14 +15,14 @@ import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
- "fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/driver/desktop"
+ _ "fyne.io/fyne/v2/driver/software"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/widget"
- sohan_whatsapp_auto_download "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/auto-download"
+ soham_whatsapp_auto_download "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/auto-download"
soham_whatsapp_gui_config "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/config"
- sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
+ soham_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
"github.com/rpsoftech/golang-servers/env"
whatsapp_interfaces "github.com/rpsoftech/golang-servers/interfaces/whatsapp"
utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
@@ -79,7 +79,7 @@ func validateGUILOCK() bool {
}
func preventMultipleGUI() {
- if _, err := os.Stat(guiLock); err == nil {
+ if exist, _ := utility_functions.Exist(guiLock); exist {
if validateGUILOCK() {
os.Exit(0)
}
@@ -128,15 +128,15 @@ func startServer(a fyne.App) {
go func() {
progressBar, progressWin := showDownloadProgress(a)
- serverBinary := sohan_whatsapp_auto_download.CheckAndDownload(progressBar, progressWin)
+ serverBinary := soham_whatsapp_auto_download.CheckAndDownload(progressBar, progressWin)
// start server
fyne.Do(func() {
progressWin.Close()
})
for {
updateTrayStatus("🟡 Starting server...")
- sohan_whatsapp_keys.ServerCmd = exec.Command(serverBinary, "--dev")
- serverCmd := sohan_whatsapp_keys.ServerCmd
+ soham_whatsapp_keys.ServerCmd = exec.Command(serverBinary, "--dev")
+ serverCmd := soham_whatsapp_keys.ServerCmd
if runtime.GOOS == "windows" {
serverCmd.SysProcAttr = &syscall.SysProcAttr{
HideWindow: true,
@@ -160,7 +160,7 @@ func startServer(a fyne.App) {
go utility_functions.StreamLogs(stdout, "SERVER")
go utility_functions.StreamLogs(stderr, "SERVER")
}
- err := sohan_whatsapp_keys.ServerCmd.Start()
+ err := soham_whatsapp_keys.ServerCmd.Start()
if err != nil {
updateTrayStatus("🔴 Server failed")
time.Sleep(50 * time.Second)
@@ -168,7 +168,7 @@ func startServer(a fyne.App) {
}
updateTrayStatus("🟢 Server running")
- err = sohan_whatsapp_keys.ServerCmd.Wait()
+ err = soham_whatsapp_keys.ServerCmd.Wait()
println(err)
updateTrayStatus("🔴 Server stopped")
time.Sleep(3 * time.Second)
@@ -187,8 +187,8 @@ func startServer(a fyne.App) {
func restartServer() {
- if sohan_whatsapp_keys.ServerCmd != nil && sohan_whatsapp_keys.ServerCmd.Process != nil {
- sohan_whatsapp_keys.ServerCmd.Process.Kill()
+ if soham_whatsapp_keys.ServerCmd != nil && soham_whatsapp_keys.ServerCmd.Process != nil {
+ soham_whatsapp_keys.ServerCmd.Process.Kill()
}
}
@@ -202,7 +202,7 @@ func saveConfig(token, number string) {
config.Tokens = make(map[string]string)
config.JID = make(map[string]string)
config.Tokens[token] = number
- config.SetConfigPath(sohan_whatsapp_keys.ServerConfigFilePath)
+ config.SetConfigPath(soham_whatsapp_keys.ServerConfigFilePath)
soham_whatsapp_gui_config.SaveConfig(config)
}
@@ -360,20 +360,20 @@ func configForm(a fyne.App) fyne.CanvasObject {
widget.NewLabel("Number"),
number,
)
-
+ log.Println("Loading logo for config file")
// embedded logo
- logo := canvas.NewImageFromResource(resourceIconPng)
- logo.FillMode = canvas.ImageFillContain
- logo.SetMinSize(fyne.NewSize(120, 80))
-
- logoBox := container.NewHBox(
- layout.NewSpacer(),
- logo,
- layout.NewSpacer(),
- )
-
+ // logo := canvas.NewImageFromResource(resourceIconPng)
+ // logo.FillMode = canvas.ImageFillContain
+ // logo.SetMinSize(fyne.NewSize(120, 80))
+
+ // logoBox := container.NewHBox(
+ // layout.NewSpacer(),
+ // logo,
+ // layout.NewSpacer(),
+ // )
+ log.Println("Returning Config Container")
return container.NewVBox(
- logoBox,
+ // logoBox,
layout.NewSpacer(),
row1,
row2,
@@ -468,6 +468,10 @@ func main() {
if os.Getenv("APP_ENV") == "" {
os.Setenv("APP_ENV", "PRODUCTION")
}
+ if !env.IsDev {
+ os.Setenv("FYNE_RENDER", "software")
+ guiLock = filepath.Join(env.FindAndReturnCurrentDir(), guiLock)
+ }
env.LoadEnv(filepath.Join(env.FindAndReturnCurrentDir(), "whatsapp-client.env"))
SetEnv()
log.Printf("ENV Settled")
@@ -475,15 +479,15 @@ func main() {
defer os.Remove(guiLock)
a := app.New()
// a.Settings().SetTheme(theme.)
-
+ log.Println("Starting GUI")
window := a.NewWindow("WABOT Config Tool")
window.Resize(fyne.NewSize(520, 380))
window.CenterOnScreen()
mainWindow = window
-
+ log.Println("Setting ICON")
// embedded icon
- window.SetIcon(resourceIconPng)
+ // window.SetIcon(resourceIconPng)
// window.SetIcon(icon)
//////////////////////////////////////////////////
@@ -515,7 +519,7 @@ func main() {
quitItem,
)
desk.SetSystemTrayMenu(trayMenu)
- desk.SetSystemTrayIcon(resourceIconPng)
+ // desk.SetSystemTrayIcon(resourceIconPng)
}
window.SetCloseIntercept(func() {
@@ -525,8 +529,9 @@ func main() {
//////////////////////////////////////////////////
// START LOGIC
//////////////////////////////////////////////////
-
+ log.Println("Starting CLIENT")
if loadConfig() {
+ log.Println("Config Found adn Loaded")
window.SetContent(successScreen())
go func() {
startServer(a)
@@ -536,6 +541,7 @@ func main() {
})
}()
} else {
+ log.Println("Config Not Found Creating New")
window.SetContent(configForm(a))
}
window.Show()
diff --git a/env/app-env.enum.go b/env/app-env.enum.go
index 974c03c..cd13acf 100644
--- a/env/app-env.enum.go
+++ b/env/app-env.enum.go
@@ -9,7 +9,7 @@ import (
type AppEnv string
const (
- APP_ENV_DEVELOPE AppEnv = "DEVELOPE"
+ APP_ENV_DEVELOP AppEnv = "DEVELOP"
APP_ENV_LOCAL AppEnv = "LOCAL"
APP_ENV_CI AppEnv = "CI"
APP_ENV_PRODUCTION AppEnv = "PRODUCTION"
@@ -17,7 +17,7 @@ const (
var (
appEnvMap = map[string]AppEnv{
- "DEVELOPE": APP_ENV_DEVELOPE,
+ "DEVELOP": APP_ENV_DEVELOP,
"LOCAL": APP_ENV_LOCAL,
"CI": APP_ENV_CI,
"PRODUCTION": APP_ENV_PRODUCTION,
diff --git a/go.mod b/go.mod
index 278f3fc..18f568e 100644
--- a/go.mod
+++ b/go.mod
@@ -3,80 +3,81 @@ module github.com/rpsoftech/golang-servers
go 1.26.0
require (
- cloud.google.com/go/firestore v1.22.0
- firebase.google.com/go/v4 v4.20.0
- fyne.io/fyne/v2 v2.7.4
+ cloud.google.com/go/firestore v1.23.0
+ firebase.google.com/go/v4 v4.21.0
+ fyne.io/fyne/v2 v2.8.0
github.com/fxamacker/cbor/v2 v2.9.2
- github.com/gen2brain/go-fitz v1.24.15
- github.com/go-faker/faker/v4 v4.7.0
- github.com/go-playground/validator/v10 v10.30.2
+ github.com/gen2brain/go-fitz v1.28.2
+ github.com/go-faker/faker/v4 v4.9.0
+ github.com/go-playground/validator/v10 v10.30.3
github.com/go-sql-driver/mysql v1.10.0
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
- github.com/gofiber/contrib/v3/websocket v1.1.5
- github.com/gofiber/fiber/v2 v2.52.13
- github.com/gofiber/fiber/v3 v3.3.0
+ github.com/gofiber/contrib/v3/websocket v1.2.1
+ github.com/gofiber/fiber/v2 v2.52.14
+ github.com/gofiber/fiber/v3 v3.4.0
github.com/golang-jwt/jwt/v5 v5.3.1
github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.3
github.com/joho/godotenv v1.5.1
- github.com/jpillora/chisel v1.11.6
- github.com/mattn/go-sqlite3 v1.14.44
+ github.com/jpillora/chisel v1.11.8
+ github.com/mattn/go-sqlite3 v1.14.48
github.com/mdp/qrterminal/v3 v3.2.1
github.com/mitchellh/mapstructure v1.5.0
github.com/prplecake/go-thumbnail v0.1.6
- github.com/redis/go-redis/v9 v9.19.0
+ github.com/redis/go-redis/v9 v9.21.0
github.com/robfig/cron/v3 v3.0.1
github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
- github.com/surrealdb/surrealdb.go v1.4.0
- go.mau.fi/whatsmeow v0.0.0-20260525123251-933deb5f2ee9
- go.mongodb.org/mongo-driver/v2 v2.6.0
- golang.org/x/crypto v0.52.0
- golang.org/x/sys v0.45.0
- google.golang.org/api v0.280.0
+ github.com/surrealdb/surrealdb.go v1.6.0
+ go.mau.fi/whatsmeow v0.0.0-20260713112832-d8960d9575d2
+ go.mongodb.org/mongo-driver/v2 v2.8.0
+ golang.org/x/crypto v0.54.0
+ golang.org/x/sys v0.47.0
+ google.golang.org/api v0.288.0
google.golang.org/protobuf v1.36.11
)
require (
cel.dev/expr v0.25.2 // indirect
cloud.google.com/go v0.123.0 // indirect
- cloud.google.com/go/auth v0.20.0 // indirect
+ cloud.google.com/go/auth v0.22.0 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/compute/metadata v0.9.0 // indirect
- cloud.google.com/go/iam v1.11.0 // indirect
- cloud.google.com/go/longrunning v1.0.0 // indirect
- cloud.google.com/go/monitoring v1.29.0 // indirect
- cloud.google.com/go/storage v1.62.2 // indirect
+ cloud.google.com/go/iam v1.12.0 // indirect
+ cloud.google.com/go/longrunning v1.2.0 // indirect
+ cloud.google.com/go/monitoring v1.30.0 // indirect
+ cloud.google.com/go/storage v1.63.1 // indirect
filippo.io/edwards25519 v1.2.0 // indirect
- fyne.io/systray v1.12.1 // indirect
+ fyne.io/systray v1.12.2 // indirect
github.com/BurntSushi/toml v1.6.0 // indirect
- github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect
- github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect
- github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect
github.com/MicahParks/keyfunc v1.9.0 // indirect
- github.com/andybalholm/brotli v1.2.1 // indirect
+ github.com/andybalholm/brotli v1.2.2 // indirect
+ github.com/anthonynsimon/bild v0.16.1 // indirect
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 // indirect
github.com/beeper/argo-go v1.1.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect
- github.com/coder/websocket v1.8.14 // indirect
+ github.com/coder/websocket v1.8.15 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/ebitengine/purego v0.10.1 // indirect
- github.com/elliotchance/orderedmap/v3 v3.1.0 // indirect
+ github.com/elliotchance/orderedmap/v3 v3.1.1 // indirect
github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect
github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
github.com/fasthttp/websocket v1.5.12 // indirect
- github.com/felixge/httpsnoop v1.0.4 // indirect
+ github.com/felixge/httpsnoop v1.1.0 // indirect
github.com/fredbi/uri v1.1.1 // indirect
github.com/fsnotify/fsnotify v1.10.1 // indirect
- github.com/fyne-io/gl-js v0.2.0 // indirect
- github.com/fyne-io/glfw-js v0.3.0 // indirect
+ github.com/fyne-io/gl-js v0.2.1-0.20260315212741-029c47fd27e8 // indirect
+ github.com/fyne-io/glfw-js v0.4.0 // indirect
github.com/fyne-io/image v0.1.1 // indirect
github.com/fyne-io/oksvg v0.2.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.13 // indirect
github.com/go-gl/gl v0.0.0-20260331235117-4566fea9a276 // indirect
- github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 // indirect
+ github.com/go-gl/glfw/v3.4/glfw v0.1.0-pre.1.0.20260707082822-2a407d02d01a // indirect
github.com/go-jose/go-jose/v4 v4.1.4 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
@@ -85,74 +86,73 @@ require (
github.com/go-text/render v0.2.1 // indirect
github.com/go-text/typesetting v0.3.4 // indirect
github.com/godbus/dbus/v5 v5.2.2 // indirect
- github.com/gofiber/schema v1.7.1 // indirect
- github.com/gofiber/utils/v2 v2.0.6 // indirect
+ github.com/gofiber/schema v1.8.2 // indirect
+ github.com/gofiber/utils/v2 v2.1.2 // indirect
github.com/gofrs/uuid v4.4.0+incompatible // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/s2a-go v0.1.9 // indirect
- github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect
- github.com/googleapis/gax-go/v2 v2.22.0 // indirect
+ github.com/googleapis/enterprise-certificate-proxy v0.3.18 // indirect
+ github.com/googleapis/gax-go/v2 v2.23.0 // indirect
github.com/hack-pad/go-indexeddb v0.3.2 // indirect
github.com/hack-pad/safejs v0.1.1 // indirect
github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/jpillora/sizestr v1.0.0 // indirect
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
- github.com/jupiterrider/ffi v0.7.0 // indirect
- github.com/klauspost/compress v1.18.6 // indirect
+ github.com/klauspost/compress v1.19.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
- github.com/mattn/go-colorable v0.1.14 // indirect
+ github.com/mattn/go-colorable v0.1.15 // indirect
github.com/mattn/go-isatty v0.0.22 // indirect
- github.com/mattn/go-runewidth v0.0.23 // indirect
+ github.com/mattn/go-runewidth v0.0.24 // indirect
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect
- github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 // indirect
+ github.com/petermattis/goid v0.0.0-20260713124913-97594f28f5ca // indirect
github.com/philhofer/fwd v1.2.0 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/rs/zerolog v1.35.1 // indirect
github.com/rymdport/portal v0.4.2 // indirect
github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761 // indirect
- github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
+ github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
github.com/stretchr/testify v1.11.1 // indirect
github.com/tinylib/msgp v1.6.4 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
- github.com/valyala/fasthttp v1.71.0 // indirect
- github.com/vektah/gqlparser/v2 v2.5.33 // indirect
+ github.com/valyala/fasthttp v1.72.0 // indirect
+ github.com/vektah/gqlparser/v2 v2.5.36 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.2.0 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
- github.com/yuin/goldmark v1.8.2 // indirect
- go.mau.fi/libsignal v0.2.1 // indirect
- go.mau.fi/util v0.9.9 // indirect
+ github.com/yuin/goldmark v1.8.4 // indirect
+ go.mau.fi/libsignal v0.2.2 // indirect
+ go.mau.fi/util v0.9.10 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
- go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect
- go.opentelemetry.io/otel v1.43.0 // indirect
- go.opentelemetry.io/otel/metric v1.43.0 // indirect
- go.opentelemetry.io/otel/sdk v1.43.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect
- go.opentelemetry.io/otel/trace v1.43.0 // indirect
+ go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect
+ go.opentelemetry.io/otel v1.44.0 // indirect
+ go.opentelemetry.io/otel/metric v1.44.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.44.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect
+ go.opentelemetry.io/otel/trace v1.44.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
- golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a // indirect
- golang.org/x/image v0.41.0 // indirect
- golang.org/x/net v0.55.0 // indirect
+ golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597 // indirect
+ golang.org/x/image v0.44.0 // indirect
+ golang.org/x/net v0.57.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
- golang.org/x/sync v0.20.0 // indirect
- golang.org/x/term v0.43.0 // indirect
- golang.org/x/text v0.37.0 // indirect
+ golang.org/x/sync v0.22.0 // indirect
+ golang.org/x/term v0.45.0 // indirect
+ golang.org/x/text v0.40.0 // indirect
golang.org/x/time v0.15.0 // indirect
google.golang.org/appengine/v2 v2.0.6 // indirect
- google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 // indirect
- google.golang.org/grpc v1.81.1 // indirect
+ google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 // indirect
+ google.golang.org/grpc v1.82.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
rsc.io/qr v0.2.0 // indirect
)
diff --git a/go.sum b/go.sum
index 910d78f..634d886 100644
--- a/go.sum
+++ b/go.sum
@@ -2,54 +2,54 @@ cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs=
cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE=
cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU=
-cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA=
-cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q=
+cloud.google.com/go/auth v0.22.0 h1:Xp9wAKkLoeaYb5pYZZoQGz4E9sdPxIbzS3gywZE3ciQ=
+cloud.google.com/go/auth v0.22.0/go.mod h1:M9o2Oz+YI2jAfxewJgb1vyI3vceHF+eohmxyzmrl+9s=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
-cloud.google.com/go/firestore v1.22.0 h1:avooeboIq37vKXobrbPUFhFBxS/c3FqmWoX0xs8dO6E=
-cloud.google.com/go/firestore v1.22.0/go.mod h1:PaM4i7i7ruALSKmlpHXXZaPObcZw0W7ie5UOPr72iTU=
-cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM=
-cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4=
+cloud.google.com/go/firestore v1.23.0 h1:lFkdUEqdb1FxJNeZ17ZCrpok/+5yZdWapEzDCwLuwp8=
+cloud.google.com/go/firestore v1.23.0/go.mod h1:2EWfSUj+iqHckyH7uSjLI+lDgSAWJs9jL/uP45PnuQQ=
+cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk=
+cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY=
cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k=
cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI=
-cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY=
-cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM=
-cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY=
-cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM=
-cloud.google.com/go/storage v1.62.2 h1:WgR4U9n7bIzXkkVnwPKKE8bkaKUNsHG+0MAAlh9DGU4=
-cloud.google.com/go/storage v1.62.2/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA=
+cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM=
+cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0=
+cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY=
+cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM=
+cloud.google.com/go/storage v1.63.1 h1:CYXILV9G4CH0C18IQ9+V0h4XiqD2LhKnMLO0o7uJWNs=
+cloud.google.com/go/storage v1.63.1/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ=
cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E=
cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0=
filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo=
filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc=
-firebase.google.com/go/v4 v4.20.0 h1:ighpjeAC45rY/95cUQ+ojIKlKcTnz2YC0ldam56z2YU=
-firebase.google.com/go/v4 v4.20.0/go.mod h1:hqhkQtZkThGH42TnaYi7A8EFR1E0FEuB5oHvJ1Q57t8=
-fyne.io/fyne/v2 v2.7.4 h1:OVCI5mT+Onb2kA4wlmGA5pLCqKik9f4NDb5jiR1OMTc=
-fyne.io/fyne/v2 v2.7.4/go.mod h1:ZD1mmhBY75mSa97IXl3MPlICd1uNHfCXYh5hKIlVOII=
-fyne.io/systray v1.12.1 h1:ygBD6aZXwiOmZoY5N+ukbH9pih0Kq6fYgVeMYbr5skQ=
-fyne.io/systray v1.12.1/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
+firebase.google.com/go/v4 v4.21.0 h1:HBZV4jrLtFYj8EwWyqEZOuRLfkfkV2bpnfyyXHOhPxY=
+firebase.google.com/go/v4 v4.21.0/go.mod h1:CDumIdA5oTiyDpLNVcQoW8ZrB5CTgyE2D45DuENIABg=
+fyne.io/fyne/v2 v2.8.0 h1:KNUdIk1eKsXSPy/wU6MdiR1hppAPvyzbjPbtJ8h6EUQ=
+fyne.io/fyne/v2 v2.8.0/go.mod h1:tLJK7CVtUBOnMiSDR+J88t/quiGuEhwGs09tIVM1RXg=
+fyne.io/systray v1.12.2 h1:Y8DZxgLHsVQt6rY9Zrkkg+j67S7vv/1F2viOWKPpVeA=
+fyne.io/systray v1.12.2/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 h1:yzIYdwuro811Z27D3T80Wkd3rqZzb0K43nner7Eh1yE=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 h1:ZYGajzJNcirVZpT1rltgf9iM+j9zZ4v8V9DrF+xKRJ8=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0/go.mod h1:PDQyYBOzGtQgvshQI//UiXyzuMHCz0ndyu+4W8X82vM=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0 h1:IBF8BbhKJkMsON/eY+LMu3aF3XMiotCb9KvkUmEkOJo=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 h1:SBZzZCiPmDrUV7NSCWY54OnKikO/oTydPCvyEyYaDDE=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk=
github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o=
github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw=
github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro=
-github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
+github.com/andybalholm/brotli v1.2.2 h1:HzTuoo2ErYQqf5qvcJInB8uvqSVxRttzkFexPWtnceM=
+github.com/andybalholm/brotli v1.2.2/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
+github.com/anthonynsimon/bild v0.16.1 h1:ECqtLkQ15kqfHdRtzUfNvQniJtHNpzdVU/7feMYAm0o=
+github.com/anthonynsimon/bild v0.16.1/go.mod h1:hYAxurnswTQ9dexoiK922MepdXLC1lBzG35n6ypk//g=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/beeper/argo-go v1.1.2 h1:UQI2G8F+NLfGTOmTUI0254pGKx/HUU/etbUGTJv91Fs=
@@ -64,16 +64,16 @@ github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJ
github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik=
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4=
-github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=
-github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
+github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNUA=
+github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=
github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4=
github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY=
github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
-github.com/elliotchance/orderedmap/v3 v3.1.0 h1:j4DJ5ObEmMBt/lcwIecKcoRxIQUEnw0L804lXYDt/pg=
-github.com/elliotchance/orderedmap/v3 v3.1.0/go.mod h1:G+Hc2RwaZvJMcS4JpGCOyViCnGeKf0bTYCGTO4uhjSo=
+github.com/elliotchance/orderedmap/v3 v3.1.1 h1:eV7lfZ5fVL8d36b8Wogqi/eqm7R/kZcftA9Yiyj+63M=
+github.com/elliotchance/orderedmap/v3 v3.1.1/go.mod h1:G+Hc2RwaZvJMcS4JpGCOyViCnGeKf0bTYCGTO4uhjSo=
github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA=
github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU=
github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ=
@@ -86,32 +86,32 @@ github.com/fasthttp/websocket v1.5.12 h1:e4RGPpWW2HTbL3zV0Y/t7g0ub294LkiuXXUuTOU
github.com/fasthttp/websocket v1.5.12/go.mod h1:I+liyL7/4moHojiOgUOIKEWm9EIxHqxZChS+aMFltyg=
github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc=
+github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE=
github.com/fredbi/uri v1.1.1 h1:xZHJC08GZNIUhbP5ImTHnt5Ya0T8FI2VAwI/37kh2Ko=
github.com/fredbi/uri v1.1.1/go.mod h1:4+DZQ5zBjEwQCDmXW5JdIjz0PUA+yJbvtBv+u+adr5o=
github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho=
github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78=
github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
-github.com/fyne-io/gl-js v0.2.0 h1:+EXMLVEa18EfkXBVKhifYB6OGs3HwKO3lUElA0LlAjs=
-github.com/fyne-io/gl-js v0.2.0/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI=
-github.com/fyne-io/glfw-js v0.3.0 h1:d8k2+Y7l+zy2pc7wlGRyPfTgZoqDf3AI4G+2zOWhWUk=
-github.com/fyne-io/glfw-js v0.3.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk=
+github.com/fyne-io/gl-js v0.2.1-0.20260315212741-029c47fd27e8 h1:0kdPD/GEntpWmZEK5Zu/xE6Tr37jYCVDf9QP8lA/QK8=
+github.com/fyne-io/gl-js v0.2.1-0.20260315212741-029c47fd27e8/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI=
+github.com/fyne-io/glfw-js v0.4.0 h1:I9hREBeFyI10cNIqbMKYb1PRidyPDgwob8o2la9SfQo=
+github.com/fyne-io/glfw-js v0.4.0/go.mod h1:SDchsFZh4n7nVuBoiowOhOgIBdz+qUQVeC1w9fe2yVU=
github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA=
github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM=
github.com/fyne-io/oksvg v0.2.0 h1:mxcGU2dx6nwjJsSA9PCYZDuoAcsZ/OuJlvg/Q9Njfo8=
github.com/fyne-io/oksvg v0.2.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI=
github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM=
github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
-github.com/gen2brain/go-fitz v1.24.15 h1:sJNB1MOWkqnzzENPHggFpgxTwW0+S5WF/rM5wUBpJWo=
-github.com/gen2brain/go-fitz v1.24.15/go.mod h1:SftkiVbTHqF141DuiLwBBM65zP7ig6AVDQpf2WlHamo=
-github.com/go-faker/faker/v4 v4.7.0 h1:VboC02cXHl/NuQh5lM2W8b87yp4iFXIu59x4w0RZi4E=
-github.com/go-faker/faker/v4 v4.7.0/go.mod h1:u1dIRP5neLB6kTzgyVjdBOV5R1uP7BdxkcWk7tiKQXk=
+github.com/gen2brain/go-fitz v1.28.2 h1:845G85N5TUgnq5oDqyYrW0JvehAkeo35UkkK2dJtW1M=
+github.com/gen2brain/go-fitz v1.28.2/go.mod h1:pY2hqAjp9Zy7qfPI2gwbJMHBFAdZpVXOLrRxD82l3Bs=
+github.com/go-faker/faker/v4 v4.9.0 h1:a4HXLwueuTCtgF93VpUsl8Zd2nG1VH2SgNWDPVEBg5U=
+github.com/go-faker/faker/v4 v4.9.0/go.mod h1:u1dIRP5neLB6kTzgyVjdBOV5R1uP7BdxkcWk7tiKQXk=
github.com/go-gl/gl v0.0.0-20260331235117-4566fea9a276 h1:IO5P06Pcj9K04d+l4nrf3c2U56+dAotIFG6u4P1wAHI=
github.com/go-gl/gl v0.0.0-20260331235117-4566fea9a276/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 h1:ddtotcEXIT7dFhSeXIWjK8YMFYl5bB2NdYQwgv6Uqjk=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=
+github.com/go-gl/glfw/v3.4/glfw v0.1.0-pre.1.0.20260707082822-2a407d02d01a h1:HWK0MBggT/T6YH7VffE10xBIhqeTq8JzIUPJXrRy87g=
+github.com/go-gl/glfw/v3.4/glfw v0.1.0-pre.1.0.20260707082822-2a407d02d01a/go.mod h1:T5Dn0JwIJOX1euPZ/iT4tq6nFYtmukjcYa7937HuYK8=
github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA=
github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
@@ -125,8 +125,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.30.2 h1:JiFIMtSSHb2/XBUbWM4i/MpeQm9ZK2xqPNk8vgvu5JQ=
-github.com/go-playground/validator/v10 v10.30.2/go.mod h1:mAf2pIOVXjTEBrwUMGKkCWKKPs9NheYGabeB04txQSc=
+github.com/go-playground/validator/v10 v10.30.3 h1:4MU6YkEwx7GbcPJOZxrtbu+QfF3pJLJuaYTeAH0DYy8=
+github.com/go-playground/validator/v10 v10.30.3/go.mod h1:4Axh7oCNGcoGkqLoE4YWt6n20mcEIsPRlB7vPk3lpyc=
github.com/go-sql-driver/mysql v1.10.0 h1:Q+1LV8DkHJvSYAdR83XzuhDaTykuDx0l6fkXxoWCWfw=
github.com/go-sql-driver/mysql v1.10.0/go.mod h1:M+cqaI7+xxXGG9swrdeUIoPG3Y3KCkF0pZej+SK+nWk=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc=
@@ -139,16 +139,16 @@ github.com/go-text/typesetting-utils v0.0.0-20260223113751-2d88ac90dae3 h1:drBZz
github.com/go-text/typesetting-utils v0.0.0-20260223113751-2d88ac90dae3/go.mod h1:3/62I4La/HBRX9TcTpBj4eipLiwzf+vhI+7whTc9V7o=
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
-github.com/gofiber/contrib/v3/websocket v1.1.5 h1:f6hVxWO9dqDx0xGSaz4XDSr/QauhAcDtREajLhShRnM=
-github.com/gofiber/contrib/v3/websocket v1.1.5/go.mod h1:7tXTp2n9qa6epS2qWVP/S5Eky8M9S8MGmuhBNhANT/A=
-github.com/gofiber/fiber/v2 v2.52.13 h1:TOKP64iqC9b5P49VrBW5tHhUOvDyrtJ0xePEfzJbCbk=
-github.com/gofiber/fiber/v2 v2.52.13/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
-github.com/gofiber/fiber/v3 v3.3.0 h1:QBd3sYCqdy6Qs5gJYzSw4I4SbqL204jPqpdub/ueiw8=
-github.com/gofiber/fiber/v3 v3.3.0/go.mod h1:YH7/TAoRaU4kF8slDCtQuFJ1NzC+3MtxUI4KfvQtaIA=
-github.com/gofiber/schema v1.7.1 h1:oSJBKdgP8JeIME4TQSAqlNKTU2iBB+2RNmKi8Nsc+TI=
-github.com/gofiber/schema v1.7.1/go.mod h1:A/X5Ffyru4p9eBdp99qu+nzviHzQiZ7odLT+TwxWhbk=
-github.com/gofiber/utils/v2 v2.0.6 h1:7fXYy7nSsyqbH0GQUMtK4Kwjy4J7R5742VM7JsZxzOs=
-github.com/gofiber/utils/v2 v2.0.6/go.mod h1:p7mAHAk3+oUK10ZX2xTw9fZQixb4hCg8SKd4IH2xroU=
+github.com/gofiber/contrib/v3/websocket v1.2.1 h1:E4I1dVCvNF56ELdKksUJilo1r7dpw7lgt1DmsJd7hOo=
+github.com/gofiber/contrib/v3/websocket v1.2.1/go.mod h1:rQO2z0SbC/l8lP36gXTKrD1QZBXzHKwt9E8c5em1IiA=
+github.com/gofiber/fiber/v2 v2.52.14 h1:Of3L+9qVFaQNwPlcmEdl5IIodHz8BSE0j37R7rWu4pE=
+github.com/gofiber/fiber/v2 v2.52.14/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
+github.com/gofiber/fiber/v3 v3.4.0 h1:F0aND4vwZF7dR7cbvSwFQQEpBU902XHKWxrLsFBkVqw=
+github.com/gofiber/fiber/v3 v3.4.0/go.mod h1:nAhJfdxUIJJph2tPWPmqWf8QDIN2iiqQiQf3lENZpdk=
+github.com/gofiber/schema v1.8.2 h1:wq+LO2xEGlsqma/8Akp9PUebQ6vcsYmF0xYQ4F2ijvU=
+github.com/gofiber/schema v1.8.2/go.mod h1:iyAMJztdyky7Pk2U7bwUP3EHjzMqUNjZ/hglE0nYO/g=
+github.com/gofiber/utils/v2 v2.1.2 h1:/rfkCHvC3XWfOHR04c34KajAhbs5QxmF6cNeJKnkEBI=
+github.com/gofiber/utils/v2 v2.1.2/go.mod h1:DdOgEVwQTi8cou/AKWPqhXOR4fHGRVhA/rEWL3IXG7Q=
github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
@@ -170,10 +170,10 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw=
-github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE=
-github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4=
-github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY=
+github.com/googleapis/enterprise-certificate-proxy v0.3.18 h1:hvVi34VucdrV1IIsiWuqYM8kutw/92MxNEFxCJZEh0k=
+github.com/googleapis/enterprise-certificate-proxy v0.3.18/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k=
+github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE=
+github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A=
@@ -186,16 +186,14 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-github.com/jpillora/chisel v1.11.6 h1:wqlbuatAk8pst2GNY7d2F4AnHxMaLVOA2S/SkC7OlEg=
-github.com/jpillora/chisel v1.11.6/go.mod h1:gAFVTwDLIMM/dH0w1twfSXz0NQUnBVWrlimi707vk7k=
+github.com/jpillora/chisel v1.11.8 h1:pf2ufs2kfytmSWkZoeEgSs5pGrn9ODL2UaZRiR/meyk=
+github.com/jpillora/chisel v1.11.8/go.mod h1:efqW+iikEM4E7CxQSR1LW1oyErlZtWXC/R81C/Fzk2w=
github.com/jpillora/sizestr v1.0.0 h1:4tr0FLxs1Mtq3TnsLDV+GYUWG7Q26a6s+tV5Zfw2ygw=
github.com/jpillora/sizestr v1.0.0/go.mod h1:bUhLv4ctkknatr6gR42qPxirmd5+ds1u7mzD+MZ33f0=
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
-github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs=
-github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c=
-github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
-github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
+github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ=
+github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -206,14 +204,14 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/lxzan/gws v1.8.9 h1:VU3SGUeWlQrEwfUSfokcZep8mdg/BrUF+y73YYshdBM=
github.com/lxzan/gws v1.8.9/go.mod h1:d9yHaR1eDTBHagQC6KY7ycUOaz5KWeqQtP3xu7aMK8Y=
-github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
-github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
+github.com/mattn/go-colorable v0.1.15 h1:+u9SLTRGnXv73cEsnsmoZBom+dMU88B2M0aDcWy0/jY=
+github.com/mattn/go-colorable v0.1.15/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4=
github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4=
-github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw=
-github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
-github.com/mattn/go-sqlite3 v1.14.44 h1:3VSe+xafpbzsLbdr2AWlAZk9yRHiBhTBakioXaCKTF8=
-github.com/mattn/go-sqlite3 v1.14.44/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ=
+github.com/mattn/go-runewidth v0.0.24 h1:cpokDiIn0MGnhdHwuWnJBITySJ20QyNGnY2kR/ay2DU=
+github.com/mattn/go-runewidth v0.0.24/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
+github.com/mattn/go-sqlite3 v1.14.48 h1:7XHIgl0a8HwOaiK4E47ozLkST78rR9+OtNGx27D/TFs=
+github.com/mattn/go-sqlite3 v1.14.48/go.mod h1:6JTjA44L93a0QCyJef5YvlPoKXntQPjzWv5gtm9sB6w=
github.com/mdp/qrterminal/v3 v3.2.1 h1:6+yQjiiOsSuXT5n9/m60E54vdgFsw0zhADHhHLrFet4=
github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFSuQ5kpz/SU=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
@@ -222,8 +220,8 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ=
github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA=
-github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 h1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM=
-github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
+github.com/petermattis/goid v0.0.0-20260713124913-97594f28f5ca h1:GHSUVE4yOgX4E7kTRzpxCPbCOYkd3Kj8Dgdod30OI1E=
+github.com/petermattis/goid v0.0.0-20260713124913-97594f28f5ca/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=
github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
@@ -234,12 +232,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prplecake/go-thumbnail v0.1.6 h1:6mBLXL2/79QHYRCvrciiLtT6vAJfOaMAvNhmjsyLX1c=
github.com/prplecake/go-thumbnail v0.1.6/go.mod h1:v8PaF1YrWlJjdkROeoDgDil5nFycVdH7taPOl/NS830=
-github.com/redis/go-redis/v9 v9.19.0 h1:XPVaaPSnG6RhYf7p+rmSa9zZfeVAnWsH5h3lxthOm/k=
-github.com/redis/go-redis/v9 v9.19.0/go.mod h1:v/M13XI1PVCDcm01VtPFOADfZtHf8YW3baQf57KlIkA=
+github.com/redis/go-redis/v9 v9.21.0 h1:FPBE4hhbAke+TLmcY3WkpbDffJEomdqPn3HYiqAtL9E=
+github.com/redis/go-redis/v9 v9.21.0/go.mod h1:v/M13XI1PVCDcm01VtPFOADfZtHf8YW3baQf57KlIkA=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
-github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
-github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
+github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc=
+github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs=
github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081 h1:BhhQEZcCQNHuJ80dzWHzmroYro0rvijuPaIM12atvNg=
github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081/go.mod h1:r/BoxnMDP7PN0Hbyysah74N/VHbv6KrnIZ6f7fRsljk=
github.com/rs/zerolog v1.35.1 h1:m7xQeoiLIiV0BCEY4Hs+j2NG4Gp2o2KPKmhnnLiazKI=
@@ -248,30 +246,28 @@ github.com/rymdport/portal v0.4.2 h1:7jKRSemwlTyVHHrTGgQg7gmNPJs88xkbKcIL3NlcmSU
github.com/rymdport/portal v0.4.2/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4=
github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761 h1:McifyVxygw1d67y6vxUqls2D46J8W9nrki9c8c0eVvE=
github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761/go.mod h1:Vi9gvHvTw4yCUHIznFl5TPULS7aXwgaTByGeBY75Wko=
-github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
-github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/shamaton/msgpack/v3 v3.1.2 h1:d5gWAIyMU4M0WgDjz6IFSCuXJUA2dFwRHBpDclE8CLw=
github.com/shamaton/msgpack/v3 v3.1.2/go.mod h1:DcQG8jrdrQCIxr3HlMYkiXdMhK+KfN2CitkyzsQV4uc=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
-github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo=
-github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs=
+github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E=
+github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U=
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE=
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q=
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ=
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
-github.com/surrealdb/surrealdb.go v1.4.0 h1:c3Tump5z+b1j27M6Puj0By59axd13ME2NFYptHiIdRw=
-github.com/surrealdb/surrealdb.go v1.4.0/go.mod h1:ju3vn9OHXde9Ulvc7/fP9I8ylkiapOdBSdrEs2PmTtA=
+github.com/surrealdb/surrealdb.go v1.6.0 h1:x88b/W0gDQN7FAtHRsBTEcHLr8UBKNV0uo2MjNKR52s=
+github.com/surrealdb/surrealdb.go v1.6.0/go.mod h1:mKSZxow8ZN2tkR2p/fWzjIbinRFXWOGCOpfIdiYYZzc=
github.com/tinylib/msgp v1.6.4 h1:mOwYbyYDLPj35mkA2BjjYejgJk9BuHxDdvRnb6v2ZcQ=
github.com/tinylib/msgp v1.6.4/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v1.71.0 h1:tepR7H+Guh9VUqxxcPggYi8R3lGUu2Rsdh+z7/FCY3k=
-github.com/valyala/fasthttp v1.71.0/go.mod h1:z1sDUvOShhXq/C9mwH/fSm1Vb71tUJwmQdgkBrBNwnA=
-github.com/vektah/gqlparser/v2 v2.5.33 h1:lRp8aIeNUNbimf/axZd7ETg24q06hBtPaas+TcvI/7E=
-github.com/vektah/gqlparser/v2 v2.5.33/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts=
+github.com/valyala/fasthttp v1.72.0 h1:R7kYdoWhn1ye1fVpP+cDHDJwYm3NkwLliwgzJ/Abg7M=
+github.com/valyala/fasthttp v1.72.0/go.mod h1:zsbLTYqcpIktdQytlVBwIjY9La5d6bs990nBxWg8efk=
+github.com/vektah/gqlparser/v2 v2.5.36 h1:CN9mKVHgMkc+XftdOWIhb4HEL8wKSYkFAqhf8booa7s=
+github.com/vektah/gqlparser/v2 v2.5.36/go.mod h1:cAJ9qwVgPaUkWv6Gn8vn0mqOE0Ui5Pn56wNy5396XWo=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
@@ -285,81 +281,83 @@ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3i
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE=
-github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=
+github.com/yuin/goldmark v1.8.4 h1:oat/nd3U6NeQqFEL3xpEJq7d7c86NI+DbSNGAs4xnjA=
+github.com/yuin/goldmark v1.8.4/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=
github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs=
github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s=
-go.mau.fi/libsignal v0.2.1 h1:vRZG4EzTn70XY6Oh/pVKrQGuMHBkAWlGRC22/85m9L0=
-go.mau.fi/libsignal v0.2.1/go.mod h1:iVvjrHyfQqWajOUaMEsIfo3IqgVMrhWcPiiEzk7NgoU=
-go.mau.fi/util v0.9.9 h1:ujDeXCo07HBor5oQLyO1tHklupmqVmPgasc53d7q/NE=
-go.mau.fi/util v0.9.9/go.mod h1:pqt4Vcrt+5gcH/CgrHZg11qSx+b34o6mknGzOEA6waY=
-go.mau.fi/whatsmeow v0.0.0-20260525123251-933deb5f2ee9 h1:l1E9YRXQhjS7Sm6XbYPq8oiSedSCOB6h3FMqZ8pt+K4=
-go.mau.fi/whatsmeow v0.0.0-20260525123251-933deb5f2ee9/go.mod h1:SY+3c678dbtckGZF16M+sfEW8ZxTb9xkaKwhXueF5yE=
-go.mongodb.org/mongo-driver/v2 v2.6.0 h1:b9sJOYrkmt4l8bY43ZenFBcPlhYIjaOfYHLtbB/5qi8=
-go.mongodb.org/mongo-driver/v2 v2.6.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=
+go.mau.fi/libsignal v0.2.2 h1:QV+XdzQkm3x3aSG7FcqfGSZuFXz83pRZPBFaPygHbOU=
+go.mau.fi/libsignal v0.2.2/go.mod h1:CRlIQg2J8uYTfDFvNoO8/KcZjs5cey0vbc6oj/bssY0=
+go.mau.fi/util v0.9.10 h1:wzvz5iDHyqDXB8vgisD4d3SzucLXNM3iNY+1O1RoHtg=
+go.mau.fi/util v0.9.10/go.mod h1:YQOxySn+ZE3qSYqNxvyX7Yi3suA8YK17PS6QqBREW7A=
+go.mau.fi/whatsmeow v0.0.0-20260713112832-d8960d9575d2 h1:2J3waQ2Br8Mh3SW5tVuuChLysXKeprGcTonORU51CIo=
+go.mau.fi/whatsmeow v0.0.0-20260713112832-d8960d9575d2/go.mod h1:9dmNTYZ/1pHjPw/bz+azBsGjAkcrZbqzMrKcvG5bJ8U=
+go.mongodb.org/mongo-driver/v2 v2.8.0 h1:CxWDGQYY8QQwNjAl/aq2sfWakdnWZynnqJ9F4DhHbP8=
+go.mongodb.org/mongo-driver/v2 v2.8.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
-go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU=
-go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo=
-go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
-go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
-go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA=
-go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A=
-go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
-go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
-go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
-go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
-go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
-go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
-go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
-go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
+go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw=
+go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI=
+go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU=
+go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc=
+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU=
+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q=
+go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc=
+go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo=
+go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA=
+go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk=
+go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58=
+go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0=
+go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI=
+go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA=
+go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk=
+go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988=
-golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc=
-golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a h1:+3jdDGGB8NGb1Zktc737jlt3/A5f6UlwSzmvqUuufxw=
-golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a/go.mod h1:d2fgXJLVs4dYDHUk5lwMIfzRzSrWCfGZb0ZqeLa/Vcw=
+golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw=
+golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk=
+golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597 h1:qLvzZeaANDgyVOA8pyHCOStGlXn0rseXma+GQjeuv2g=
+golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597/go.mod h1:EdfpwwqSu+0Li0mzskwHU6FWDV3t9Q+RZDo3QMUtL3Q=
golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/image v0.41.0 h1:8wS72eGJMJaBxK6okTzd4WaXumUlTVlb753MlsSvTCo=
-golang.org/x/image v0.41.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA=
+golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I=
+golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
-golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
+golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE=
+golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU=
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
-golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=
+golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
-golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
+golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
-golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
+golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0=
+golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
-golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
+golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs=
+golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -369,18 +367,18 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
-google.golang.org/api v0.280.0 h1:F4OfEHZhZh6a7uTufJAXXVd/2TQ8EjM4vZH+jX/vFYk=
-google.golang.org/api v0.280.0/go.mod h1:oGKmPZRDoD3vdkf6MA7F4VNkR1rxCiuaPSkhsf3EolU=
+google.golang.org/api v0.288.0 h1:glhO/J88obKP5I269W3hB73dvBKrjU56ZfmNlNXpgTU=
+google.golang.org/api v0.288.0/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY=
google.golang.org/appengine/v2 v2.0.6 h1:LvPZLGuchSBslPBp+LAhihBeGSiRh1myRoYK4NtuBIw=
google.golang.org/appengine/v2 v2.0.6/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI=
-google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 h1:cTHF8xtqtBN5sQ4dcoNwOS6FFejvFTkWQbZXsTU3trM=
-google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:RRHjglSYABVCWpQ7USCpdfhcd9t4PkajvVwyynZizTc=
-google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 h1:WVVw1Nl19li0fMX++FJ3ye1z9+S1N35QODDy5qpnaXw=
-google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:1dCETSCY2YKZNXQE3h4fun3TYwF5p8jejRKZgfWAgAY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 h1:PvEgGJf9C/1u5CHkInMg7UFYYUoiaQmW2LbtH0pjB78=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
-google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ=
-google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I=
+google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 h1:PWVFocb6Y93aqxY7m9ArHu5zQiLkIrXBLr+ajQxRHH0=
+google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:v47/Kzm6KzB/2uGxuDjGww+7Dk7ny/VFIaIw4WxEtu0=
+google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 h1:lI0NbdWVmT6lOJJNDd7vyeTdfxP/7ouCLSJUKNNXa0k=
+google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:WRrQ7/7N19PypuT0fxLOL5Lq0waoiRri4FbtHDEKrGE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 h1:7RtFDizMtT9eZzHzKxifoMGfcDBBy+LYZlgfg24ZmOM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
+google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU=
+google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
diff --git a/middleware/token-validator.middleware.go b/middleware/token-validator.middleware.go
index beb0627..afd73c3 100644
--- a/middleware/token-validator.middleware.go
+++ b/middleware/token-validator.middleware.go
@@ -6,7 +6,7 @@ import (
"github.com/rpsoftech/golang-servers/interfaces"
)
-var TokenDecrypterFunctinos func(*fiber.Ctx, *string) error
+var TokenDecrypterFunctions func(*fiber.Ctx, *string) error
// fiber middleware for jwt
func TokenDecrypter(c *fiber.Ctx) error {
@@ -22,7 +22,7 @@ func TokenDecrypter(c *fiber.Ctx) error {
return c.Next()
}
// userRolesCustomClaim, localErr := .VerifyToken(tokenString[0])
- localErr := TokenDecrypterFunctinos(c, &tokenString[0])
+ localErr := TokenDecrypterFunctions(c, &tokenString[0])
if localErr != nil {
c.Locals(interfaces.REQ_LOCAL_ERROR_KEY, localErr)
return c.Next()
diff --git a/release/soham/whatsapp-client.go b/release/soham/whatsapp-client.go
index 0381c3c..0be1b06 100644
--- a/release/soham/whatsapp-client.go
+++ b/release/soham/whatsapp-client.go
@@ -50,6 +50,7 @@ func main() {
} else {
version = os.Args[1]
}
+ fmt.Printf("Version: %s\n", version)
err := os.MkdirAll("build", 0755)
if err != nil {
panic(err)
diff --git a/servers/background-service/main.go b/servers/background-service/main.go
index 54743bd..7b20895 100644
--- a/servers/background-service/main.go
+++ b/servers/background-service/main.go
@@ -4,7 +4,6 @@ package main
import (
"encoding/json"
- "errors"
"fmt"
"log"
"os"
@@ -14,6 +13,7 @@ import (
"syscall"
"time"
+ utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
"github.com/rpsoftech/golang-servers/validator"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/debug"
@@ -110,7 +110,7 @@ func start() {
ThisConfig = &Config{}
fmt.Printf("Config path %s\n", configFilePAth)
- if _, err := os.Stat(configFilePAth); errors.Is(err, os.ErrNotExist) {
+ if e, _ := utility_functions.Exist(configFilePAth); !e {
panic(fmt.Errorf("Config Not Exist on Path %s", configFilePAth))
}
dat, err := os.ReadFile(configFilePAth)
diff --git a/servers/boozv3/main-server/main.go b/servers/boozv3/main-server/main.go
index 227c0a5..11d5b95 100644
--- a/servers/boozv3/main-server/main.go
+++ b/servers/boozv3/main-server/main.go
@@ -71,7 +71,7 @@ func main() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
// Print the router stack in JSON format
diff --git a/servers/bullion/dbcreation/sql.template b/servers/bullion/dbcreation/sql.template
index 7627063..6c9459c 100644
--- a/servers/bullion/dbcreation/sql.template
+++ b/servers/bullion/dbcreation/sql.template
@@ -544,12 +544,6 @@ INSERT INTO `CalcStringsHistory` VALUES (0,0,'[]','{\"buy\": \"{{symbole}}\", \"
/*!40000 ALTER TABLE `CalcStringsHistory` ENABLE KEYS */;
UNLOCK TABLES;
-LOCK TABLES `FeedsAndUpdates` WRITE;
-/*!40000 ALTER TABLE `FeedsAndUpdates` DISABLE KEYS */;
-INSERT INTO `FeedsAndUpdates` VALUES (1,'Welcome','Y','
Welcome To Shiv Bullion
',1658097566);
-/*!40000 ALTER TABLE `FeedsAndUpdates` ENABLE KEYS */;
-UNLOCK TABLES;
-
LOCK TABLES `OrderStatus` WRITE;
/*!40000 ALTER TABLE `OrderStatus` DISABLE KEYS */;
INSERT INTO `OrderStatus` VALUES (1,'order_placed','Order Placed',NULL),(2,'limit_expired','Limit Expired',NULL),(3,'limit_placed','Limit Placed',NULL),(4,'limit_passed','Limit Passed',NULL),(5,'limit_canceled','Limit Cancelled',NULL),(6,'delivered','Order Delivered',NULL),(7,'partial_delivered','Partial Delivered',NULL);
diff --git a/servers/bullion/main-server/main.go b/servers/bullion/main-server/main.go
index a89f5d2..81e0fd3 100644
--- a/servers/bullion/main-server/main.go
+++ b/servers/bullion/main-server/main.go
@@ -77,7 +77,7 @@ func main() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
// Print the router stack in JSON format
diff --git a/servers/bullion/main-server/repos/admin-user.repo.go b/servers/bullion/main-server/repos/admin-user.repo.go
index 914c491..e985e1a 100644
--- a/servers/bullion/main-server/repos/admin-user.repo.go
+++ b/servers/bullion/main-server/repos/admin-user.repo.go
@@ -22,7 +22,7 @@ const adminUserCollectionName = "AdminUser"
var AdminUserRepo *AdminUserRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(adminUserCollectionName)
diff --git a/servers/bullion/main-server/repos/bank-details.repo.go b/servers/bullion/main-server/repos/bank-details.repo.go
index a3eb970..e3b53f3 100644
--- a/servers/bullion/main-server/repos/bank-details.repo.go
+++ b/servers/bullion/main-server/repos/bank-details.repo.go
@@ -26,7 +26,7 @@ const bankDetailsCollectionName = "BankDetails"
var BankDetailsRepo *BankDetailsRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(bankDetailsCollectionName)
diff --git a/servers/bullion/main-server/repos/bank-rate-calc.repo.go b/servers/bullion/main-server/repos/bank-rate-calc.repo.go
index 6d05e21..7dc781c 100644
--- a/servers/bullion/main-server/repos/bank-rate-calc.repo.go
+++ b/servers/bullion/main-server/repos/bank-rate-calc.repo.go
@@ -29,7 +29,7 @@ const bankRateRedisCollection = "bankRate"
var BankRateCalcRepo *BankRateCalcRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(bankRateCalcRepoCollectionName)
diff --git a/servers/bullion/main-server/repos/bullion-site-info.repo.go b/servers/bullion/main-server/repos/bullion-site-info.repo.go
index 803a354..9b4e2bb 100644
--- a/servers/bullion/main-server/repos/bullion-site-info.repo.go
+++ b/servers/bullion/main-server/repos/bullion-site-info.repo.go
@@ -22,7 +22,7 @@ const bullionSiteInfoCollectionName = "BullionSiteInfo"
var BullionSiteInfoRepo *BullionSiteInfoRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(bullionSiteInfoCollectionName)
diff --git a/servers/bullion/main-server/repos/event.repo.go b/servers/bullion/main-server/repos/event.repo.go
index 26d8f54..ec4bee1 100644
--- a/servers/bullion/main-server/repos/event.repo.go
+++ b/servers/bullion/main-server/repos/event.repo.go
@@ -20,7 +20,7 @@ const eventsCollectionName = "Events"
var EventRepo *EventRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(eventsCollectionName)
diff --git a/servers/bullion/main-server/repos/feeds.repo.go b/servers/bullion/main-server/repos/feeds.repo.go
index 193fb0b..d6a43b0 100644
--- a/servers/bullion/main-server/repos/feeds.repo.go
+++ b/servers/bullion/main-server/repos/feeds.repo.go
@@ -26,7 +26,7 @@ const feedCollectionName = "Feed"
var FeedsRepo *FeedsRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(feedCollectionName)
diff --git a/servers/bullion/main-server/repos/general-user-req.repo.go b/servers/bullion/main-server/repos/general-user-req.repo.go
index 971cfe8..2e163b5 100644
--- a/servers/bullion/main-server/repos/general-user-req.repo.go
+++ b/servers/bullion/main-server/repos/general-user-req.repo.go
@@ -23,7 +23,7 @@ const generalUserReqCollectionName = "GeneralUserReq"
var GeneralUserReqRepo *GeneralUserReqRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(generalUserReqCollectionName)
diff --git a/servers/bullion/main-server/repos/general-user.repo.go b/servers/bullion/main-server/repos/general-user.repo.go
index fffedd0..0ab133a 100644
--- a/servers/bullion/main-server/repos/general-user.repo.go
+++ b/servers/bullion/main-server/repos/general-user.repo.go
@@ -22,7 +22,7 @@ const generalUserCollectionName = "GeneralUser"
var GeneralUserRepo *GeneralUserRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(generalUserCollectionName)
diff --git a/servers/bullion/main-server/repos/order.repo.go b/servers/bullion/main-server/repos/order.repo.go
index e2c9f31..73c115b 100644
--- a/servers/bullion/main-server/repos/order.repo.go
+++ b/servers/bullion/main-server/repos/order.repo.go
@@ -27,7 +27,7 @@ const orderCollectionName = "Order"
var OrderRepo *OrderRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(orderCollectionName)
diff --git a/servers/bullion/main-server/repos/prduct-group-map.repo.go b/servers/bullion/main-server/repos/prduct-group-map.repo.go
index 4a1a07c..9b9226d 100644
--- a/servers/bullion/main-server/repos/prduct-group-map.repo.go
+++ b/servers/bullion/main-server/repos/prduct-group-map.repo.go
@@ -26,7 +26,7 @@ const productGroupMapCollectionName = "ProductGroupMap"
var ProductGroupMapRepo *ProductGroupMapRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(productGroupMapCollectionName)
diff --git a/servers/bullion/main-server/repos/product-repo.go b/servers/bullion/main-server/repos/product-repo.go
index 25aba45..5097751 100644
--- a/servers/bullion/main-server/repos/product-repo.go
+++ b/servers/bullion/main-server/repos/product-repo.go
@@ -23,7 +23,7 @@ const productCollectionName = "Products"
var ProductRepo *ProductRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(productCollectionName)
diff --git a/servers/bullion/main-server/repos/trade-user-group.repo.go b/servers/bullion/main-server/repos/trade-user-group.repo.go
index e4f2890..6a4f24f 100644
--- a/servers/bullion/main-server/repos/trade-user-group.repo.go
+++ b/servers/bullion/main-server/repos/trade-user-group.repo.go
@@ -26,7 +26,7 @@ const tradeUserGroupCollectionName = "TradeUserGroup"
var TradeUserGroupRepo *TradeUserGroupRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(tradeUserGroupCollectionName)
diff --git a/servers/bullion/main-server/repos/trade-user.repo.go b/servers/bullion/main-server/repos/trade-user.repo.go
index beb854d..15ce7b0 100644
--- a/servers/bullion/main-server/repos/trade-user.repo.go
+++ b/servers/bullion/main-server/repos/trade-user.repo.go
@@ -29,7 +29,7 @@ const tradeUserCollectionName = "TradeUser"
var TradeUserRepo *TradeUserRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(tradeUserCollectionName)
diff --git a/servers/http-dump/dump-server/main.go b/servers/http-dump/dump-server/main.go
index e631e60..794da48 100644
--- a/servers/http-dump/dump-server/main.go
+++ b/servers/http-dump/dump-server/main.go
@@ -49,7 +49,7 @@ func main() {
// entity.BaseEntity.ID = "56397cab-7246-4d1c-ac14-c3446317e67b"
// dump_server_repos.EndPointRepo.Save(entity)
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
hostAndPort = hostAndPort + ":" + env.GetServerPort(env.PORT_KEY)
diff --git a/servers/http-dump/dump-server/repos/end-point.repo.go b/servers/http-dump/dump-server/repos/end-point.repo.go
index d65d6b0..2d1b56e 100644
--- a/servers/http-dump/dump-server/repos/end-point.repo.go
+++ b/servers/http-dump/dump-server/repos/end-point.repo.go
@@ -26,7 +26,7 @@ const endPointCollectionName = "EndPoint"
var EndPointRepo *EndPointRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(endPointCollectionName)
diff --git a/servers/http-dump/dump-server/repos/event.repo.go b/servers/http-dump/dump-server/repos/event.repo.go
index f39cd5b..a2eefcb 100644
--- a/servers/http-dump/dump-server/repos/event.repo.go
+++ b/servers/http-dump/dump-server/repos/event.repo.go
@@ -20,7 +20,7 @@ const eventsCollectionName = "Events"
var EventRepo *EventRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(eventsCollectionName)
diff --git a/servers/jwelly/ecommerce-adapter/Server.Db.sql b/servers/jwelly/ecommerce-adapter/Server.Db.sql
new file mode 100644
index 0000000..ab22c6a
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/Server.Db.sql
@@ -0,0 +1,200 @@
+CREATE TABLE
+ `ItemUnit` (
+ `itemUnitId` INT NOT NULL,
+ `itemUnit` VARCHAR(45) NOT NULL,
+ `itemDecimal` INT (1) NULL DEFAULT 0,
+ PRIMARY KEY (`itemUnitId`),
+ UNIQUE INDEX `itemUnit_UNIQUE` (`itemUnit` ASC) VISIBLE
+ );
+
+CREATE TABLE
+ `ItemGroup` (
+ `itemGroupId` INT NOT NULL,
+ `itemGroup` VARCHAR(45) NOT NULL,
+ `itemPrintName` VARCHAR(45) NULL,
+ `itemGroupUnitId` INT NOT NULL,
+ PRIMARY KEY (`itemGroupId`),
+ INDEX `IgroupUnitToUnitID_idx` (`itemGroupUnitId` ASC) VISIBLE,
+ CONSTRAINT `IgroupUnitToUnitID` FOREIGN KEY (`itemGroupUnitId`) REFERENCES `ItemUnit` (`itemUnitId`) ON DELETE RESTRICT ON UPDATE CASCADE
+ );
+
+CREATE TABLE
+ `ItemMaster` (
+ `itemId` INT NOT NULL,
+ `itemName` VARCHAR(45) NULL,
+ `iGroupId` INT (3) NULL,
+ `itemPrintName` VARCHAR(45) NULL,
+ `iUnitId` INT (3) NULL,
+ `itemTagPrefix` VARCHAR(5) NULL,
+ PRIMARY KEY (`itemId`),
+ UNIQUE INDEX `itemName_UNIQUE` (`itemName` ASC) VISIBLE,
+ INDEX `ItemMast1_idx` (`iGroupId` ASC) VISIBLE,
+ INDEX `ItemMast2_idx` (`iUnitId` ASC) VISIBLE,
+ CONSTRAINT `ItemMast1` FOREIGN KEY (`iGroupId`) REFERENCES `ItemGroup` (`itemGroupId`) ON DELETE RESTRICT ON UPDATE CASCADE,
+ CONSTRAINT `ItemMast2` FOREIGN KEY (`iUnitId`) REFERENCES `ItemUnit` (`itemUnitId`) ON DELETE RESTRICT ON UPDATE CASCADE
+ );
+
+CREATE TABLE
+ `Stamp` (
+ `stampId` INT NOT NULL,
+ `STAMP` VARCHAR(45) NULL,
+ `tunch` DECIMAL(8, 2) NULL,
+ `stockTunch` DECIMAL(8, 2) NULL,
+ `sellTunch` DECIMAL(8, 2) NULL DEFAULT 0,
+ PRIMARY KEY (`stampId`)
+ );
+
+INSERT INTO
+ `Stamp` (
+ `stampId`,
+ `STAMP`,
+ `tunch`,
+ `stockTunch`,
+ `sellTunch`
+ )
+VALUES
+ ('0', '0', '0', '0', '0');
+
+CREATE TABLE
+ `ItemsTag` (
+ `itemTagId` INT NOT NULL,
+ `itemTag` VARCHAR(45) NOT NULL,
+ `itemVTagId` INT NULL,
+ `tItemId` INT NULL,
+ `tagCreatedDate` DATE NULL,
+ PRIMARY KEY (`itemTagId`),
+ UNIQUE INDEX `itemTag_UNIQUE` (`itemTag` ASC) VISIBLE,
+ UNIQUE INDEX `combo_unique` (`itemVTagId` ASC, `tItemId` ASC) VISIBLE,
+ INDEX `itemtag_item_idx` (`tItemId` ASC) VISIBLE,
+ CONSTRAINT `itemtag_item` FOREIGN KEY (`tItemId`) REFERENCES `ItemMaster` (`itemId`) ON DELETE RESTRICT ON UPDATE CASCADE
+ );
+
+CREATE TABLE
+ `ItemTagVariation` (
+ `tagVariationId` INT NOT NULL AUTO_INCREMENT,
+ `vTagId` INT NULL,
+ `vStampId` INT NULL,
+ `vGrossWt` DECIMAL(10, 4) NULL,
+ `vLessWeight` DECIMAL(10, 4) NULL,
+ `vNetWt` DECIMAL(10, 4) NULL,
+ `vStatus` BIT (1) NULL,
+ `vTunch` DECIMAL(6, 2) NULL,
+ `vWstg` DECIMAL(6, 2) NULL,
+ `vSellTunch` DECIMAL(6, 2) NULL,
+ `vSellWstg` DECIMAL(6, 2) NULL,
+ `vKarigarCode` VARCHAR(40) NULL,
+ PRIMARY KEY (`tagVariationId`),
+ INDEX `TagVariation_1_idx` (`vTagId` ASC) INVISIBLE,
+ INDEX `TagVariation_2_idx` (`vStampId` ASC) VISIBLE,
+ UNIQUE INDEX `TagVariation_3` (`vTagId` ASC, `vStampId` ASC) INVISIBLE,
+ CONSTRAINT `TagVariation_1` FOREIGN KEY (`vTagId`) REFERENCES `ItemsTag` (`itemTagId`) ON DELETE RESTRICT ON UPDATE CASCADE,
+ CONSTRAINT `TagVariation_2` FOREIGN KEY (`vStampId`) REFERENCES `Stamp` (`stampId`) ON DELETE RESTRICT ON UPDATE CASCADE
+ );
+
+CREATE TABLE
+ `ItemTagVariationDetails` (
+ `itemTagDetailsId` INT NOT NULL,
+ `dItemTagId` INT NOT NULL,
+ `dItemId` INT NOT NULL,
+ `dSTAMPID` INT NULL DEFAULT 0,
+ `dWeight` DECIMAL(10, 3) NULL DEFAULT 0.000,
+ `dExWeight` DECIMAL(10, 3) NULL DEFAULT 0.000,
+ `dFinalWeight` DECIMAL(10, 3) NULL DEFAULT 0.000,
+ `dRemarks` TINYTEXT NULL,
+ `dPcs` INT NULL DEFAULT 0,
+ `dRate` DECIMAL(12, 2) NULL DEFAULT 0.000,
+ `dSaleValue` DECIMAL(12, 2) NULL DEFAULT 0.000,
+ `dUnitId` INT NULL,
+ PRIMARY KEY (`itemTagDetailsId`),
+ INDEX `ItemTagVariationDetails_4_idx` (`dItemTagId` ASC) VISIBLE,
+ INDEX `ItemTagVariationDetails_1_idx` (`dSTAMPID` ASC) VISIBLE,
+ INDEX `ItemTagVariationDetails_2_idx` (`dItemId` ASC) VISIBLE,
+ INDEX `ItemTagVariationDetails_3_idx` (`dUnitId` ASC) VISIBLE,
+ CONSTRAINT `ItemTagVariationDetails_1` FOREIGN KEY (`dSTAMPID`) REFERENCES `Stamp` (`stampId`) ON DELETE RESTRICT ON UPDATE CASCADE,
+ CONSTRAINT `ItemTagVariationDetails_2` FOREIGN KEY (`dItemId`) REFERENCES `ItemMaster` (`itemId`) ON DELETE RESTRICT ON UPDATE CASCADE,
+ CONSTRAINT `ItemTagVariationDetails_4` FOREIGN KEY (`dItemTagId`) REFERENCES `ItemsTag` (`itemTagId`) ON DELETE RESTRICT ON UPDATE CASCADE,
+ CONSTRAINT `ItemTagVariationDetails_3` FOREIGN KEY (`dUnitId`) REFERENCES `ItemUnit` (`itemUnitId`) ON DELETE RESTRICT ON UPDATE CASCADE
+ );
+
+CREATE TABLE
+ `AccountGroup` (
+ `groupId` INT NOT NULL,
+ `groupName` VARCHAR(80) NOT NULL,
+ `underId` INT NOT NULL DEFAULT 0,
+ `gType` VARCHAR(45) NULL,
+ PRIMARY KEY (`groupId`)
+ );
+
+CREATE TABLE
+ `AccountMaster` (
+ `acno` INT NOT NULL,
+ `prefix` VARCHAR(5) DEFAULT "",
+ `Name` VARCHAR(60) NOT NULL,
+ `pName` VARCHAR(60) DEFAULT "",
+ `aGroupId` INT NOT NULL,
+ `city` VARCHAR(40) NULL DEFAULT "",
+ `location` VARCHAR(30) NULL DEFAULT "",
+ `mobile` VARCHAR(20) NULL DEFAULT "",
+ `phone` VARCHAR(20) NULL DEFAULT "",
+ PRIMARY KEY (`acno`),
+ INDEX `AccountMaster_1_idx` (`aGroupId` ASC) VISIBLE,
+ CONSTRAINT `AccountMaster_1` FOREIGN KEY (`aGroupId`) REFERENCES `AccountGroup` (`groupId`) ON DELETE RESTRICT ON UPDATE CASCADE
+ );
+
+CREATE TABLE
+ ItemTransaction (
+ itransId INT AUTO_INCREMENT PRIMARY KEY,
+ trnId INT NOT NULL DEFAULT 0,
+ vono INT NOT NULL DEFAULT 0,
+ tno INT NOT NULL DEFAULT 0,
+ snTranId INT NOT NULL DEFAULT 0,
+ tdate DATE NOT NULL,
+ ino INT NOT NULL DEFAULT 0,
+ -- Updated to VARCHAR based on the 'string' struct type
+ remarks VARCHAR(255) NOT NULL DEFAULT '',
+ -- Weights (3 decimal places)
+ gwt DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ wt DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ lesswt DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ metalwt DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ orgGwt DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ fine1 DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ tunch DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ wstg DECIMAL(10, 3) NOT NULL DEFAULT 0.000,
+ pc INT NOT NULL DEFAULT 0,
+ -- Rates and Amounts (2 decimal places)
+ rate DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ mamt DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ tValue DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ damt DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ samt DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ lamt DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ bamt DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ others DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ lbr DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ orgRate DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ orgTotal DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ total DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
+ -- Strings/Identifiers
+ type VARCHAR(50) NOT NULL DEFAULT '',
+ stock VARCHAR(50) NOT NULL DEFAULT '',
+ unitId INT NOT NULL DEFAULT 0,
+ stampId INT NOT NULL DEFAULT 0,
+ siteId INT NOT NULL DEFAULT 0,
+ size VARCHAR(50) NOT NULL DEFAULT '',
+ tgno VARCHAR(50) NOT NULL DEFAULT '',
+ tpre VARCHAR(50) NOT NULL DEFAULT '',
+ karigar VARCHAR(100) NOT NULL DEFAULT '',
+ vtgno INT NOT NULL DEFAULT 0,
+ tsno INT NOT NULL DEFAULT 0,
+ kacno INT NOT NULL DEFAULT 0,
+ INDEX `ItemTransaction_1_idx` (`ino` ASC) VISIBLE,
+ INDEX `ItemTransaction_2_idx` (`stampId` ASC) VISIBLE,
+ INDEX `ItemTransaction_3_idx` (`unitId` ASC) VISIBLE,
+ CONSTRAINT `ItemTransaction_1` FOREIGN KEY (`ino`) REFERENCES `ItemMaster` (`itemId`) ON DELETE RESTRICT
+ UPDATE CASCADE,
+ CONSTRAINT `ItemTransaction_2` FOREIGN KEY (`stampId`) REFERENCES `Stamp` (`stampId`) ON DELETE RESTRICT
+ UPDATE CASCADE,
+ CONSTRAINT `ItemTransaction_3` FOREIGN KEY (`unitId`) REFERENCES `ItemUnit` (`itemUnitId`) ON DELETE RESTRICT
+ UPDATE CASCADE
+ );
\ No newline at end of file
diff --git a/servers/jwelly/ecommerce-adapter/env/env.index.go b/servers/jwelly/ecommerce-adapter/env/env.index.go
new file mode 100644
index 0000000..94c8f80
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/env/env.index.go
@@ -0,0 +1,65 @@
+package ecommerce_env
+
+import (
+ "encoding/json"
+ "os"
+ "path/filepath"
+
+ "github.com/gofiber/fiber/v2/log"
+ "github.com/rpsoftech/golang-servers/env"
+ utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+type (
+ IServerMysqlConnection struct {
+ Server *mysqldb.MysqlDBStruct
+ ERP *mysqldb.MysqlDBStruct
+ }
+ IServerConfig struct {
+ ServerDatabase *mysqldb.MysqldbConfig `json:"ServerDatabase" validate:"required"`
+ ErpDatabase *mysqldb.MysqldbConfig `json:"ErpDatabase" validate:"required"`
+ AccountTableSyncCron string `json:"AccountTableSyncCron" validate:"required"`
+ BasicDetailsSyncCron string `json:"BasicDetailsSyncCron" validate:"required"`
+ ItemTagDetailsSyncCron string `json:"ItemTagDetailsSyncCron" validate:"required"`
+ }
+
+ serverEnv struct {
+ DefaultEnv *env.DefaultEnvInterface
+ ACCESS_TOKEN_KEY string `json:"ACCESS_TOKEN_KEY" validate:"required,min=10"`
+ }
+)
+
+var (
+ ServerConfig *IServerConfig
+ MysqlConnections *IServerMysqlConnection
+ Env *serverEnv
+)
+
+func Init() *IServerConfig {
+ if ServerConfig != nil {
+ return ServerConfig
+ }
+ MysqlConnections = &IServerMysqlConnection{}
+ ServerConfig = &IServerConfig{}
+ env.LoadEnv("ecommerce-adapter.env")
+ log.Debug("ServerEnv Initialized")
+ Env = &serverEnv{
+ DefaultEnv: env.Env,
+ ACCESS_TOKEN_KEY: env.Env.GetEnv("ACCESS_TOKEN_KEY"),
+ }
+ env.ValidateEnv(Env)
+ configFileName := "server.config.json"
+ if e := env.Env.GetEnv("CONFIG_FILE_NAME"); e != "" {
+ configFileName = e
+ }
+ configFileName = filepath.Join(env.FindAndReturnCurrentDir(), configFileName)
+ if e, err := utility_functions.Exist(configFileName); !e || err != nil {
+ panic(err)
+ }
+ dat, err := os.ReadFile(configFileName)
+ env.Check(err)
+ err = json.Unmarshal(dat, ServerConfig)
+ env.Check(err)
+ return ServerConfig
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/acc-group.func.go b/servers/jwelly/ecommerce-adapter/functions/acc-group.func.go
new file mode 100644
index 0000000..a769b67
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/acc-group.func.go
@@ -0,0 +1,65 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectAccountGroupQuery = "select GROUPID,GNAME,UNDERID,GRTYPE from `group`;"
+const ServerAccGrpOfColumns = 4
+const AccountGroupUpsertQuery = `INSERT INTO AccountGroup (groupId,groupName,underId,gType) VALUES %s AS new_row ON DUPLICATE KEY UPDATE groupName=new_row.groupId,underId=new_row.groupId,gType=new_row.groupId`
+
+func SyncAccountGroupTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectAccountGroupQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.AccountGroupTable = []*ecommerce_maintables.AccountGroupTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.AccountGroupTable{}
+ err = rows.Scan(
+ &row.GroupId,
+ &row.GroupName,
+ &row.UnderId,
+ &row.GType,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from Stamp in Duration of %s\n", len(results), time.Since(startTime))
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*ServerAccGrpOfColumns)
+ for _, stamp := range results {
+ valueStrings = append(valueStrings, "(?, ?, ? ,?)")
+ valueArgs = append(valueArgs,
+ stamp.GroupId,
+ stamp.GroupName,
+ stamp.UnderId,
+ stamp.GType,
+ )
+ }
+ finalQuery := fmt.Sprintf(AccountGroupUpsertQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert for Stamp successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/acc-mast.func.go b/servers/jwelly/ecommerce-adapter/functions/acc-mast.func.go
new file mode 100644
index 0000000..b29acd8
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/acc-mast.func.go
@@ -0,0 +1,76 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectAccountMasterQuery = "select acno,PREFIX,CNAME,PNAME,GROUPID,CITY,LOCATION,MOBILE,PHONE from `accmast`;"
+const ServerAccMstOfColumns = 9
+const upsertAccountMasterPlaceHolder = "(?, ?, ?, ?, ?, ?, ?, ?, ?)"
+const AccountMasterUpsertQuery = `INSERT INTO AccountMaster (acno,prefix,Name,pName,aGroupId,city,location,mobile,phone) VALUES %s AS new_row ON DUPLICATE KEY UPDATE prefix = new_row.prefix,Name = new_row.Name,pName = new_row.pName,aGroupId = new_row.aGroupId,city = new_row.city,location = new_row.location,mobile = new_row.mobile,phone = new_row.phone`
+
+func SyncAccountMasterTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectAccountMasterQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.AccountMasterTable = []*ecommerce_maintables.AccountMasterTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.AccountMasterTable{}
+ err = rows.Scan(
+ &row.Acno,
+ &row.Prefix,
+ &row.Name,
+ &row.PName,
+ &row.AGroupId,
+ &row.City,
+ &row.Location,
+ &row.Mobile,
+ &row.Phone,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from AccountMaster in Duration of %s\n", len(results), time.Since(startTime))
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*ServerAccMstOfColumns)
+ for _, account := range results {
+ valueStrings = append(valueStrings, upsertAccountMasterPlaceHolder)
+ valueArgs = append(valueArgs,
+ account.Acno,
+ account.Prefix,
+ account.Name,
+ account.PName,
+ account.AGroupId,
+ account.City,
+ account.Location,
+ account.Mobile,
+ account.Phone,
+ )
+ }
+ finalQuery := fmt.Sprintf(AccountMasterUpsertQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert for AccountMaster successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/item-group.func.go b/servers/jwelly/ecommerce-adapter/functions/item-group.func.go
new file mode 100644
index 0000000..f54cd9e
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/item-group.func.go
@@ -0,0 +1,62 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+// const SelectItemGroupQuery
+const SelectItemGroupQuery = "select igroupid,IGROUP,PNAME,UNITID from igroup;"
+const ServerItemGroupTable = "ItemGroup"
+const ServerItemGroupOfColumns = 4
+const ItemGroupUpsertQuery = `INSERT INTO ItemGroup (itemGroupId, itemGroup, itemPrintName,itemGroupUnitId) VALUES %s AS new_row ON DUPLICATE KEY UPDATE itemGroup=new_row.itemGroup,itemPrintName=new_row.itemPrintName,itemGroupUnitId=new_row.itemGroupUnitId`
+
+func SyncItemGroupTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectItemGroupQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.ItemGroupMainTable = []*ecommerce_maintables.ItemGroupMainTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.ItemGroupMainTable{}
+ err = rows.Scan(
+ &row.ItemGroupId,
+ &row.ItemGroup,
+ &row.ItemPrintName,
+ &row.ItemUnitId,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from ItemGroup in Duration of %s\n", len(results), time.Since(startTime))
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*ServerItemGroupOfColumns)
+ for _, group := range results {
+ valueStrings = append(valueStrings, "(?, ?, ? ,?)")
+ valueArgs = append(valueArgs, group.ItemGroupId, group.ItemGroup, group.ItemPrintName, group.ItemUnitId)
+ }
+ finalQuery := fmt.Sprintf(ItemGroupUpsertQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert for Item Group successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/item-master.func.go b/servers/jwelly/ecommerce-adapter/functions/item-master.func.go
new file mode 100644
index 0000000..8bab97a
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/item-master.func.go
@@ -0,0 +1,71 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectItemMasterQuery = "select ino,IDESC,IGROUPID,PNAME,UNITID,tpre from itemmast;"
+const ServerItemMasterTable = "ItemMaster"
+const ServerItemMasterOfColumns = 4
+const ItemMasterUpsertQuery = `INSERT INTO ItemMaster (itemId, itemName, iGroupId,itemPrintName,iUnitId,itemTagPrefix) VALUES %s AS new_row ON DUPLICATE KEY UPDATE itemName = new_row.itemName, iGroupId = new_row.iGroupId, itemPrintName = new_row.itemPrintName, iUnitId = new_row.iUnitId, itemTagPrefix = new_row.itemTagPrefix`
+
+func SyncItemMasterTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectItemMasterQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.ItemMasterTable = []*ecommerce_maintables.ItemMasterTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.ItemMasterTable{}
+ err = rows.Scan(
+ &row.ItemId,
+ &row.ItemName,
+ &row.IGroupId,
+ &row.ItemPrintName,
+ &row.IUnitId,
+ &row.ItemTagPrefix,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from Item Master in Duration of %s\n", len(results), time.Since(startTime))
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*ServerItemMasterOfColumns)
+
+ for _, item := range results {
+ valueStrings = append(valueStrings, "(?,?,?,?,?,?)")
+ valueArgs = append(valueArgs,
+ item.ItemId,
+ item.ItemName,
+ item.IGroupId,
+ item.ItemPrintName,
+ item.IUnitId,
+ item.ItemTagPrefix,
+ )
+ }
+ finalQuery := fmt.Sprintf(ItemMasterUpsertQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert for Item Master successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/item-tag-variation-details.func.go b/servers/jwelly/ecommerce-adapter/functions/item-tag-variation-details.func.go
new file mode 100644
index 0000000..34b920d
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/item-tag-variation-details.func.go
@@ -0,0 +1,137 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectItemTagVariationDetailsQuery = "SELECT td.TGDID, td.TSNO, td.INO, td.STAMPID, td.WT,td.EXWT,td.remarks, td.PC, td.RATE, td.SPRICE, td.UNITID FROM tgd1 as td join tgm1 as tg on td.tsno = tg.tsno where tg.vtgno != 0 and tg.STATUS != 'ITM' and tg.TPRE !='REP' ORDER BY td.TSNO LIMIT ? OFFSET ?;"
+const ServerItemTagVariationDetailsOfColumns = 11
+const ItemTagVariationDetailsUpsertQuery = `INSERT INTO ItemTagVariationDetails (itemTagDetailsId,dItemTagId,dItemId,dSTAMPID,dWeight,dExWeight,dFinalWeight,dRemarks,dPcs,dRate,dSaleValue,dUnitId) VALUES %s AS new_row ON DUPLICATE KEY UPDATE dItemTagId = new_row.dItemTagId,dItemId = new_row.dItemId,dSTAMPID = new_row.dSTAMPID,dWeight = new_row.dWeight,dExWeight = new_row.dExWeight,dFinalWeight = new_row.dFinalWeight,dRemarks = new_row.dRemarks,dPcs = new_row.dPcs,dRate = new_row.dRate,dSaleValue = new_row.dSaleValue,dUnitId = new_row.dUnitId;`
+
+func SyncItemTagVariationDetailsTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ batchSize := 1000 // You can change this to 2000 if your server handles it well
+ offset := 0
+ var totalRowsAffected int64 = 0
+
+ log.Println("Starting chunked sync for Item Tag Variations...")
+
+ for {
+ // Process a single batch
+ rowsFetched, rowsAffected, err := processItemTagVariationDetailsBatch(serverDb, erpDb, batchSize, offset)
+ if err != nil {
+ log.Printf("Sync halted due to error at offset %d: %v", offset, err)
+ break // Stop the loop on error, but keep the app alive
+ }
+
+ totalRowsAffected += rowsAffected
+
+ // If we fetched fewer rows than the batch size, we've reached the end of the table
+ if rowsFetched < batchSize {
+ break
+ }
+
+ // Move the offset forward for the next iteration
+ offset += batchSize
+ }
+
+ log.Printf("Sync completed successfully! Total Duration: %s | Total Rows Affected Metric: %d\n", time.Since(initialTime), totalRowsAffected)
+}
+
+func processItemTagVariationDetailsBatch(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct, limit int, offset int) (int, int64, error) {
+ startTime := time.Now()
+
+ // 1. Fetch chunk from ERP
+ rows, err := erpDb.Db.Query(SelectItemTagVariationDetailsQuery, limit, offset)
+ if err != nil {
+ return 0, 0, fmt.Errorf("failed reading from ERP (Limit: %d, Offset: %d): %w", limit, offset, err)
+ }
+ // CRITICAL: Ensure rows are closed immediately after this batch finishes
+ defer rows.Close()
+
+ var results []*ecommerce_maintables.ItemTagVariationDetails
+
+ for rows.Next() {
+ row := &ecommerce_maintables.ItemTagVariationDetails{}
+ err = rows.Scan(
+ &row.ItemTagDetailsId,
+ &row.DItemTagId,
+ &row.DItemId,
+ &row.DSTAMPID,
+ &row.DGrossWeight,
+ &row.DExWeight,
+ &row.DRemarks,
+ &row.DPcs,
+ &row.DRate,
+ &row.DSaleValue,
+ &row.DUnitId,
+ )
+ if err != nil {
+ return 0, 0, fmt.Errorf("row scan error: %w", err)
+ }
+
+ // Calculate the boolean status based on the string
+ row.DFinalWeight = row.DGrossWeight - row.DExWeight
+ results = append(results, row)
+ }
+
+ // Check for errors encountered during iteration
+ if err = rows.Err(); err != nil {
+ return 0, 0, fmt.Errorf("rows iteration error: %w", err)
+ }
+
+ fetchedCount := len(results)
+ if fetchedCount == 0 {
+ return 0, 0, nil // Nothing to process
+ }
+
+ // 2. Prepare chunk for bulk upsert
+ valueStrings := make([]string, 0, fetchedCount)
+ valueArgs := make([]any, 0, fetchedCount*ServerItemTagVariationDetailsOfColumns)
+
+ for _, detail := range results {
+ valueStrings = append(valueStrings, "(?,?,?,?,?,?,?,?,?,?,?,?)")
+ valueArgs = append(valueArgs,
+ detail.ItemTagDetailsId,
+ detail.DItemTagId,
+ detail.DItemId,
+ detail.DSTAMPID,
+ detail.DGrossWeight,
+ detail.DExWeight,
+ detail.DFinalWeight,
+ detail.DRemarks,
+ detail.DPcs,
+ detail.DRate,
+ detail.DSaleValue,
+ detail.DUnitId,
+ )
+ }
+
+ finalQuery := fmt.Sprintf(ItemTagVariationDetailsUpsertQuery, strings.Join(valueStrings, ", "))
+
+ // 3. Execute bulk upsert for this specific chunk
+ // Give each chunk a reasonable 10-second timeout to execute
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ return fetchedCount, 0, fmt.Errorf("bulk upsert failed: %w", err)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ return fetchedCount, 0, fmt.Errorf("could not get rows affected: %w", err)
+ }
+
+ log.Printf("Batch processed: %d rows fetched | %d rows affected | Duration: %s", fetchedCount, rowsAffected, time.Since(startTime))
+
+ return fetchedCount, rowsAffected, nil
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/item-tag-variation.func.go b/servers/jwelly/ecommerce-adapter/functions/item-tag-variation.func.go
new file mode 100644
index 0000000..b3f7c79
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/item-tag-variation.func.go
@@ -0,0 +1,141 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectItemTagVariationQuery = "SELECT tsno, STAMPID, GWT, LESSWT, WT, STATUS, TUNCH, WSTG, STUNCH, SWSTG, karigar FROM tgm1 where vtgno != 0 and STATUS != 'ITM' and TPRE !='REP' ORDER BY tsno LIMIT ? OFFSET ?;"
+const ServerItemTagVariationOfColumns = 11
+const ItemTagVariationUpsertQuery = `INSERT INTO ItemTagVariation (vTagId,vStampId,vGrossWt,vLessWeight,vNetWt,vStatus,vTunch,vWstg,vSellTunch,vSellWstg,vKarigarCode) VALUES %s AS new_row ON DUPLICATE KEY UPDATE vTagId = new_row.vTagId,vStampId = new_row.vStampId,vGrossWt = new_row.vGrossWt,vLessWeight = new_row.vLessWeight,vNetWt = new_row.vNetWt,vStatus = new_row.vStatus,vTunch = new_row.vTunch,vWstg = new_row.vWstg,vSellTunch = new_row.vSellTunch,vSellWstg = new_row.vSellWstg,vKarigarCode = new_row.vKarigarCode`
+
+func SyncItemTagVariationTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ batchSize := 1000 // You can change this to 2000 if your server handles it well
+ offset := 0
+ var totalRowsAffected int64 = 0
+
+ log.Println("Starting chunked sync for Item Tag Variations...")
+
+ for {
+ // Process a single batch
+ rowsFetched, rowsAffected, err := processItemTagVariationBatch(serverDb, erpDb, batchSize, offset)
+ if err != nil {
+ log.Printf("Sync halted due to error at offset %d: %v", offset, err)
+ break // Stop the loop on error, but keep the app alive
+ }
+
+ totalRowsAffected += rowsAffected
+
+ // If we fetched fewer rows than the batch size, we've reached the end of the table
+ if rowsFetched < batchSize {
+ break
+ }
+
+ // Move the offset forward for the next iteration
+ offset += batchSize
+ }
+
+ log.Printf("Sync completed successfully! Total Duration: %s | Total Rows Affected Metric: %d\n", time.Since(initialTime), totalRowsAffected)
+}
+
+func processItemTagVariationBatch(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct, limit int, offset int) (int, int64, error) {
+ startTime := time.Now()
+
+ // 1. Fetch chunk from ERP
+ rows, err := erpDb.Db.Query(SelectItemTagVariationQuery, limit, offset)
+ if err != nil {
+ return 0, 0, fmt.Errorf("failed reading from ERP (Limit: %d, Offset: %d): %w", limit, offset, err)
+ }
+ // CRITICAL: Ensure rows are closed immediately after this batch finishes
+ defer rows.Close()
+
+ var results []*ecommerce_maintables.TagVariationMainTable
+
+ for rows.Next() {
+ row := &ecommerce_maintables.TagVariationMainTable{}
+ err = rows.Scan(
+ &row.VTagId,
+ &row.VStampId,
+ &row.VGrossWt,
+ &row.VLessWeight,
+ &row.VNetWt,
+ &row.VStatusString,
+ &row.VTunch,
+ &row.VWstg,
+ &row.VSellTunch,
+ &row.VSellWstg,
+ &row.VKarigarCode,
+ )
+ if err != nil {
+ return 0, 0, fmt.Errorf("row scan error: %w", err)
+ }
+
+ // Calculate the boolean status based on the string
+ if row.VStatusString == "" || row.VStatusString == "AI" {
+ row.VStatus = true
+ } else {
+ row.VStatus = false
+ }
+
+ results = append(results, row)
+ }
+
+ // Check for errors encountered during iteration
+ if err = rows.Err(); err != nil {
+ return 0, 0, fmt.Errorf("rows iteration error: %w", err)
+ }
+
+ fetchedCount := len(results)
+ if fetchedCount == 0 {
+ return 0, 0, nil // Nothing to process
+ }
+
+ // 2. Prepare chunk for bulk upsert
+ valueStrings := make([]string, 0, fetchedCount)
+ valueArgs := make([]interface{}, 0, fetchedCount*ServerItemTagVariationOfColumns)
+
+ for _, variation := range results {
+ valueStrings = append(valueStrings, "(?,?,?,?,?,?,?,?,?,?,?)")
+ valueArgs = append(valueArgs,
+ variation.VTagId,
+ variation.VStampId,
+ variation.VGrossWt,
+ variation.VLessWeight,
+ variation.VNetWt,
+ variation.VStatus, // FIX: Inserting the calculated boolean, not the raw string
+ variation.VTunch,
+ variation.VWstg,
+ variation.VSellTunch,
+ variation.VSellWstg,
+ variation.VKarigarCode,
+ )
+ }
+
+ finalQuery := fmt.Sprintf(ItemTagVariationUpsertQuery, strings.Join(valueStrings, ", "))
+
+ // 3. Execute bulk upsert for this specific chunk
+ // Give each chunk a reasonable 10-second timeout to execute
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ return fetchedCount, 0, fmt.Errorf("bulk upsert failed: %w", err)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ return fetchedCount, 0, fmt.Errorf("could not get rows affected: %w", err)
+ }
+
+ log.Printf("Batch processed: %d rows fetched | %d rows affected | Duration: %s", fetchedCount, rowsAffected, time.Since(startTime))
+
+ return fetchedCount, rowsAffected, nil
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/item-tag.func.go b/servers/jwelly/ecommerce-adapter/functions/item-tag.func.go
new file mode 100644
index 0000000..9958846
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/item-tag.func.go
@@ -0,0 +1,70 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+// tsno,TGNO,vtgno,INO,TPRE,REMARKS,TDATE,ITRNID,GWT,LESSWT,WT,DIAWT,STNWT,GOLDWT,SILWT,PLATWT,OTHWT,LBR,LBR2,LBR3,SLBR,slbr2,SLBR3,STATUS,TUNCH,WSTG,STUNCH,SWSTG,BEEDS,SBEEDS,SOTHERS,othrem,design,DESINO,KACNO,karigar,MRATE,COSTRATE,GWT1,GWT2,SLBR2PC1,SLBR2PC2,STAMPID,flag,PHOTOPATH,size,QUALITY,COLOUR,CLARITY,POLISH,POLISHWT,SITEID,LOGIN,SETNO,ORDNO,DLESS,SLESS,LINKTGNO,LINKTSNO,ADDMRP,LAMT,DAMT,SAMT,MAMT,OTHERS,TAGFINE1,TAGFINE2,COSTDAMT,COSTSAMT,COSTMAMT,MRP,hm,certno,SPOLISH,SPOLISHWT,SWT,VONO,TNO,type,SDLESS,SSLESS,BILLTYPE,UNITID,PC,SALEMRP,JOBID,COSTTOTAL,COSTWSTG,GROSSFINE1,GROSSFINE2,FINE1,FINE2,TOTAL,pcrate,PPROFIT,UPFLAG,STKFINE1,STKFINE2,RATE,DAILY,TRALT,DIAWT1,DIAWT2,STNWT1,STNWT2,LAKHWT,BANFINE,SBANFINE,UPSTATUS,UPINFO,APPROVAL,DESIGNID,REPWT,LASTDATE,DIAPC,STNPC,MRP1,MRP2,COSTING1,COSTING2,MFLAG,SIZEID,GITRNID,diaremark,DOLLAR,DOLXRATE,PDIS,OLDSTATUS,LCODE,SHAPE,TVALUE,TRITRNID,UPTGNO,SVALUE,RFID,BATCH,COSTLAMT,OJOBID,OLINKTGNO,SDAMT,SSAMT,SLAMT,SMAMT,DIS,PKTWT,PKTLESS,ORGGWT,ORGTOTAL,OACNO,VTOTAL,TGMIDESC,SDIAWT,SSTNWT,TRSITEID,SAMPLE,SRTYPE,OAMT,POAMT,RLID,COSTAMT,OCDATE,TRLBR,TRLCODE,TRFLAG,TGCODE,stagfine1,stagfine2,pless,calmrp,gst,saleless,csmamt,grade,cslamt,srate,deldate,pgst,xtfld,cstdmamt
+// tsno,TGNO,vtgno,INO,TDATE,STAMPID
+const SelectItemTagQuery = "select tsno,TGNO,vtgno,INO,TDATE from tgm1 where vtgno != 0 and STATUS != 'ITM' and TPRE !='REP';"
+const ServerItemTagOfColumns = 5
+const ItemTagUpsertQuery = `INSERT INTO ItemsTag (itemTagId,itemTag,itemVTagId,tItemId,tagCreatedDate) VALUES %s AS new_row ON DUPLICATE KEY UPDATE itemVTagId = new_row.itemVTagId,tItemId = new_row.tItemId,tagCreatedDate = new_row.tagCreatedDate`
+
+func SyncItemTagTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectItemTagQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.ItemTagMainTable = []*ecommerce_maintables.ItemTagMainTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.ItemTagMainTable{}
+ err = rows.Scan(
+ &row.ItemTagId,
+ &row.ItemTag,
+ &row.ItemVTagId,
+ &row.TItemId,
+ &row.TagCreatedDate,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from Item Tag Main in Duration of %s\n", len(results), time.Since(startTime))
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*ServerItemTagOfColumns)
+
+ for _, tag := range results {
+ valueStrings = append(valueStrings, "(?,?,?,?,?)")
+ valueArgs = append(valueArgs,
+ tag.ItemTagId,
+ tag.ItemTag,
+ tag.ItemVTagId,
+ tag.TItemId,
+ tag.TagCreatedDate,
+ )
+ }
+ finalQuery := fmt.Sprintf(ItemTagUpsertQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert for Item Tag Main successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/item-trans.func.go b/servers/jwelly/ecommerce-adapter/functions/item-trans.func.go
new file mode 100644
index 0000000..66703ef
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/item-trans.func.go
@@ -0,0 +1,195 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectItemTransQuery = "SELECT ITRNID, TRNID, VONO, TNO, SNTRNID, TDATE, INO, REMARKS, GWT, WT, LESSWT, PC, rate, TUNCH, WSTG, MAMT, TYPE, STOCK, UNITID, STAMPID, SITEID, TVALUE, DAMT, SAMT, LAMT, BAMT, OTHERS, LBR, size, FINE1, TGNO, vtgno, TPRE, TSNO, ORGRATE, ORGGWT, ORGTOTAL, TOTAL, KACNO, karigar, metalwt FROM itrnview ORDER BY ITRNID LIMIT ? OFFSET ?;"
+const ItemTransactionColumns = 41
+const upsertItemTransPlaceHolder = "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
+
+const ItemTransUpsertQuery = `INSERT INTO ItemTransaction (itransId, trnId, vono, tno, snTranId, tdate, ino, remarks, gwt, wt, lesswt,pc, rate, tunch, wstg, mamt, type, stock, unitId, stampId, siteId, tValue,damt, samt, lamt, bamt, others, lbr, size, fine1, tgno, vtgno, tpre, tsno,orgRate, orgGwt, orgTotal, total, kacno, karigar, metalwt) VALUES %s AS new_row ON DUPLICATE KEY UPDATE trnId = new_row.trnId,vono = new_row.vono,tno = new_row.tno,snTranId = new_row.snTranId,tdate = new_row.tdate,ino = new_row.ino,remarks = new_row.remarks,gwt = new_row.gwt,wt = new_row.wt,lesswt = new_row.lesswt,pc = new_row.pc,rate = new_row.rate,tunch = new_row.tunch,wstg = new_row.wstg,mamt = new_row.mamt,type = new_row.type,stock = new_row.stock,unitId = new_row.unitId,stampId = new_row.stampId,siteId = new_row.siteId,tValue = new_row.tValue,damt = new_row.damt,samt = new_row.samt,lamt = new_row.lamt,bamt = new_row.bamt,others = new_row.others,lbr = new_row.lbr,size = new_row.size,fine1 = new_row.fine1,tgno = new_row.tgno,vtgno = new_row.vtgno,tpre = new_row.tpre,tsno = new_row.tsno,orgRate = new_row.orgRate,orgGwt = new_row.orgGwt,orgTotal = new_row.orgTotal,total = new_row.total,kacno = new_row.kacno,karigar = new_row.karigar,metalwt = new_row.metalwt;`
+
+func SyncItemTransTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ batchSize := 1000 // You can change this to 2000 if your server handles it well
+ offset := 0
+ var totalRowsAffected int64 = 0
+
+ log.Println("Starting chunked sync for Item Tag Variations...")
+
+ for {
+ // Process a single batch
+ rowsFetched, rowsAffected, err := processItemTransBatch(serverDb, erpDb, batchSize, offset)
+ if err != nil {
+ log.Printf("Sync halted due to error at offset %d: %v", offset, err)
+ break // Stop the loop on error, but keep the app alive
+ }
+
+ totalRowsAffected += rowsAffected
+
+ // If we fetched fewer rows than the batch size, we've reached the end of the table
+ if rowsFetched < batchSize {
+ break
+ }
+
+ // Move the offset forward for the next iteration
+ offset += batchSize
+ }
+
+ log.Printf("Sync completed successfully! Total Duration: %s | Total Rows Affected Metric: %d\n", time.Since(initialTime), totalRowsAffected)
+}
+
+func processItemTransBatch(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct, limit int, offset int) (int, int64, error) {
+ startTime := time.Now()
+
+ // 1. Fetch chunk from ERP
+ rows, err := erpDb.Db.Query(SelectItemTransQuery, limit, offset)
+ if err != nil {
+ return 0, 0, fmt.Errorf("failed reading from ERP (Limit: %d, Offset: %d): %w", limit, offset, err)
+ }
+ // CRITICAL: Ensure rows are closed immediately after this batch finishes
+ defer rows.Close()
+
+ var results []*ecommerce_maintables.ItemTransactionTable
+
+ for rows.Next() {
+ row := &ecommerce_maintables.ItemTransactionTable{}
+ err = rows.Scan(
+ &row.ItransId,
+ &row.TrnId,
+ &row.VONO,
+ &row.TNO,
+ &row.SNTranId,
+ &row.TDATE,
+ &row.INO,
+ &row.Remarks,
+ &row.GWT,
+ &row.WT,
+ &row.LESSWT,
+ &row.PC,
+ &row.Rate,
+ &row.TUNCH,
+ &row.WSTG,
+ &row.MAMT,
+ &row.TYPE,
+ &row.Stock,
+ &row.UnitId,
+ &row.StampId,
+ &row.SiteId,
+ &row.TValue,
+ &row.DAmt,
+ &row.SAmt,
+ &row.LAmt,
+ &row.BAmt,
+ &row.Others,
+ &row.LBR,
+ &row.Size,
+ &row.FINE1,
+ &row.TGNO,
+ &row.VTGNO,
+ &row.TPRE,
+ &row.TSNO,
+ &row.ORGRate,
+ &row.ORGGwt,
+ &row.ORGTotal,
+ &row.Total,
+ &row.KACNO,
+ &row.Karigar,
+ &row.Metalwt,
+ )
+ if err != nil {
+ return 0, 0, fmt.Errorf("row scan error: %w", err)
+ }
+ results = append(results, row)
+ }
+
+ // Check for errors encountered during iteration
+ if err = rows.Err(); err != nil {
+ return 0, 0, fmt.Errorf("rows iteration error: %w", err)
+ }
+
+ fetchedCount := len(results)
+ if fetchedCount == 0 {
+ return 0, 0, nil // Nothing to process
+ }
+
+ // 2. Prepare chunk for bulk upsert
+ valueStrings := make([]string, 0, fetchedCount)
+ valueArgs := make([]interface{}, 0, fetchedCount*ItemTransactionColumns)
+
+ for _, trans := range results {
+ valueStrings = append(valueStrings, upsertItemTransPlaceHolder)
+ valueArgs = append(valueArgs,
+ trans.ItransId,
+ trans.TrnId,
+ trans.VONO,
+ trans.TNO,
+ trans.SNTranId,
+ trans.TDATE,
+ trans.INO,
+ trans.Remarks,
+ trans.GWT,
+ trans.WT,
+ trans.LESSWT,
+ trans.PC,
+ trans.Rate,
+ trans.TUNCH,
+ trans.WSTG,
+ trans.MAMT,
+ trans.TYPE,
+ trans.Stock,
+ trans.UnitId,
+ trans.StampId,
+ trans.SiteId,
+ trans.TValue,
+ trans.DAmt,
+ trans.SAmt,
+ trans.LAmt,
+ trans.BAmt,
+ trans.Others,
+ trans.LBR,
+ trans.Size,
+ trans.FINE1,
+ trans.TGNO,
+ trans.VTGNO,
+ trans.TPRE,
+ trans.TSNO,
+ trans.ORGRate,
+ trans.ORGGwt,
+ trans.ORGTotal,
+ trans.Total,
+ trans.KACNO,
+ trans.Karigar,
+ trans.Metalwt,
+ )
+ }
+
+ finalQuery := fmt.Sprintf(ItemTransUpsertQuery, strings.Join(valueStrings, ", "))
+
+ // 3. Execute bulk upsert for this specific chunk
+ // Give each chunk a reasonable 10-second timeout to execute
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ return fetchedCount, 0, fmt.Errorf("bulk upsert failed: %w", err)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ return fetchedCount, 0, fmt.Errorf("could not get rows affected: %w", err)
+ }
+
+ log.Printf("Batch processed: %d rows fetched | %d rows affected | Duration: %s", fetchedCount, rowsAffected, time.Since(startTime))
+
+ return fetchedCount, rowsAffected, nil
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/site-table.func.go b/servers/jwelly/ecommerce-adapter/functions/site-table.func.go
new file mode 100644
index 0000000..e46ac3c
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/site-table.func.go
@@ -0,0 +1,66 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectSiteQuery = "select SITEID,SITE,`PATH`,PREFIX from `site`;"
+const ServerSiteOfColumns = 4
+const upsertSitePlaceHolder = "(?, ?, ?, ?)"
+const SiteUpsertQuery = `INSERT INTO Site (siteId, siteName, siteAddress, sPrefix) VALUES %s AS new_row ON DUPLICATE KEY UPDATE siteName = new_row.siteName,siteAddress = new_row.siteAddress,sPrefix = new_row.sPrefix;`
+
+func SyncSiteTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectSiteQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.SiteTable = []*ecommerce_maintables.SiteTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.SiteTable{}
+ err = rows.Scan(
+ &row.SiteId,
+ &row.SiteName,
+ &row.SiteAddress,
+ &row.SPrefix,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from Site in Duration of %s\n", len(results), time.Since(startTime))
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*ServerSiteOfColumns)
+ for _, site := range results {
+ valueStrings = append(valueStrings, upsertSitePlaceHolder)
+ valueArgs = append(valueArgs,
+ site.SiteId,
+ site.SiteName,
+ site.SiteAddress,
+ site.SPrefix,
+ )
+ }
+ finalQuery := fmt.Sprintf(SiteUpsertQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert for Site successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/stamp.func.go b/servers/jwelly/ecommerce-adapter/functions/stamp.func.go
new file mode 100644
index 0000000..9fd7204
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/stamp.func.go
@@ -0,0 +1,65 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectStampQuery = "select STAMPID,STAMP,STUNCH,STKTUNCH from stamp;"
+const ServerStampOfColumns = 4
+const StampUpsertQuery = `INSERT INTO Stamp (stampId,STAMP,tunch,stockTunch) VALUES %s AS new_row ON DUPLICATE KEY UPDATE stampId=new_row.stampId,STAMP=new_row.STAMP,tunch=new_row.tunch,stockTunch=new_row.stockTunch`
+
+func SyncStampTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectStampQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.StampMainTable = []*ecommerce_maintables.StampMainTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.StampMainTable{}
+ err = rows.Scan(
+ &row.StampId,
+ &row.Stamp,
+ &row.Tunch,
+ &row.StockTunch,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from Stamp in Duration of %s\n", len(results), time.Since(startTime))
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*ServerStampOfColumns)
+ for _, stamp := range results {
+ valueStrings = append(valueStrings, "(?, ?, ? ,?)")
+ valueArgs = append(valueArgs,
+ stamp.StampId,
+ stamp.Stamp,
+ stamp.Tunch,
+ stamp.StockTunch,
+ )
+ }
+ finalQuery := fmt.Sprintf(StampUpsertQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert for Stamp successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/functions/unit-table.func.go b/servers/jwelly/ecommerce-adapter/functions/unit-table.func.go
new file mode 100644
index 0000000..cd1e648
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/functions/unit-table.func.go
@@ -0,0 +1,61 @@
+package ecommerce_functions
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "strings"
+ "time"
+
+ ecommerce_maintables "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/interfaces/MainTables"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+)
+
+const SelectUnitTableQuery = "select UNITID,UNIT,`DECIMAL` from units;"
+const ServerUnitTable = "ItemUnit"
+const UniTableNumberOfColumns = 3
+const UpsertUnitTableQuery = `INSERT INTO ItemUnit (itemUnitId, itemUnit, itemDecimal) VALUES %s AS new_row ON DUPLICATE KEY UPDATE itemUnit = new_row.itemUnit, itemDecimal = new_row.itemDecimal`
+
+func SyncItemUnitTable(serverDb *mysqldb.MysqlDBStruct, erpDb *mysqldb.MysqlDBStruct) {
+ initialTime := time.Now()
+ startTime := initialTime
+ rows, err := erpDb.Db.Query(SelectUnitTableQuery)
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ if err != nil {
+ log.Printf("Error in Reading Unit From Server")
+ log.Println(err.Error())
+ return
+ }
+ var results []*ecommerce_maintables.ItemUnitMainTable = []*ecommerce_maintables.ItemUnitMainTable{}
+ for rows.Next() {
+ row := &ecommerce_maintables.ItemUnitMainTable{}
+ err = rows.Scan(
+ &row.ItemUnitId,
+ &row.ItemUnit,
+ &row.ItemDecimal,
+ )
+ results = append(results, row)
+ }
+ log.Printf("Fetched Total %d rows from Units in Duration of %s\n", len(results), time.Since(startTime))
+
+ valueStrings := make([]string, 0, len(results))
+ valueArgs := make([]interface{}, 0, len(results)*UniTableNumberOfColumns)
+ for _, unit := range results {
+ valueStrings = append(valueStrings, "(?, ?, ?)")
+ valueArgs = append(valueArgs, unit.ItemUnitId, unit.ItemUnit, unit.ItemDecimal)
+ }
+ finalQuery := fmt.Sprintf(UpsertUnitTableQuery, strings.Join(valueStrings, ", "))
+ result, err := serverDb.Db.ExecContext(ctx, finalQuery, valueArgs...)
+ if err != nil {
+ log.Fatalf("Bulk upsert failed: %v", err)
+ log.Fatalf("Query : %s", finalQuery)
+ }
+
+ rowsAffected, err := result.RowsAffected()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("Bulk upsert successful! Rows affected metric: %d\n", rowsAffected)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/acc-group-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/acc-group-table.type.go
new file mode 100644
index 0000000..1ec88a5
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/acc-group-table.type.go
@@ -0,0 +1,8 @@
+package ecommerce_maintables
+
+type AccountGroupTable struct {
+ GroupId int `json:"groupId"`
+ GroupName string `json:"groupName"`
+ UnderId int `json:"underId"`
+ GType string `json:"gType"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/accmast-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/accmast-table.type.go
new file mode 100644
index 0000000..5928c08
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/accmast-table.type.go
@@ -0,0 +1,13 @@
+package ecommerce_maintables
+
+type AccountMasterTable struct {
+ Acno int `json:"acno"`
+ Prefix string `json:"prefix"`
+ Name string `json:"Name"`
+ PName string `json:"pName"`
+ AGroupId int `json:"aGroupId"`
+ City string `json:"city"`
+ Location string `json:"location"`
+ Mobile string `json:"mobile"`
+ Phone string `json:"phone"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-group-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-group-table.type.go
new file mode 100644
index 0000000..09a73db
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-group-table.type.go
@@ -0,0 +1,8 @@
+package ecommerce_maintables
+
+type ItemGroupMainTable struct {
+ ItemGroupId int `json:"itemGroupId"`
+ ItemGroup string `json:"itemGroup"`
+ ItemPrintName string `json:"itemPrintName"`
+ ItemUnitId int `json:"itemUnitId"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-mast-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-mast-table.type.go
new file mode 100644
index 0000000..b2102f5
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-mast-table.type.go
@@ -0,0 +1,10 @@
+package ecommerce_maintables
+
+type ItemMasterTable struct {
+ ItemId int `json:"itemId"`
+ ItemName string `json:"itemName"`
+ IGroupId int `json:"iGroupId"`
+ ItemPrintName string `json:"itemPrintName"`
+ IUnitId int `json:"iUnitId"`
+ ItemTagPrefix string `json:"itemTagPrefix"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-tag-details-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-tag-details-table.type.go
new file mode 100644
index 0000000..e737457
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-tag-details-table.type.go
@@ -0,0 +1,16 @@
+package ecommerce_maintables
+
+type ItemTagVariationDetails struct {
+ ItemTagDetailsId int `json:"itemTagDetailsId"`
+ DItemTagId int `json:"dItemTagId"`
+ DItemId int `json:"dItemId"`
+ DSTAMPID int `json:"dSTAMPID"`
+ DGrossWeight float64 `json:"dWeight"`
+ DExWeight float64 `json:"dExWeight"`
+ DFinalWeight float64 `json:"dFinalWeight"`
+ DRemarks string `json:"dRemarks"`
+ DPcs int `json:"dPcs"`
+ DRate float64 `json:"dRate"`
+ DSaleValue float64 `json:"dSaleValue"`
+ DUnitId int `json:"dUnitId"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-tag-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-tag-table.type.go
new file mode 100644
index 0000000..2dcebaf
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-tag-table.type.go
@@ -0,0 +1,11 @@
+package ecommerce_maintables
+
+import "time"
+
+type ItemTagMainTable struct {
+ ItemTagId int `json:"itemTagId"`
+ ItemTag string `json:"itemTag"`
+ ItemVTagId int `json:"itemVTagId"`
+ TItemId int `json:"tItemId"`
+ TagCreatedDate time.Time `json:"tagCreatedDate"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-units-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-units-table.type.go
new file mode 100644
index 0000000..61ed545
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-units-table.type.go
@@ -0,0 +1,7 @@
+package ecommerce_maintables
+
+type ItemUnitMainTable struct {
+ ItemUnitId int `json:"itemUnitId"`
+ ItemUnit string `json:"itemUnit"`
+ ItemDecimal int `json:"itemDecimal"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-variation-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-variation-table.type.go
new file mode 100644
index 0000000..9ea41bc
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/item-variation-table.type.go
@@ -0,0 +1,19 @@
+package ecommerce_maintables
+
+import mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+
+type TagVariationMainTable struct {
+ VStatusString string `json:"-"`
+ TagVariationId int `json:"tagVariationId"`
+ VTagId int `json:"vTagId"`
+ VStampId int `json:"vStampId"`
+ VGrossWt float64 `json:"vGrossWt"`
+ VLessWeight float64 `json:"vLessWeight"`
+ VNetWt float64 `json:"vNetWt"`
+ VStatus mysqldb.BitBool `json:"vStatus"`
+ VTunch float64 `json:"vTunch"`
+ VWstg float64 `json:"vWstg"`
+ VSellTunch float64 `json:"vSellTunch"`
+ VSellWstg float64 `json:"vSellWstg"`
+ VKarigarCode string `json:"vKarigarCode"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/itm-trans-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/itm-trans-table.type.go
new file mode 100644
index 0000000..8b74331
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/itm-trans-table.type.go
@@ -0,0 +1,47 @@
+package ecommerce_maintables
+
+import "time"
+
+type ItemTransactionTable struct {
+ ItransId int `json:"itransId"`
+ TrnId int `json:"trnId"`
+ VONO int `json:"vono"`
+ TNO int `json:"tno"`
+ SNTranId int `json:"snTranId"`
+ TDATE time.Time `json:"tdate"`
+ INO int `json:"ino"`
+ Remarks string `json:"remarks"`
+ GWT float64 `json:"gwt"`
+ WT float64 `json:"wt"`
+ LESSWT float64 `json:"lesswt"`
+ PC int `json:"pc"`
+ Rate float64 `json:"rate"`
+ TUNCH float64 `json:"tunch"`
+ WSTG float64 `json:"wstg"`
+ MAMT float64 `json:"mamt"`
+ TYPE string `json:"type"`
+ Stock string `json:"stock"`
+ UnitId string `json:"unitId"`
+ StampId string `json:"stampId"`
+ SiteId string `json:"siteId"`
+ TValue float64 `json:"tValue"`
+ DAmt float64 `json:"damt"`
+ SAmt float64 `json:"samt"`
+ LAmt float64 `json:"lamt"`
+ BAmt float64 `json:"bamt"`
+ Others float64 `json:"others"`
+ LBR float64 `json:"lbr"`
+ Size string `json:"size"`
+ FINE1 float64 `json:"fine1"`
+ TGNO string `json:"tgno"`
+ VTGNO int `json:"vtgno"`
+ TPRE string `json:"tpre"`
+ TSNO int `json:"tsno"`
+ ORGRate float64 `json:"orgRate"`
+ ORGGwt float64 `json:"orgGwt"`
+ ORGTotal float64 `json:"orgTotal"`
+ Total float64 `json:"total"`
+ KACNO int `json:"kacno"`
+ Karigar string `json:"karigar"`
+ Metalwt float64 `json:"metalwt"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/site-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/site-table.type.go
new file mode 100644
index 0000000..3c6116d
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/site-table.type.go
@@ -0,0 +1,8 @@
+package ecommerce_maintables
+
+type SiteTable struct {
+ SiteId int `json:"siteId"`
+ SiteName string `json:"siteName"`
+ SiteAddress string `json:"siteAddress"`
+ SPrefix string `json:"sPrefix"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/MainTables/stamp-table.type.go b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/stamp-table.type.go
new file mode 100644
index 0000000..32a39f5
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/MainTables/stamp-table.type.go
@@ -0,0 +1,9 @@
+package ecommerce_maintables
+
+type StampMainTable struct {
+ StampId int `json:"stampId"`
+ Stamp string `json:"STAMP"`
+ Tunch float64 `json:"tunch"`
+ StockTunch float64 `json:"stockTunch"`
+ SellTunch float64 `json:"sellTunch"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/interfaces/Req-token.interface.go b/servers/jwelly/ecommerce-adapter/interfaces/Req-token.interface.go
new file mode 100644
index 0000000..d7dca18
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/interfaces/Req-token.interface.go
@@ -0,0 +1,5 @@
+package ecommerce_interfaces
+
+type ReqTokenInterface struct {
+ // . Token string `json:"token"`
+}
diff --git a/servers/jwelly/ecommerce-adapter/main.go b/servers/jwelly/ecommerce-adapter/main.go
new file mode 100644
index 0000000..159a11b
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/main.go
@@ -0,0 +1,83 @@
+package main
+
+import (
+ "log"
+
+ "github.com/gofiber/fiber/v3"
+ "github.com/gofiber/fiber/v3/middleware/logger"
+ "github.com/robfig/cron/v3"
+ "github.com/rpsoftech/golang-servers/interfaces"
+ ecommerce_env "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/env"
+ ecommerce_sync "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/sync-func"
+ mysqldb "github.com/rpsoftech/golang-servers/utility/mysql"
+ "github.com/rpsoftech/golang-servers/utility/redis"
+)
+
+func deferMainFunc() {
+ println("Closing...")
+ redis.DeferFunction()
+}
+
+// main function is the entry point of the program
+func main() {
+ defer deferMainFunc()
+ // Initialize the MySQL connections
+ InitializeMysqlConnections()
+ // Create a new cron scheduler
+ cronTab := cron.New()
+ // Add functions to the cron scheduler
+ // Account Sync function will be executed every 5 minutes
+ cronTab.AddFunc(ecommerce_env.ServerConfig.AccountTableSyncCron, ecommerce_sync.AccountSync)
+ // Basic Details Sync function will be executed every 10 minutes
+ cronTab.AddFunc(ecommerce_env.ServerConfig.BasicDetailsSyncCron, ecommerce_sync.BasicDetailsSync)
+ // Item Details and Tags Sync function will be executed every 15 minutes
+ cronTab.AddFunc(ecommerce_env.ServerConfig.ItemTagDetailsSyncCron, ecommerce_sync.ItemDetailsTagsSync)
+
+ // Start the cron scheduler
+ log.Printf("Starting the cron scheduler...")
+ cronTab.Start()
+
+ // Log a message when the cron scheduler is done starting
+ log.Printf("DONE")
+}
+
+// Initialize the MySQL connections
+func InitializeMysqlConnections() {
+ config := ecommerce_env.Init()
+
+ if conn, err := mysqldb.InitializeMysqlDbWithConfig(config.ServerDatabase); err != nil {
+ log.Fatal("Error initializing MySQL connection:", err)
+ panic(err)
+ } else {
+ ecommerce_env.MysqlConnections.Server = conn
+ }
+
+ if conn, err := mysqldb.InitializeMysqlDbWithConfig(config.ErpDatabase); err != nil {
+ log.Fatal("Error initializing ERP MySQL connection:", err)
+ panic(err)
+ } else {
+ ecommerce_env.MysqlConnections.ERP = conn
+ }
+}
+
+func ApiServer() {
+ app := fiber.New(fiber.Config{
+ ServerHeader: "Bullion Server V1.0.0",
+ ErrorHandler: func(c fiber.Ctx, err error) error {
+ mappedError, ok := err.(*interfaces.RequestError)
+ if !ok {
+ println(err.Error())
+ return c.Status(500).JSON(interfaces.RequestError{
+ Code: interfaces.ERROR_INTERNAL_SERVER,
+ Message: "Some Internal Error",
+ Name: "Global Error Handler Function",
+ })
+ }
+ if mappedError.LogTheDetails {
+ //Todo: Store The Details Of the Error With Body And Other Extra Details Like AUTH KEY AND ETC
+ }
+ return c.Status(mappedError.StatusCode).JSON(mappedError)
+ },
+ })
+ app.Use(logger.New())
+}
diff --git a/servers/jwelly/ecommerce-adapter/middleware/role-checker.middleware.go b/servers/jwelly/ecommerce-adapter/middleware/role-checker.middleware.go
new file mode 100644
index 0000000..1ded1af
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/middleware/role-checker.middleware.go
@@ -0,0 +1,86 @@
+package ecommerce_middleware
+
+import (
+ "fmt"
+ "slices"
+
+ "github.com/gofiber/fiber/v2"
+ "github.com/rpsoftech/golang-servers/interfaces"
+ bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces"
+)
+
+type roleCheckerMiddlewareWithRolesArray struct {
+ roles []string
+}
+
+var (
+ allUserRoles = []string{
+ bullion_main_server_interfaces.ROLE_RATE_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_SUPER_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_GOD.String(),
+ bullion_main_server_interfaces.ROLE_GENERAL_USER.String(),
+ bullion_main_server_interfaces.ROLE_TRADE_USER.String(),
+ }
+
+ AllowAllUsers = &roleCheckerMiddlewareWithRolesArray{
+ roles: allUserRoles,
+ }
+ AllowAllAdminsAndTradeUsers = &roleCheckerMiddlewareWithRolesArray{
+ roles: []string{
+ bullion_main_server_interfaces.ROLE_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_RATE_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_SUPER_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_GOD.String(),
+ bullion_main_server_interfaces.ROLE_TRADE_USER.String(),
+ },
+ }
+ AllowAllAdmins = &roleCheckerMiddlewareWithRolesArray{
+ roles: []string{
+ bullion_main_server_interfaces.ROLE_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_RATE_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_SUPER_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_GOD.String(),
+ },
+ }
+ AllowOnlyBigAdmins = &roleCheckerMiddlewareWithRolesArray{
+ roles: []string{
+ bullion_main_server_interfaces.ROLE_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_SUPER_ADMIN.String(),
+ bullion_main_server_interfaces.ROLE_GOD.String(),
+ },
+ }
+)
+
+func (cc *roleCheckerMiddlewareWithRolesArray) Validate(c *fiber.Ctx) error {
+ roleFromLocal := c.Locals(bullion_main_server_interfaces.REQ_LOCAL_KEY_ROLE)
+ if roleFromLocal == nil {
+ return &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_TOKEN_ROLE_NOT_FOUND,
+ Message: "Invalid Token Role Or Not Found",
+ Name: "INVALID_TOKEN_ROLE",
+ }
+ }
+ role, ok := roleFromLocal.(string)
+ if !ok {
+ return &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_ROLE_NOT_EXISTS,
+ Message: "Token Role Should be string",
+ Name: "INVALID_TOKEN_ROLE_FORMAT",
+ }
+ }
+ if role == string(bullion_main_server_interfaces.ROLE_GOD) {
+ return c.Next()
+ }
+ if !slices.Contains(cc.roles, role) {
+ return &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_ROLE_NOT_AUTHORIZED,
+ Message: fmt.Sprintf("%s is not allowed for this route", role),
+ Name: "INVALID_TOKEN_ROLE_FORMAT",
+ }
+ }
+ return c.Next()
+}
diff --git a/servers/jwelly/ecommerce-adapter/middleware/token-validator.middleware.go b/servers/jwelly/ecommerce-adapter/middleware/token-validator.middleware.go
new file mode 100644
index 0000000..99f6e20
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/middleware/token-validator.middleware.go
@@ -0,0 +1,106 @@
+package ecommerce_middleware
+
+import (
+ "net/http"
+
+ "github.com/gofiber/fiber/v2"
+ "github.com/rpsoftech/golang-servers/env"
+ "github.com/rpsoftech/golang-servers/interfaces"
+ bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces"
+ bullion_main_server_services "github.com/rpsoftech/golang-servers/servers/bullion/main-server/services"
+ utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
+)
+
+// fiber middleware for jwt
+func TokenDecrypter(c *fiber.Ctx) error {
+ reqHeaders := c.GetReqHeaders()
+ tokenString, foundToken := reqHeaders[env.RequestTokenHeaderKey]
+ if !foundToken || len(tokenString) != 1 || tokenString[0] == "" {
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_ERROR_KEY, &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_TOKEN_NOT_BEFORE,
+ Message: "Please Pass Valid Token",
+ Name: "ERROR_TOKEN_NOT_BEFORE",
+ })
+ return c.Next()
+ }
+ // userRolesCustomClaim, localErr := .VerifyToken(tokenString[0])
+ // jwt.VerifyToken[bullion_main_server_interfaces.GeneralUserAccessRefreshToken](bullion_main_server_services.AccessTokenService, &tokenString[0])
+ userRolesCustomClaim, localErr := bullion_main_server_services.ValidateGeneralUserAccessToken(bullion_main_server_services.AccessTokenService, &tokenString[0])
+ if localErr != nil {
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_ERROR_KEY, localErr)
+ return c.Next()
+ }
+ if e := utility_functions.ValidateStructAndReturnReqError(userRolesCustomClaim, &interfaces.RequestError{
+ StatusCode: 401,
+ Code: interfaces.ERROR_INVALID_TOKEN_SIGNATURE,
+ Message: "Invalid Token Structure",
+ Name: "ERROR_INVALID_TOKEN_SIGNATURE",
+ }); e != nil {
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_ERROR_KEY, e)
+ return c.Next()
+ }
+ role := userRolesCustomClaim.Role.String()
+ if !bullion_main_server_interfaces.ValidateEnumUserRole(role) {
+
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_ERROR_KEY, &interfaces.RequestError{
+ StatusCode: http.StatusBadRequest,
+ Code: interfaces.ERROR_TOKEN_ROLE_NOT_FOUND,
+ Message: "Invalid Token Role Or Not Found",
+ Name: "INVALID_TOKEN_ROLE",
+ })
+ return c.Next()
+ }
+
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_KEY_ROLE, role)
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_KEY_TOKEN_RAW_DATA, userRolesCustomClaim)
+ return c.Next()
+}
+
+func AllowOnlyValidTokenMiddleWare(c *fiber.Ctx) error {
+ jwtRawFromLocal := c.Locals(bullion_main_server_interfaces.REQ_LOCAL_KEY_TOKEN_RAW_DATA)
+ localError := c.Locals(bullion_main_server_interfaces.REQ_LOCAL_ERROR_KEY)
+
+ if jwtRawFromLocal == nil {
+ if localError != nil {
+ err, ok := localError.(*interfaces.RequestError)
+ if !ok {
+ return &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_TOKEN_EXPIRED,
+ Message: "Cannot Cast Error Token",
+ Name: "NOT_VALID_DECRYPTED_TOKEN",
+ }
+ }
+ return err
+ }
+ return &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_TOKEN_EXPIRED,
+ Message: "Invalid Token or token expired",
+ Name: "NOT_VALID_DECRYPTED_TOKEN",
+ }
+ }
+
+ jwtRaw, ok := jwtRawFromLocal.(*bullion_main_server_interfaces.GeneralUserAccessRefreshToken)
+ if !ok {
+ return &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_TOKEN_EXPIRED,
+ Message: "Invalid Token or token expired",
+ Name: "NOT_VALID_DECRYPTED_TOKEN",
+ }
+ }
+ if jwtRaw.BullionId == "" {
+ return &interfaces.RequestError{
+ StatusCode: 403,
+ Code: interfaces.ERROR_INVALID_TOKEN,
+ Message: "Invalid Bullion Id in Token",
+ Name: "INVALID_BULLION_ID_IN_TOKEN",
+ }
+ }
+
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_UserID, jwtRaw.UserId)
+ c.Locals(bullion_main_server_interfaces.REQ_LOCAL_BullionId_KEY, jwtRaw.BullionId)
+ return c.Next()
+}
diff --git a/servers/jwelly/ecommerce-adapter/services/access-refresh-token.service.go b/servers/jwelly/ecommerce-adapter/services/access-refresh-token.service.go
new file mode 100644
index 0000000..5c1df37
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/services/access-refresh-token.service.go
@@ -0,0 +1,43 @@
+package ecommerce_services
+
+import (
+ "github.com/gofiber/fiber/v3/log"
+ jwtv5 "github.com/golang-jwt/jwt/v5"
+ "github.com/rpsoftech/golang-servers/interfaces"
+ ecommerce_env "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/env"
+ soham_common_req_keys "github.com/rpsoftech/golang-servers/servers/soham/common"
+ "github.com/rpsoftech/golang-servers/utility/jwt"
+)
+
+var AccessTokenService *jwt.TokenService
+var RefreshTokenService *jwt.TokenService
+
+func GetAccessTokenService() *jwt.TokenService {
+ if AccessTokenService == nil {
+ AccessTokenService = &jwt.TokenService{
+ SigningKey: []byte(ecommerce_env.Env.ACCESS_TOKEN_KEY),
+ Parser: jwtv5.NewParser(jwtv5.WithValidMethods([]string{"HS256"})),
+ }
+ log.Info("Token Service Initialized")
+ }
+ return AccessTokenService
+}
+
+func ValidateUserRequestToken(t *jwt.TokenService, token *string) (*soham_common_req_keys.ReqTokenType, error) {
+ claimRaw, err := t.Parser.ParseWithClaims(*token, &soham_common_req_keys.ReqTokenType{}, t.Keyfunc)
+ if err != nil {
+ return nil, err
+ }
+ claim, ok := claimRaw.Claims.(*soham_common_req_keys.ReqTokenType)
+ if !ok {
+ err = &interfaces.RequestError{
+ StatusCode: 401,
+ Code: interfaces.ERROR_INVALID_TOKEN,
+ Message: "Error InValid Token Body",
+ Name: "ERROR_INVALID_TOKEN_BODY",
+ Extra: err,
+ }
+ return nil, err
+ }
+ return claim, nil
+}
diff --git a/servers/jwelly/ecommerce-adapter/sync-func/accounts.sync.go b/servers/jwelly/ecommerce-adapter/sync-func/accounts.sync.go
new file mode 100644
index 0000000..4d7ffef
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/sync-func/accounts.sync.go
@@ -0,0 +1,11 @@
+package ecommerce_sync
+
+import (
+ ecommerce_env "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/env"
+ ecommerce_functions "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/functions"
+)
+
+func AccountSync() {
+ ecommerce_functions.SyncAccountGroupTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncAccountMasterTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+}
diff --git a/servers/jwelly/ecommerce-adapter/sync-func/basic.details.sync.go b/servers/jwelly/ecommerce-adapter/sync-func/basic.details.sync.go
new file mode 100644
index 0000000..5ec7c76
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/sync-func/basic.details.sync.go
@@ -0,0 +1,15 @@
+package ecommerce_sync
+
+import (
+ ecommerce_env "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/env"
+ ecommerce_functions "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/functions"
+)
+
+func BasicDetailsSync() {
+ ecommerce_functions.SyncSiteTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncItemUnitTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncItemGroupTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncItemMasterTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncStampTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+
+}
diff --git a/servers/jwelly/ecommerce-adapter/sync-func/item-tag-details.sync.go b/servers/jwelly/ecommerce-adapter/sync-func/item-tag-details.sync.go
new file mode 100644
index 0000000..9f09f0b
--- /dev/null
+++ b/servers/jwelly/ecommerce-adapter/sync-func/item-tag-details.sync.go
@@ -0,0 +1,14 @@
+package ecommerce_sync
+
+import (
+ ecommerce_env "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/env"
+ ecommerce_functions "github.com/rpsoftech/golang-servers/servers/jwelly/ecommerce-adapter/functions"
+)
+
+func ItemDetailsTagsSync() {
+ ecommerce_functions.SyncItemTagTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncItemTagVariationTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncItemTagVariationDetailsTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+ ecommerce_functions.SyncItemTransTable(ecommerce_env.MysqlConnections.Server, ecommerce_env.MysqlConnections.ERP)
+
+}
diff --git a/servers/jwelly/main-server/main.go b/servers/jwelly/main-server/main.go
index b5aa577..0e2d75a 100644
--- a/servers/jwelly/main-server/main.go
+++ b/servers/jwelly/main-server/main.go
@@ -76,7 +76,7 @@ func main() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := "[::]"
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
// Print the router stack in JSON format
diff --git a/servers/jwelly/main-server/repos/key-value-data.repo.go b/servers/jwelly/main-server/repos/key-value-data.repo.go
index 41527aa..827a275 100644
--- a/servers/jwelly/main-server/repos/key-value-data.repo.go
+++ b/servers/jwelly/main-server/repos/key-value-data.repo.go
@@ -26,7 +26,7 @@ const keyValueDataCollectionName = "KeyValue"
var KeyValueDataRepo *KeyValueDataRepoStruct
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
coll := mongodb.MongoDatabase.Collection(keyValueDataCollectionName)
diff --git a/servers/jwelly/mysql-backup-cmd/env/keys.go b/servers/jwelly/mysql-backup-cmd/env/keys.go
index f158f0d..320b17c 100644
--- a/servers/jwelly/mysql-backup-cmd/env/keys.go
+++ b/servers/jwelly/mysql-backup-cmd/env/keys.go
@@ -1,5 +1,5 @@
package mysql_backup_env
-const ConfigFileName = "CONFGI_FILE_NAME"
+const ConfigFileName = "CONFIG_FILE_NAME"
// const RefreshDatabase = "REFRESH_DATABASE"
diff --git a/servers/jwelly/mysql-backup-cmd/interfaces/connectino.go b/servers/jwelly/mysql-backup-cmd/interfaces/connectino.go
index 4a82172..33d32e2 100644
--- a/servers/jwelly/mysql-backup-cmd/interfaces/connectino.go
+++ b/servers/jwelly/mysql-backup-cmd/interfaces/connectino.go
@@ -24,7 +24,7 @@ type ConfigWithConnection struct {
}
func ValidateAllConnectionsAndAssign(c *ConfigWithConnection) error {
- if mysqlDb, err := mysqldb.InitalizeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
+ if mysqlDb, err := mysqldb.InitializeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
return err
} else {
c.BaseDir = filepath.Join(coreEnv.FindAndReturnCurrentDir(), "backup", c.ServerConfig.Name)
diff --git a/servers/jwelly/mysql-backup-cmd/main.go b/servers/jwelly/mysql-backup-cmd/main.go
index 8c01337..587f33e 100644
--- a/servers/jwelly/mysql-backup-cmd/main.go
+++ b/servers/jwelly/mysql-backup-cmd/main.go
@@ -36,7 +36,7 @@ func main() {
for _, v := range env.ConnectionConfig.ServerConfig {
cccc := &interfaces.ConfigWithConnection{ServerConfig: &v}
if err := interfaces.ValidateAllConnectionsAndAssign(cccc); err != nil {
- fmt.Printf("Error In Validating Connectino %s", v.Name)
+ fmt.Printf("Error In Validating Connection %s", v.Name)
println(err.Error())
}
if env.ServerEnv.IsDev && env.ServerEnv.Env.APP_ENV == coreEnv.APP_ENV_LOCAL {
diff --git a/servers/jwelly/mysql-backup/env/keys.go b/servers/jwelly/mysql-backup/env/keys.go
index f158f0d..320b17c 100644
--- a/servers/jwelly/mysql-backup/env/keys.go
+++ b/servers/jwelly/mysql-backup/env/keys.go
@@ -1,5 +1,5 @@
package mysql_backup_env
-const ConfigFileName = "CONFGI_FILE_NAME"
+const ConfigFileName = "CONFIG_FILE_NAME"
// const RefreshDatabase = "REFRESH_DATABASE"
diff --git a/servers/jwelly/mysql-backup/env_example b/servers/jwelly/mysql-backup/env_example
index 4cfa36a..e35116a 100644
--- a/servers/jwelly/mysql-backup/env_example
+++ b/servers/jwelly/mysql-backup/env_example
@@ -1,2 +1,2 @@
APP_ENV="LOCAL"
-CONFGI_FILE_NAME="server.config.json"
\ No newline at end of file
+CONFIG_FILE_NAME="server.config.json"
\ No newline at end of file
diff --git a/servers/jwelly/mysql-backup/interfaces/connectino.go b/servers/jwelly/mysql-backup/interfaces/connectino.go
index 4228366..47c3463 100644
--- a/servers/jwelly/mysql-backup/interfaces/connectino.go
+++ b/servers/jwelly/mysql-backup/interfaces/connectino.go
@@ -23,7 +23,7 @@ type ConfigWithConnection struct {
}
func ValidateAllConnectionsAndAssign(c *ConfigWithConnection) error {
- if mysqlDb, err := mysqldb.InitalizeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
+ if mysqlDb, err := mysqldb.InitializeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
return err
} else {
// mysqlDb.Db.Close()
diff --git a/servers/jwelly/mysql-backup/main.go b/servers/jwelly/mysql-backup/main.go
index 2b67790..e762cb3 100644
--- a/servers/jwelly/mysql-backup/main.go
+++ b/servers/jwelly/mysql-backup/main.go
@@ -33,7 +33,7 @@ func main() {
for _, v := range env.ConnectionConfig.ServerConfig {
cccc := &interfaces.ConfigWithConnection{ServerConfig: &v}
if err := interfaces.ValidateAllConnectionsAndAssign(cccc); err != nil {
- fmt.Printf("Error In Validating Connectino %s", v.Name)
+ fmt.Printf("Error In Validating Connection %s", v.Name)
println(err.Error())
}
if env.ServerEnv.IsDev && env.ServerEnv.Env.APP_ENV == coreEnv.APP_ENV_LOCAL {
diff --git a/servers/jwelly/mysql-to-mysql/env/keys.go b/servers/jwelly/mysql-to-mysql/env/keys.go
index f158f0d..320b17c 100644
--- a/servers/jwelly/mysql-to-mysql/env/keys.go
+++ b/servers/jwelly/mysql-to-mysql/env/keys.go
@@ -1,5 +1,5 @@
package mysql_backup_env
-const ConfigFileName = "CONFGI_FILE_NAME"
+const ConfigFileName = "CONFIG_FILE_NAME"
// const RefreshDatabase = "REFRESH_DATABASE"
diff --git a/servers/jwelly/mysql-to-mysql/env_example b/servers/jwelly/mysql-to-mysql/env_example
index 4cfa36a..e35116a 100644
--- a/servers/jwelly/mysql-to-mysql/env_example
+++ b/servers/jwelly/mysql-to-mysql/env_example
@@ -1,2 +1,2 @@
APP_ENV="LOCAL"
-CONFGI_FILE_NAME="server.config.json"
\ No newline at end of file
+CONFIG_FILE_NAME="server.config.json"
\ No newline at end of file
diff --git a/servers/jwelly/mysql-to-mysql/interfaces/connectino.go b/servers/jwelly/mysql-to-mysql/interfaces/connectino.go
index de7a22c..c699446 100644
--- a/servers/jwelly/mysql-to-mysql/interfaces/connectino.go
+++ b/servers/jwelly/mysql-to-mysql/interfaces/connectino.go
@@ -17,10 +17,10 @@ type ConfigWithConnection struct {
}
func ValidateAllConnectionsAndAssign(c *ConfigWithConnection) error {
- if mysqlDb, err := mysqldb.InitalizeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
+ if mysqlDb, err := mysqldb.InitializeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
return err
} else {
- if mysqlRemoteDb, err := mysqldb.InitalizeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
+ if mysqlRemoteDb, err := mysqldb.InitializeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
mysqlDb.Db.Close()
return err
} else {
diff --git a/servers/jwelly/mysql-to-mysql/main.go b/servers/jwelly/mysql-to-mysql/main.go
index 47110a7..804b0a0 100644
--- a/servers/jwelly/mysql-to-mysql/main.go
+++ b/servers/jwelly/mysql-to-mysql/main.go
@@ -32,7 +32,7 @@ func main() {
for _, v := range env.ConnectionConfig.ServerConfig {
cccc := &interfaces.ConfigWithConnection{ServerConfig: &v}
if err := interfaces.ValidateAllConnectionsAndAssign(cccc); err != nil {
- fmt.Printf("Error In Validating Connectino %s", v.Name)
+ fmt.Printf("Error In Validating Connection %s", v.Name)
println(err.Error())
}
if env.ServerEnv.IsDev && env.ServerEnv.Env.APP_ENV == coreEnv.APP_ENV_LOCAL {
diff --git a/servers/jwelly/mysql-to-surreal/env/keys.go b/servers/jwelly/mysql-to-surreal/env/keys.go
index 0433cd7..a299af1 100644
--- a/servers/jwelly/mysql-to-surreal/env/keys.go
+++ b/servers/jwelly/mysql-to-surreal/env/keys.go
@@ -1,4 +1,4 @@
package mysql_to_surreal_env
-const ConfigFileName = "CONFGI_FILE_NAME"
+const ConfigFileName = "CONFIG_FILE_NAME"
const RefreshDatabase = "REFRESH_DATABASE"
diff --git a/servers/jwelly/mysql-to-surreal/env_example b/servers/jwelly/mysql-to-surreal/env_example
index 4cfa36a..e35116a 100644
--- a/servers/jwelly/mysql-to-surreal/env_example
+++ b/servers/jwelly/mysql-to-surreal/env_example
@@ -1,2 +1,2 @@
APP_ENV="LOCAL"
-CONFGI_FILE_NAME="server.config.json"
\ No newline at end of file
+CONFIG_FILE_NAME="server.config.json"
\ No newline at end of file
diff --git a/servers/jwelly/mysql-to-surreal/functions/accmast.table.func.go b/servers/jwelly/mysql-to-surreal/functions/accmast.table.func.go
index 8ab9660..adc93c1 100644
--- a/servers/jwelly/mysql-to-surreal/functions/accmast.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/accmast.table.func.go
@@ -41,8 +41,8 @@ func init() {
}
func (c *ConfigWithConnection) ReadAndStoreAccMastTable() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetAccMastTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreAccMastTable For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -273,5 +273,5 @@ func (c *ConfigWithConnection) ReadAndStoreAccMastTable() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(AccMastTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", AccMastTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", AccMastTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", AccMastTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/category.table.func.go b/servers/jwelly/mysql-to-surreal/functions/category.table.func.go
index 0cc2146..d8f4da4 100644
--- a/servers/jwelly/mysql-to-surreal/functions/category.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/category.table.func.go
@@ -28,8 +28,8 @@ func removeAndInsertCategory(c *ConfigWithConnection) {
}
func (c *ConfigWithConnection) ReadAndStoreCategory() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetCategoryTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreCategory For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -78,5 +78,5 @@ func (c *ConfigWithConnection) ReadAndStoreCategory() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(CategoryTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", CategoryTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", CategoryTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", CategoryTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/item-group.table.func.go b/servers/jwelly/mysql-to-surreal/functions/item-group.table.func.go
index 31805a7..50eba52 100644
--- a/servers/jwelly/mysql-to-surreal/functions/item-group.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/item-group.table.func.go
@@ -30,8 +30,8 @@ func removeAndInsertItemGroupTable(c *ConfigWithConnection) {
func (c *ConfigWithConnection) ReadAndStoreItemGroupTable() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetItemGroupTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreItemGroupTable For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -152,5 +152,5 @@ func (c *ConfigWithConnection) ReadAndStoreItemGroupTable() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(ItemGroupTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", ItemGroupTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", ItemGroupTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", ItemGroupTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/itemmast.table.func.go b/servers/jwelly/mysql-to-surreal/functions/itemmast.table.func.go
index d8c80b3..09ec43f 100644
--- a/servers/jwelly/mysql-to-surreal/functions/itemmast.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/itemmast.table.func.go
@@ -28,8 +28,8 @@ func init() {
}
func (c *ConfigWithConnection) ReadAndStoreItemMast() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetItemMastTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreItemMast For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -202,5 +202,5 @@ func (c *ConfigWithConnection) ReadAndStoreItemMast() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(ItemMastTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", ItemMastTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", ItemMastTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", ItemMastTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/itrans.table.func.go b/servers/jwelly/mysql-to-surreal/functions/itrans.table.func.go
index 2c340fa..017673e 100644
--- a/servers/jwelly/mysql-to-surreal/functions/itrans.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/itrans.table.func.go
@@ -40,8 +40,8 @@ func removeAndInsertItemTransTable(c *ConfigWithConnection) {
}
func (c *ConfigWithConnection) ReadAndStoreItemTransTable() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetItemTransTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreItemTransTable For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -331,5 +331,5 @@ func (c *ConfigWithConnection) ReadAndStoreItemTransTable() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(ItemTransTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", ItemTransTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", ItemTransTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", ItemTransTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/mysql-stamp.table.func.go b/servers/jwelly/mysql-to-surreal/functions/mysql-stamp.table.func.go
index a6f3680..8e95bdf 100644
--- a/servers/jwelly/mysql-to-surreal/functions/mysql-stamp.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/mysql-stamp.table.func.go
@@ -28,8 +28,8 @@ func removeAndInsertStampTable(c *ConfigWithConnection) {
}
func (c *ConfigWithConnection) ReadAndStoreStampTable() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetStampTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreStampTable For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -111,5 +111,5 @@ func (c *ConfigWithConnection) ReadAndStoreStampTable() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(StampTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", StampTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", StampTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", StampTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/mysql-tgm-table.func.go b/servers/jwelly/mysql-to-surreal/functions/mysql-tgm-table.func.go
index 315d78b..f56ead1 100644
--- a/servers/jwelly/mysql-to-surreal/functions/mysql-tgm-table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/mysql-tgm-table.func.go
@@ -40,8 +40,8 @@ func init() {
}
func (c *ConfigWithConnection) ReadAndStoreTgm1Table() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetTgm1TableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreTgm1Table For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -270,5 +270,5 @@ func (c *ConfigWithConnection) ReadAndStoreTgm1Table() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(TgmTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", TgmTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", TgmTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", TgmTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/site.table.func.go b/servers/jwelly/mysql-to-surreal/functions/site.table.func.go
index c55c6e5..d15f2bf 100644
--- a/servers/jwelly/mysql-to-surreal/functions/site.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/site.table.func.go
@@ -29,8 +29,8 @@ func init() {
}
func (c *ConfigWithConnection) ReadAndStoreSiteTable() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetSiteTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreSiteTable For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -86,5 +86,5 @@ func (c *ConfigWithConnection) ReadAndStoreSiteTable() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(SiteTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", SiteTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", SiteTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", SiteTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/tran1.table.func.go b/servers/jwelly/mysql-to-surreal/functions/tran1.table.func.go
index 7646772..be5243e 100644
--- a/servers/jwelly/mysql-to-surreal/functions/tran1.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/tran1.table.func.go
@@ -39,8 +39,8 @@ func removeAndInsertTrans1Table(c *ConfigWithConnection) {
}
func (c *ConfigWithConnection) ReadAndStoreTrans1Table() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetTrans1TableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreTrans1Table For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -339,5 +339,5 @@ func (c *ConfigWithConnection) ReadAndStoreTrans1Table() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(TransactionTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", TransactionTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", TransactionTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", TransactionTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/unit.table.func.go b/servers/jwelly/mysql-to-surreal/functions/unit.table.func.go
index b48bc0a..63646b7 100644
--- a/servers/jwelly/mysql-to-surreal/functions/unit.table.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/unit.table.func.go
@@ -29,8 +29,8 @@ func init() {
}
func (c *ConfigWithConnection) ReadAndStoreUnitTable() {
rows, err := c.DbConnections.MysqlDbConncetion.Db.Query(GetUnitTableCommand)
- initalTime := time.Now()
- startTime := initalTime
+ initialTime := time.Now()
+ startTime := initialTime
if err != nil {
fmt.Printf("Error in ReadAndStoreUnitTable For %s", c.ServerConfig.Name)
fmt.Println(err.Error())
@@ -79,5 +79,5 @@ func (c *ConfigWithConnection) ReadAndStoreUnitTable() {
if dddd, err := surrealdb.Select[[]any](localSurrealdb.SurrealCTX, c.DbConnections.SurrealDbConncetion.Db, models.Table(UnitTableName)); err == nil {
fmt.Printf("Select All %s from SurrealDB in Duration of %s with total rows %d\n", UnitTableName, time.Since(startTime), len(*dddd))
}
- fmt.Printf("%s Operation Completed in Duration of %s\n", UnitTableName, time.Since(initalTime))
+ fmt.Printf("%s Operation Completed in Duration of %s\n", UnitTableName, time.Since(initialTime))
}
diff --git a/servers/jwelly/mysql-to-surreal/functions/validate-connection.func.go b/servers/jwelly/mysql-to-surreal/functions/validate-connection.func.go
index 7d358a4..ecfb643 100644
--- a/servers/jwelly/mysql-to-surreal/functions/validate-connection.func.go
+++ b/servers/jwelly/mysql-to-surreal/functions/validate-connection.func.go
@@ -12,7 +12,7 @@ func ValidateAllConnectionsAndAssign(c *ConfigWithConnection) error {
} else {
c.DbConnections.SurrealDbConncetion = surrealDb
}
- if mysqlDb, err := mysqldb.InitalizeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
+ if mysqlDb, err := mysqldb.InitializeMysqlDbWithConfig(&c.ServerConfig.MysqlConfig); err != nil {
return err
} else {
c.DbConnections.MysqlDbConncetion = mysqlDb
diff --git a/servers/jwelly/mysql-to-surreal/interfaces/tg-master-status.enum.go b/servers/jwelly/mysql-to-surreal/interfaces/tg-master-status.enum.go
index c16cdea..781a836 100644
--- a/servers/jwelly/mysql-to-surreal/interfaces/tg-master-status.enum.go
+++ b/servers/jwelly/mysql-to-surreal/interfaces/tg-master-status.enum.go
@@ -47,12 +47,3 @@ func (e TgMasterStatus) String() string {
return ""
}
}
-
-// var (
-// appEnvMap = map[string]AppEnv{
-// "DEVELOPE": APP_ENV_DEVELOPE,
-// "LOCAL": APP_ENV_LOCAL,
-// "CI": APP_ENV_CI,
-// "PRODUCTION": APP_ENV_PRODUCTION,
-// }
-// )
diff --git a/servers/jwelly/mysql-to-surreal/main.go b/servers/jwelly/mysql-to-surreal/main.go
index 89c1a72..c1a1821 100644
--- a/servers/jwelly/mysql-to-surreal/main.go
+++ b/servers/jwelly/mysql-to-surreal/main.go
@@ -33,7 +33,7 @@ func InitaliseAndPopulateTheConnection() {
for _, v := range env.ConnectionConfig.ServerConfig {
cccc := &mysql_to_surreal_functions.ConfigWithConnection{ServerConfig: &v, DbConnections: &mysql_to_surreal_functions.ConnectionsToDb{}}
if err := mysql_to_surreal_functions.ValidateAllConnectionsAndAssign(cccc); err != nil {
- fmt.Printf("Error In Validating Connectino %s", v.Name)
+ fmt.Printf("Error In Validating Connection %s", v.Name)
println(err.Error())
} else {
DeferFunctionSlice = append(DeferFunctionSlice, cccc.DbConnections.MysqlDbConncetion.DeferFunction, cccc.DbConnections.SurrealDbConncetion.DeferFunction)
diff --git a/servers/link-shortner/main.go b/servers/link-shortner/main.go
index 187ef2a..4542d71 100644
--- a/servers/link-shortner/main.go
+++ b/servers/link-shortner/main.go
@@ -40,7 +40,7 @@ func main() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
diff --git a/servers/soham/whatsapp-client/auto-update/index.go b/servers/soham/whatsapp-client/auto-update/index.go
new file mode 100644
index 0000000..2fe7422
--- /dev/null
+++ b/servers/soham/whatsapp-client/auto-update/index.go
@@ -0,0 +1,245 @@
+package sohan_whatsapp_auto_download
+
+import (
+ "crypto/sha256"
+ "encoding/hex"
+ "encoding/json"
+ "fmt"
+ "io"
+ "log"
+ "net/http"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "time"
+
+ sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys"
+ utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
+ utility_functions_gzip "github.com/rpsoftech/golang-servers/utility/functions/gzip"
+)
+
+const VersionFileName = "client-version.json"
+
+type VersionInfo struct {
+ Version int `json:"version"`
+ URL string `json:"url"`
+ SHA256 string `json:"sha256"`
+}
+
+type progressReader struct {
+ reader io.Reader
+ total int64
+ read int64
+}
+
+func (p *progressReader) Read(buf []byte) (int, error) {
+ n, err := p.reader.Read(buf)
+ p.read += int64(n)
+
+ if p.total > 0 {
+ percentage := float64(p.read) / float64(p.total) * 100
+ fmt.Printf("\rDownloading update: %.2f%% (%d/%d bytes)", percentage, p.read, p.total)
+ } else {
+ fmt.Printf("\rDownloading update: %d bytes received", p.read)
+ }
+ return n, err
+}
+
+var checkAndRunCalled = false
+
+// getExeDir returns the absolute path of the directory where this executable is running
+func getExeDir() string {
+ exePath, err := os.Executable()
+ if err != nil {
+ // Fallback to current working directory if execution lookup fails
+ cwd, _ := os.Getwd()
+ return cwd
+ }
+ // Evaluates symlinks cleanly to guarantee correct execution paths
+ realPath, err := filepath.EvalSymlinks(exePath)
+ if err == nil {
+ return filepath.Dir(realPath)
+ }
+ return filepath.Dir(exePath)
+}
+
+func sha256File(path string) (string, error) {
+ file, err := os.Open(path)
+ if err != nil {
+ return "", err
+ }
+ defer file.Close()
+
+ hash := sha256.New()
+ _, err = io.Copy(hash, file)
+ if err != nil {
+ return "", err
+ }
+ return hex.EncodeToString(hash.Sum(nil)), nil
+}
+
+func GetVersionEndpoint() string {
+ switch fmt.Sprintf("%s_%s", runtime.GOOS, runtime.GOARCH) {
+ case "windows_amd64":
+ return "https://keyvalue.rpso.in/public/soham_go_wbot_windows_amd64"
+ case "darwin_amd64":
+ return "https://keyvalue.rpso.in/public/soham_go_wbot_darwin_amd64"
+ case "darwin_arm64":
+ return "https://keyvalue.rpso.in/public/soham_go_wbot_darwin_arm64"
+ default:
+ return ""
+ }
+}
+
+func CheckAndDownload() string {
+ // 1. Resolve target file paths relative to where the current application is running
+ appDir := getExeDir()
+ versionFilePath := filepath.Join(appDir, VersionFileName)
+
+ serverBinaryName := "whatsapp-client.o"
+ if runtime.GOOS == "windows" {
+ serverBinaryName = "whatsapp-client.exe"
+ }
+
+ // Anchor the target binary to the execution directory
+ serverBinary := filepath.Join(appDir, serverBinaryName)
+
+ if checkAndRunCalled {
+ return serverBinary
+ }
+
+ endpoint := GetVersionEndpoint()
+ if endpoint == "" {
+ log.Printf("Fatal: Endpoint Not Found For OS: %s, Arch: %s\n", runtime.GOOS, runtime.GOARCH)
+ return serverBinary
+ }
+
+ resp, err := http.Get(endpoint)
+ if err != nil {
+ log.Println("Error: Failed to poll client metadata version endpoint.")
+ return serverBinary
+ }
+ defer resp.Body.Close()
+
+ var cloud VersionInfo
+ if err := json.NewDecoder(resp.Body).Decode(&cloud); err != nil {
+ log.Println("Error parsing remote version payload:", err)
+ return serverBinary
+ }
+
+ var local VersionInfo
+ data, err := os.ReadFile(versionFilePath)
+ if err == nil {
+ json.Unmarshal(data, &local)
+ }
+
+ gzipFile := serverBinary + ".gz"
+ needDownload := false
+
+ if exist, _ := utility_functions.Exist(serverBinary); !exist {
+ needDownload = true
+ }
+ if local.Version != cloud.Version {
+ needDownload = true
+ }
+
+ if needDownload {
+ os.Remove(gzipFile)
+ log.Printf("New version found (Local: %d, Cloud: %d). Initializing download...", local.Version, cloud.Version)
+
+ err := downloadFileWithProgress(cloud.URL, gzipFile)
+ fmt.Println()
+ if err != nil {
+ log.Println("Error: File download failed:", err)
+ return serverBinary
+ }
+
+ hash, err := sha256File(gzipFile)
+ if err != nil {
+ log.Println("Error hashing temporary file:", err)
+ return serverBinary
+ }
+
+ if hash != cloud.SHA256 {
+ log.Printf("Error: Checksum mismatch. Expected %s, got %s\n", cloud.SHA256, hash)
+ os.Remove(gzipFile)
+ return serverBinary
+ }
+
+ err = replaceBinarySafe(gzipFile, serverBinary)
+ if err != nil {
+ log.Println("Binary unpack and replacement transaction failed:", err)
+ return serverBinary
+ }
+
+ vdata, _ := json.Marshal(cloud)
+ os.WriteFile(versionFilePath, vdata, 0644)
+ log.Println("Update deployed successfully to base execution folder.")
+ os.Exit(0)
+ }
+
+ checkAndRunCalled = true
+ return serverBinary
+}
+
+func downloadFileWithProgress(url string, targetPath string) error {
+ client := &http.Client{
+ Timeout: 500 * time.Second,
+ }
+ resp, err := client.Get(url)
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+
+ out, err := os.Create(targetPath)
+ if err != nil {
+ return err
+ }
+ defer out.Close()
+
+ pr := &progressReader{
+ reader: resp.Body,
+ total: resp.ContentLength,
+ }
+
+ _, err = io.Copy(out, pr)
+ return err
+}
+
+func replaceBinarySafe(tmpFile string, serverBinary string) error {
+ if sohan_whatsapp_keys.ServerCmd != nil && sohan_whatsapp_keys.ServerCmd.Process != nil {
+ sohan_whatsapp_keys.ServerCmd.Process.Kill()
+ time.Sleep(2 * time.Second)
+ }
+
+ backup := serverBinary + ".old"
+ os.Remove(backup)
+
+ if exist, _ := utility_functions.Exist(serverBinary); exist {
+ err := os.Rename(serverBinary, backup)
+ if err != nil {
+ if !strings.Contains(err.Error(), "access is denied") {
+ return fmt.Errorf("failed to cycle target out of space: %w", err)
+ }
+ }
+ }
+
+ err := utility_functions_gzip.GzipDecompressFile(tmpFile, serverBinary)
+ if err != nil {
+ if exist, _ := utility_functions.Exist(backup); exist {
+ os.Rename(backup, serverBinary)
+ }
+ return fmt.Errorf("decompression step failure: %w", err)
+ }
+
+ if runtime.GOOS != "windows" {
+ os.Chmod(serverBinary, 0755)
+ }
+
+ os.Remove(backup)
+ os.Remove(tmpFile)
+
+ return nil
+}
diff --git a/servers/soham/whatsapp-client/keys/index.go b/servers/soham/whatsapp-client/keys/index.go
new file mode 100644
index 0000000..797690c
--- /dev/null
+++ b/servers/soham/whatsapp-client/keys/index.go
@@ -0,0 +1,8 @@
+package soham_whatsapp_client_keys
+
+import "os/exec"
+
+var ServerConfigFilePath = ""
+var ServerCmd *exec.Cmd
+var HomeDir string
+var ConfigDir string
diff --git a/servers/soham/whatsapp-client/main.go b/servers/soham/whatsapp-client/main.go
index 885602e..3dda1ec 100644
--- a/servers/soham/whatsapp-client/main.go
+++ b/servers/soham/whatsapp-client/main.go
@@ -3,6 +3,7 @@ package main
import (
"errors"
"fmt"
+ "log"
"os"
"path/filepath"
"time"
@@ -15,6 +16,7 @@ import (
whatsapp_middleware "github.com/rpsoftech/golang-servers/functions/whatsapp/middleware"
"github.com/rpsoftech/golang-servers/interfaces"
soham_whatsapp_client_apis "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/apis"
+ sohan_whatsapp_auto_download "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/auto-update"
whatsapp_client_core "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/core"
soham_whatsapp_client_env "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/env"
soham_whatsapp_client_websocket "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/websoceket"
@@ -25,10 +27,11 @@ var version string
func main() {
soham_whatsapp_client_env.InialiseSohamWhatsappClientEnv()
- println(version)
+ log.Printf("Version File:- %s", version)
go func() {
os.RemoveAll("./tmp")
os.Mkdir("./tmp", 0777)
+ sohan_whatsapp_auto_download.CheckAndDownload()
}()
outputLogFolderDir := filepath.Join(env.FindAndReturnCurrentDir(), "whatsapp_server_logs")
@@ -82,7 +85,7 @@ func InitFiberServer() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
hostAndPort = hostAndPort + ":" + env.GetServerPort(env.PORT_KEY)
diff --git a/servers/soham/whatsapp-server/main.go b/servers/soham/whatsapp-server/main.go
index a8939e8..89a2631 100644
--- a/servers/soham/whatsapp-server/main.go
+++ b/servers/soham/whatsapp-server/main.go
@@ -66,7 +66,7 @@ func main() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
hostAndPort = hostAndPort + ":" + env.GetServerPort(env.PORT_KEY)
@@ -85,11 +85,11 @@ func main() {
if errs := validator.Validator.Validate(sslConfig); len(errs) > 0 {
panic(fmt.Errorf("SSL_CONFIG_ERROR %#v", errs))
}
- if _, err := os.Stat(sslConfig.CertFilePath); os.IsNotExist(err) {
+ if exist, _ := utility_functions.Exist(sslConfig.CertFilePath); !exist {
log.Errorf("SSL Cert File Not Exist at %s", sslConfig.CertFilePath)
return
}
- if _, err := os.Stat(sslConfig.KeyFilePath); os.IsNotExist(err) {
+ if exist, _ := utility_functions.Exist(sslConfig.KeyFilePath); !exist {
log.Errorf("SSL Key File Not Exist at %s", sslConfig.KeyFilePath)
return
}
diff --git a/servers/telegram-server/main.go b/servers/telegram-server/main.go
index 8352ec4..16bb755 100644
--- a/servers/telegram-server/main.go
+++ b/servers/telegram-server/main.go
@@ -70,7 +70,7 @@ func InitFiberServer() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
hostAndPort = hostAndPort + ":" + env.GetServerPort(env.PORT_KEY)
diff --git a/servers/tunnel-client/main.go b/servers/tunnel-client/main.go
index 9e11c92..87eec4f 100644
--- a/servers/tunnel-client/main.go
+++ b/servers/tunnel-client/main.go
@@ -3,7 +3,6 @@ package main
import (
"context"
"encoding/json"
- "errors"
"fmt"
"log"
"os"
@@ -14,6 +13,7 @@ import (
chclient "github.com/jpillora/chisel/client"
chshare "github.com/jpillora/chisel/share"
"github.com/jpillora/chisel/share/cos"
+ utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
"github.com/rpsoftech/golang-servers/validator"
)
@@ -55,7 +55,7 @@ func start() {
ThisConfig := &Config{}
fmt.Printf("Config path %s\n", configFilePAth)
- if _, err := os.Stat(configFilePAth); errors.Is(err, os.ErrNotExist) {
+ if exist, _ := utility_functions.Exist(configFilePAth); !exist {
panic(fmt.Errorf("Config Not Exist on Path %s", configFilePAth))
}
dat, err := os.ReadFile(configFilePAth)
diff --git a/servers/whatsapp-server/main.go b/servers/whatsapp-server/main.go
index fc54c58..a00459b 100644
--- a/servers/whatsapp-server/main.go
+++ b/servers/whatsapp-server/main.go
@@ -73,7 +73,7 @@ func InitFiberServer() {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
})
hostAndPort := ""
- if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOP {
hostAndPort = "127.0.0.1"
}
hostAndPort = hostAndPort + ":" + env.GetServerPort(env.PORT_KEY)
diff --git a/utility/firebase/firebase-app.go b/utility/firebase/firebase-app.go
index 285fd6d..81501f2 100644
--- a/utility/firebase/firebase-app.go
+++ b/utility/firebase/firebase-app.go
@@ -29,7 +29,7 @@ func DeferFunction() {
}
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
diff --git a/utility/mongodb/index.go b/utility/mongodb/index.go
index b19ad99..49d918b 100644
--- a/utility/mongodb/index.go
+++ b/utility/mongodb/index.go
@@ -18,7 +18,7 @@ var MongoDatabase *mongo.Database
var MongoCtx = context.TODO()
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
config := &MongoDBConfig{
diff --git a/utility/mysql/index.go b/utility/mysql/index.go
index d1eda1b..c81369f 100644
--- a/utility/mysql/index.go
+++ b/utility/mysql/index.go
@@ -52,14 +52,14 @@ func initaliseMysqlDb() {
MYSQL_PASSWORD: env.Env.GetEnv(env.MYSQL_PASSWORD_KEY),
MYSQL_DATABASE: env.Env.GetEnv(env.MYSQL_DATABASE_KEY),
}
- if db, err := InitalizeMysqlDbWithConfig(config); err != nil {
+ if db, err := InitializeMysqlDbWithConfig(config); err != nil {
panic(err)
} else {
MysqlDbCon = db
}
}
-func InitalizeMysqlDbWithConfig(config *MysqldbConfig) (*MysqlDBStruct, error) {
+func InitializeMysqlDbWithConfig(config *MysqldbConfig) (*MysqlDBStruct, error) {
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?tls=false&autocommit=true&parseTime=true", config.MYSQL_USERNAME, config.MYSQL_PASSWORD, config.MYSQL_HOST, config.MYSQL_PORT, config.MYSQL_DATABASE))
if err != nil {
return nil, err
diff --git a/utility/mysql/mysql-date-string.interface.go b/utility/mysql/mysql-date-string.interface.go
index 39ba966..1434413 100644
--- a/utility/mysql/mysql-date-string.interface.go
+++ b/utility/mysql/mysql-date-string.interface.go
@@ -12,6 +12,5 @@ type MysqlDateWithNull struct {
}
func (ns *MysqlDateWithNull) MarshalCBOR() ([]byte, error) {
-
return cbor.Marshal(ns.String)
}
diff --git a/utility/redis/index.go b/utility/redis/index.go
index 4c9ba09..cbe32a8 100644
--- a/utility/redis/index.go
+++ b/utility/redis/index.go
@@ -35,7 +35,7 @@ var RedisClient *RedisClientStruct
var RedisCTX = context.Background()
func init() {
- if env.Env.APP_ENV == env.APP_ENV_DEVELOPE {
+ if env.Env.APP_ENV == env.APP_ENV_DEVELOP {
return
}
// RedisClient.redisClient.Subscribe()
diff --git a/utility/whatsapp/utility/pdf-to-thumb.go b/utility/whatsapp/utility/pdf-to-thumb.go
index 8b544db..d4105f1 100644
--- a/utility/whatsapp/utility/pdf-to-thumb.go
+++ b/utility/whatsapp/utility/pdf-to-thumb.go
@@ -10,6 +10,7 @@ import (
"path/filepath"
"github.com/gen2brain/go-fitz"
+ utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
)
func ExtractFirstPage(pdfBytes []byte) ([]byte, error) {
@@ -22,7 +23,7 @@ func ExtractFirstPage(pdfBytes []byte) ([]byte, error) {
outputDir := filepath.Join(".", "output_images")
- if _, err := os.Stat(outputDir); os.IsNotExist(err) {
+ if exist, _ := utility_functions.Exist(outputDir); !exist {
err := os.Mkdir(outputDir, 0755)
if err != nil {
fmt.Println("Error creating output directory:", err)