upd after review
All checks were successful
Lint / Lint (push) Successful in 2m16s

This commit is contained in:
Pasha 2024-12-09 12:46:14 +03:00
parent f1c60512a4
commit 9ff5fdb551
5 changed files with 29 additions and 72 deletions

@ -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) {

@ -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

@ -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

@ -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=