heruvym/cmd/validator/main.go

160 lines
3.7 KiB
Go

package main
import (
"bytes"
"context"
"fmt"
"gitea.pena/PenaSide/common/mongo"
"gitea.pena/PenaSide/common/validate"
"gitea.pena/PenaSide/heruvym/internal/initialize"
minioDal "gitea.pena/PenaSide/heruvym/internal/repository/minio"
"github.com/minio/minio-go/v7"
"github.com/pioz/faker"
"log"
"os"
"strconv"
"strings"
)
func main() {
cfg, err := loadConfig()
if err != nil {
log.Fatalf("error loading config: %v", err)
}
if cfg.ClientHttpUrl == "" {
log.Fatalf("error client http url is empty")
}
if cfg.AdminHttpUrl == "" {
log.Fatalf("error admin http url is empty")
}
err = validate.ValidateMongo(cfg.ExternalCfg.Database)
if err != nil {
log.Fatalf("error validating mongo: %v", err)
}
err = validate.ValidateTgToken(cfg.TelegramToken)
if err != nil {
log.Fatalf("error validating telegram token: %v", err)
}
if cfg.TelegramChannelID == 0 {
log.Fatalf("telegram channel id must be set")
}
err = validateRedis(cfg)
if err != nil {
log.Fatalf("error validating redis: %v", err)
}
err = validateS3(cfg)
if err != nil {
log.Fatalf("error validating s3: %v", err)
}
}
func loadConfig() (initialize.Config, error) {
config := initialize.Config{
ExternalCfg: initialize.ExternalCfg{
Database: mongo.Configuration{
URL: os.Getenv("MONGO_URL"),
DatabaseName: os.Getenv("MONGO_DB_NAME"),
},
},
IsProd: envToBool(os.Getenv("IS_PROD")),
S3Endpoint: os.Getenv("S3_ENDPOINT"),
S3AccessKey: os.Getenv("S3_ACCESS_KEY"),
S3SecretKey: os.Getenv("S3_SECRET_KEY"),
S3Token: os.Getenv("S3_TOKEN"),
TelegramToken: os.Getenv("TELEGRAM_TOKEN"),
RedisHost: os.Getenv("REDIS_HOST"),
RedisPassword: os.Getenv("REDIS_PASSWORD"),
RedisDB: int(envToInt64(os.Getenv("REDIS_DB"))),
TelegramChannelID: envToInt64(os.Getenv("TELEGRAM_CHANNEL_ID")),
ClientHttpUrl: os.Getenv("CLIENT_HTTP_URL"),
AdminHttpUrl: os.Getenv("ADMIN_HTTP_URL"),
}
return config, nil
}
func envToInt64(str string) int64 {
n, err := strconv.ParseInt(str, 10, 64)
if err != nil {
panic(err)
}
return n
}
func envToBool(str string) bool {
switch strings.ToLower(strings.TrimSpace(str)) {
case "1", "true":
return true
case "0", "false":
return false
default:
panic(fmt.Sprintf("invalid boolean value: %s", str))
}
}
func validateRedis(cfg initialize.Config) error {
if cfg.RedisHost == "" {
return fmt.Errorf("redis host is empty")
}
_, err := initialize.Redis(context.TODO(), cfg)
if err != nil {
return err
}
return nil
}
func validateS3(cfg initialize.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 := initialize.Minio(cfg)
if err != nil {
return fmt.Errorf("error connect s3 in validate: %w", err)
}
objectName := faker.String()
content := []byte(faker.String())
contentType := "text/plain"
exist, err := client.BucketExists(ctx, minioDal.Bucket)
if err != nil {
return fmt.Errorf("error find s3 bucket in validate: %w", err)
}
// не создаем бакет так как бакет могут не дать создать
if !exist {
return fmt.Errorf("bucket does not exist")
}
_, err = client.PutObject(ctx, minioDal.Bucket, 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, minioDal.Bucket, objectName, minio.RemoveObjectOptions{})
if err != nil {
return fmt.Errorf("error remove test object: %w", err)
}
return nil
}