This commit is contained in:
parent
f1c60512a4
commit
9ff5fdb551
@ -7,49 +7,22 @@ import (
|
||||
"fmt"
|
||||
"gitea.pena/PenaSide/trashlog/dal/bbolt"
|
||||
_ "github.com/ClickHouse/clickhouse-go"
|
||||
"github.com/caarlos0/env/v8"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
tb "gopkg.in/tucnak/telebot.v2"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func NewOptions() *Options {
|
||||
return &Options{
|
||||
Development: getBoolEnv("DEVELOPMENT"),
|
||||
AppName: getEnv("APP_NAME"),
|
||||
GrpcURL: getEnv("GRPC_URL"),
|
||||
ClickhouseURL: getEnv("CLICKHOUSE_URL"),
|
||||
DBPath: getEnv("DB_PATH"),
|
||||
TelegramToken: getEnv("TELEGRAM_TOKEN"),
|
||||
TelegramChannelID: parseInt64(getEnv("TELEGRAM_CHANNEL_ID")),
|
||||
ClickhouseTableMainName: getEnv("CLICKHOUSE_TABLE_MAIN_NAME"),
|
||||
AdminHttpURL: getEnv("ADMIN_HTTP_URL"),
|
||||
opts := &Options{}
|
||||
if err := env.Parse(opts); err != nil {
|
||||
log.Fatalf("failed to parse environment variables: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func getEnv(key string) string {
|
||||
if value := os.Getenv(key); value != "" {
|
||||
return value
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func getBoolEnv(key string) bool {
|
||||
valueStr := getEnv(key)
|
||||
value, err := strconv.ParseBool(valueStr)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
// todo все таки сделать int64 для отрицательного диапазона
|
||||
func parseInt64(s string) uint64 {
|
||||
value, _ := strconv.ParseInt(s, 10, 64)
|
||||
return uint64(value)
|
||||
return opts
|
||||
}
|
||||
|
||||
func (o *Options) Validate() error {
|
||||
@ -68,7 +41,7 @@ func (o *Options) Validate() error {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = o.validateDBPath(); err != nil {
|
||||
if err = o.validateDBBolt(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -88,18 +61,6 @@ func (o *Options) validateAddr() error {
|
||||
return errors.New("ADMIN_HTTP_URL not be empty")
|
||||
}
|
||||
|
||||
//if ip := net.ParseIP(o.HTTPHost); ip == nil {
|
||||
// return errors.New("HTTP_HOST must be a valid IP address or hostname")
|
||||
//}
|
||||
//
|
||||
//if o.HTTPPort == "" {
|
||||
// return errors.New("HTTP_PORT not be empty")
|
||||
//}
|
||||
//port, err := strconv.Atoi(o.HTTPPort)
|
||||
//if err != nil || port < 1 || port > 65535 {
|
||||
// return errors.New("HTTP_PORT must be a valid port number between 1 and 65535")
|
||||
//}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -127,7 +88,7 @@ func (o *Options) validateClickhouseCred() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Options) validateDBPath() error {
|
||||
func (o *Options) validateDBBolt() error {
|
||||
dir := filepath.Dir(o.DBPath)
|
||||
|
||||
tmpFile, err := os.CreateTemp(dir, ".tmp-validate")
|
||||
@ -152,27 +113,31 @@ func (o *Options) validateDBPath() error {
|
||||
err = fmt.Errorf("error checking DBPath: %v", dbFileErr)
|
||||
return err
|
||||
} else if !exs {
|
||||
// если файла базы данных нет то создаем
|
||||
db, createFileErr := bolt.Open(o.DBPath, 0664, &bolt.Options{
|
||||
Timeout: 5 * time.Second,
|
||||
NoGrowSync: false,
|
||||
FreelistType: bolt.FreelistArrayType,
|
||||
Timeout: 5 * time.Second, // устанавливает максимальное время ожидания для доступа к базе данных
|
||||
NoGrowSync: false, // не будет увеличивать размер файла синхронно при записи
|
||||
FreelistType: bolt.FreelistArrayType, // для повышения производительности бд
|
||||
})
|
||||
if createFileErr != nil {
|
||||
err = fmt.Errorf("err create file at path '%s': %v", o.DBPath, createFileErr)
|
||||
return err
|
||||
}
|
||||
|
||||
exsDouble, dbFileDoubleErr := exists(o.DBPath)
|
||||
if dbFileDoubleErr != nil {
|
||||
err = fmt.Errorf("error checking DBPath after crreate bbolt db: %v", dbFileDoubleErr)
|
||||
// проверяем что файл действительно появился
|
||||
exs, dbFileErr = exists(o.DBPath)
|
||||
if dbFileErr != nil {
|
||||
err = fmt.Errorf("error checking DBPath after crreate bbolt db: %v", dbFileErr)
|
||||
return err
|
||||
}
|
||||
|
||||
if !exsDouble {
|
||||
err = errors.New("error checking DBPath after crreate bbolt db")
|
||||
// если нет, то возвращаем ошибку
|
||||
if !exs {
|
||||
err = errors.New("error checking DBPath after create bbolt db")
|
||||
return err
|
||||
}
|
||||
|
||||
// создаем бакет как элемент проверки того что писать и изменять мы можем файл
|
||||
createBucketErr := db.Update(func(tx *bolt.Tx) error {
|
||||
_, createBucketErr := tx.CreateBucketIfNotExists([]byte(bbolt.BucketName))
|
||||
if createBucketErr != nil {
|
||||
@ -190,7 +155,7 @@ func (o *Options) validateDBPath() error {
|
||||
err = fmt.Errorf("error closing DB connection: %v", closeErr)
|
||||
return err
|
||||
}
|
||||
|
||||
// удаляем после, чтобы главный процесс сам его создавал
|
||||
removeFileErr := os.Remove(o.DBPath)
|
||||
if removeFileErr != nil {
|
||||
err = fmt.Errorf("err remove file at path '%s': %v", o.DBPath, removeFileErr)
|
||||
|
@ -57,21 +57,21 @@ func TestOptions_Validate(t *testing.T) {
|
||||
opts := optsMain
|
||||
opts.GrpcURL = "7113"
|
||||
err := opts.Validate()
|
||||
assert.EqualError(t, err, "APP_ADDR must start with ':'")
|
||||
assert.EqualError(t, err, "GRPC_URL must start with ':'")
|
||||
})
|
||||
|
||||
t.Run("missing ADMIN_HTTP_URL", func(t *testing.T) {
|
||||
opts := optsMain
|
||||
opts.AdminHttpURL = ""
|
||||
err := opts.Validate()
|
||||
assert.EqualError(t, err, "HTTP_PORT not be empty")
|
||||
assert.EqualError(t, err, "ADMIN_HTTP_URL not be empty")
|
||||
})
|
||||
|
||||
t.Run("missing CLICKHOUSE_URL", func(t *testing.T) {
|
||||
opts := optsMain
|
||||
opts.ClickhouseURL = ""
|
||||
err := opts.Validate()
|
||||
assert.EqualError(t, err, "APP_CLICKHOUSE_CRED is empty")
|
||||
assert.EqualError(t, err, "CLICKHOUSE_URL is empty")
|
||||
})
|
||||
|
||||
t.Run("invalid DBPath directory", func(t *testing.T) {
|
||||
@ -85,14 +85,14 @@ func TestOptions_Validate(t *testing.T) {
|
||||
opts := optsMain
|
||||
opts.TelegramToken = ""
|
||||
err := opts.Validate()
|
||||
assert.EqualError(t, err, "telegram token or chat ID empty")
|
||||
assert.EqualError(t, err, "TELEGRAM_TOKEN or TELEGRAM_CHANNEL_ID empty")
|
||||
})
|
||||
|
||||
t.Run("empty Telegram ChatID", func(t *testing.T) {
|
||||
opts := optsMain
|
||||
opts.TelegramChannelID = 0
|
||||
err := opts.Validate()
|
||||
assert.EqualError(t, err, "telegram token or chat ID empty")
|
||||
assert.EqualError(t, err, "TELEGRAM_TOKEN or TELEGRAM_CHANNEL_ID empty")
|
||||
})
|
||||
|
||||
t.Run("invalid CLICKHOUSE_URL - connection error", func(t *testing.T) {
|
||||
|
11
cmd/main.go
11
cmd/main.go
@ -12,17 +12,6 @@ func initApp(cfg *app.Options) {
|
||||
}
|
||||
|
||||
func main() {
|
||||
//os.Setenv("DEVELOPMENT", "false")
|
||||
//os.Setenv("APP_NAME", "testValidate")
|
||||
//os.Setenv("APP_ADDR", ":7113")
|
||||
//os.Setenv("CH_CRED", "tcp://127.0.0.1:9000?debug=true")
|
||||
//os.Setenv("DB_PATH", "./recover.bolt")
|
||||
//os.Setenv("TG_TOKEN", "6712573453:AAFqTOsgwe_j48ZQ1GzWKQDT5Nwr-SAWjz8")
|
||||
//os.Setenv("TG_CHAT_ID", "1002217604546")
|
||||
//os.Setenv("DB_CLICKHOUSE_NAME", "test_validator")
|
||||
//os.Setenv("DB_BUFFER_CLICKHOUSE_NAME", "test_validator_buffer")
|
||||
//os.Setenv("HTTP_HOST", "127.0.0.1")
|
||||
//os.Setenv("HTTP_PORT", "8000")
|
||||
cfg := app.NewOptions()
|
||||
initApp(cfg)
|
||||
}
|
||||
|
1
go.mod
1
go.mod
@ -5,6 +5,7 @@ go 1.22.0
|
||||
require (
|
||||
gitea.pena/PenaSide/linters-golang v0.0.0-20241119212350-2759fa93724a
|
||||
github.com/ClickHouse/clickhouse-go v1.5.4
|
||||
github.com/caarlos0/env/v8 v8.0.0
|
||||
github.com/gofiber/fiber/v2 v2.52.5
|
||||
github.com/onsi/ginkgo v1.16.0
|
||||
github.com/onsi/gomega v1.11.0
|
||||
|
2
go.sum
2
go.sum
@ -10,6 +10,8 @@ github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk=
|
||||
github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
|
||||
github.com/caarlos0/env/v8 v8.0.0 h1:POhxHhSpuxrLMIdvTGARuZqR4Jjm8AYmoi/JKlcScs0=
|
||||
github.com/caarlos0/env/v8 v8.0.0/go.mod h1:7K4wMY9bH0esiXSSHlfHLX5xKGQMnkH5Fk4TDSSSzfo=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
|
Loading…
Reference in New Issue
Block a user