diff --git a/cmd/validator/main.go b/cmd/validator/main.go new file mode 100644 index 0000000..47f0830 --- /dev/null +++ b/cmd/validator/main.go @@ -0,0 +1,123 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "gitea.pena/PenaSide/common/validate" + "gitea.pena/PenaSide/verification/internal/config" + "gitea.pena/PenaSide/verification/internal/repository" + "github.com/caarlos0/env/v8" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/pioz/faker" + "log" +) + +func main() { + cfg, err := loadConfig() + if err != nil { + log.Fatalf("error loading config: %v", err) + } + + err = validateNotEmpty(cfg) + if err != nil { + log.Fatalf("error validating config: %v", err) + } + + err = validateS3(cfg) + if err != nil { + log.Fatalf("error validating s3: %v", err) + } + + if err = validate.ValidateTgToken(cfg.TelegramToken); err != nil { + log.Fatalf("error validating telegram token: %v", err) + } + + if err = validate.ValidateMongo(cfg.ExternalCfg.Database); err != nil { + log.Fatalf("error validating mongodb: %v", err) + } + +} + +func loadConfig() (config.Config, error) { + var cfg config.Config + + if err := env.Parse(&cfg); err != nil { + return cfg, err + } + return cfg, nil +} + +func validateNotEmpty(cfg config.Config) error { + if cfg.TelegramChannelID == 0 { + return fmt.Errorf("TelegramChannelID is empty") + } + if cfg.ClientHttpURL == "" { + return fmt.Errorf("ClientHttpURL is empty") + } + if cfg.AdminHttpURL == "" { + return fmt.Errorf("AdminHttpURL is empty") + } + if cfg.CustomerMicroserviceRPCURL == "" { + return fmt.Errorf("CustomerMicroserviceRPCURL is empty") + } + if cfg.TrashLogHost == "" { + return fmt.Errorf("TrashLogHost is empty") + } + if cfg.VerificationMicroserviceURL == "" { + return fmt.Errorf("VerificationMicroserviceURL is empty") + } + return nil +} + +func validateS3(cfg config.Config) error { + if cfg.S3Endpoint == "" { + return fmt.Errorf("s3 endpoint is empty") + } + if cfg.S3AccessKey == "" { + return fmt.Errorf("s3 access key is empty") + } + if cfg.S3SecretKey == "" { + return fmt.Errorf("s3 secret key is empty") + } + + ctx := context.TODO() + + client, err := minio.New(cfg.S3Endpoint, &minio.Options{ + Creds: credentials.NewStaticV4(cfg.S3AccessKey, cfg.S3SecretKey, ""), + Secure: true, + }) + if err != nil { + return fmt.Errorf("error creating minio client: %v", err) + } + + objectName := faker.String() + content := []byte(faker.String()) + contentType := "text/plain" + + exist, err := client.BucketExists(ctx, repository.VerificationBucket) + if err != nil { + return fmt.Errorf("error find s3 bucket in validate: %w", err) + } + + // не создаем бакет так как бакет могут не дать создать + if !exist { + log.Println("bucket does not exist") + return nil + } + + _, err = client.PutObject(ctx, repository.VerificationBucket, objectName, + bytes.NewReader(content), int64(len(content)), + minio.PutObjectOptions{ContentType: contentType}) + if err != nil { + return fmt.Errorf("error create test object: %w", err) + } + + err = client.RemoveObject(ctx, repository.VerificationBucket, objectName, minio.RemoveObjectOptions{}) + if err != nil { + return fmt.Errorf("error remove test object: %w", err) + } + + return nil +} diff --git a/cmd/validator/main_test.go b/cmd/validator/main_test.go new file mode 100644 index 0000000..0e9d85a --- /dev/null +++ b/cmd/validator/main_test.go @@ -0,0 +1,12 @@ +package main + +import ( + "gitea.pena/PenaSide/verification/internal/config" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestValidateS3(t *testing.T) { + err := validateS3(config.Config{S3Endpoint: "localhost:9000", S3AccessKey: "minioadmin", S3SecretKey: "minioadmin"}) + assert.NoError(t, err) +} diff --git a/go.mod b/go.mod index 78568b8..45582b6 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.0 toolchain go1.22.2 require ( - gitea.pena/PenaSide/common v0.0.0-20241128160655-fe730a08b5f1 + gitea.pena/PenaSide/common v0.0.0-20241206095133-a4a6f7df8b45 gitea.pena/PenaSide/customer v0.0.0-20241118214409-34a88a3a7001 //dev gitea.pena/PenaSide/trashlog v0.0.0-20241119225515-2fd267647ca4 //dev github.com/caarlos0/env/v8 v8.0.0 @@ -19,7 +19,10 @@ require ( go.uber.org/zap v1.27.0 ) -require gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735 +require ( + gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735 + github.com/pioz/faker v1.7.3 +) require ( github.com/ClickHouse/clickhouse-go v1.5.4 // indirect diff --git a/go.sum b/go.sum index 1699fe2..c604098 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -gitea.pena/PenaSide/common v0.0.0-20241128160655-fe730a08b5f1 h1:w1AAxrlZGmxUI9NAa/0TYsc6sqWWF9yAzQaLL/KxwrM= -gitea.pena/PenaSide/common v0.0.0-20241128160655-fe730a08b5f1/go.mod h1:l71j3W1yROhOSfjWZ6wcMuzjBR37gu2ZTcXsorEJoiw= +gitea.pena/PenaSide/common v0.0.0-20241206095133-a4a6f7df8b45 h1:0YzvHSgRitVeqvniSCPr6BERHusGP5yrGozAITYbWmg= +gitea.pena/PenaSide/common v0.0.0-20241206095133-a4a6f7df8b45/go.mod h1:BDk6/EA9ekKun+UP7UBLcczhlmFRLxglYi00G9FBkUw= gitea.pena/PenaSide/customer v0.0.0-20241118214409-34a88a3a7001 h1:bnwlhVx7LzwAYgx25G8/qezqkXvatL1de9nQZvpO0IE= gitea.pena/PenaSide/customer v0.0.0-20241118214409-34a88a3a7001/go.mod h1:6lKbvPc2E2TcNSxG8WlC/XBuhqW6smKQtpYPLedheqU= gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735 h1:jDVeUhGBTXBibmW5dmtJg2m2+z5z2Rf6J4G0LpjVoJ0= @@ -128,6 +128,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= diff --git a/internal/app/app_verification.go b/internal/app/app_verification.go index 39bad81..5d8927b 100644 --- a/internal/app/app_verification.go +++ b/internal/app/app_verification.go @@ -2,6 +2,7 @@ package app import ( "context" + "fmt" mongo "gitea.pena/PenaSide/common/mongo" "gitea.pena/PenaSide/customer/pkg/customer_clients" "gitea.pena/PenaSide/trashlog/app" @@ -54,7 +55,7 @@ func Run(cfg *config.Config, build Build) { loggerHlog.Emit(app.InfoSvcStarted{}) mongoDB, err := mongo.Connect(ctx, &mongo.ConnectDeps{ - Configuration: &cfg.External.Database, + Configuration: &cfg.ExternalCfg.Database, Timeout: 5 * time.Second, }) @@ -80,6 +81,11 @@ func Run(cfg *config.Config, build Build) { logger.Fatal("TelegramBotApi", zap.Error(err)) } + _, err = tgBot.Send(tgbotapi.NewMessage(cfg.TelegramChannelID, fmt.Sprintf("PING MSG from %s", config.ModuleLogger))) + if err != nil { + logger.Fatal("Send TG ping", zap.Error(err)) + } + telegram := client.NewTelegram(client.Deps{ Logger: logger, Bot: tgBot, diff --git a/internal/config/config.go b/internal/config/config.go index c5ab06e..1e1c414 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -19,7 +19,7 @@ type Config struct { CustomerMicroserviceRPCURL string `env:"CUSTOMER_MICROSERVICE_RPC_URL,required"` TrashLogHost string `env:"TRASH_LOG_HOST,required"` VerificationMicroserviceURL string `env:"VERIFICATION_MICROSERVICE_URL,required"` - External External + ExternalCfg External } type External struct {