diff --git a/.env b/.env index 38c8fcd..b7620e3 100644 --- a/.env +++ b/.env @@ -1,27 +1,24 @@ # General application settings APP_NAME=codeword -HTTP_HOST="localhost" -HTTP_PORT="8080" +CLIENT_HTTP_URL="localhost:3000" +ADMIN_HTTP_URL="localhost:3001" +GRPC_URL="localhost:9000" # MongoDB settings -MONGO_HOST="127.0.0.1" -MONGO_PORT="27020" -MONGO_USER="test" -MONGO_PASSWORD="test" -MONGO_DB="admin" -MONGO_AUTH="admin" +MONGO_URL="mongodb://test:test@localhost:27020/?authSource=admin" +MONGO_DB_NAME="admin" # Redis settings -REDIS_ADDR="10.6.0.23:6379" -REDIS_PASS="Redalert2" -REDIS_DB=3 +REDIS_HOST="localhost:6379" +REDIS_PASS="admin" +REDIS_DB=2 # Keys -PUBLIC_CURVE_KEY="-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAEbnIvjIMle4rqVol6K2XUqOxHy1KJoNoZdKJrRUPKL4=\n-----END PUBLIC KEY-----" +ENCRYPT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAEbnIvjIMle4rqVol6K2XUqOxHy1KJoNoZdKJrRUPKL4=\n-----END PUBLIC KEY-----" -PRIVATE_CURVE_KEY="-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIKn0BKwF3vZvODgWAnUIwQhd8de5oZhY48gc23EWfrfs\n-----END PRIVATE KEY-----" +ENCRYPT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIKn0BKwF3vZvODgWAnUIwQhd8de5oZhY48gc23EWfrfs\n-----END PRIVATE KEY-----" -SIGN_SECRET="pena-auth-microservice-group" +ENCRYPT_SIGN_SECRET="pena-auth-microservice-group" JWT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgHgnvr7O2tiApjJfid1orFnIGm6980fZp+Lpbjo+NC/0whMFga2B iw5b1G2Q/B2u0tpO1Fs/E8z7Lv1nYfr5jx2S8x6BdA4TS2kB9Kf0wn0+7wSlyikH @@ -43,23 +40,18 @@ JWT_ISSUER="pena-auth-service" JWT_AUDIENCE="pena" -SIGN_SECRET="secret" - # SMTP settings -SMTP_API_URL="https://api.smtp.bz/v1/smtp/send" -SMTP_HOST="connect.mailclient.bz" -SMTP_PORT="587" -SMTP_UNAME="kotilion.95@gmail.com" -SMTP_PASS="vWwbCSg4bf0p" -SMTP_API_KEY="P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev" -SMTP_SENDER="noreply@mailing.pena.digital" +API_URL="https://api.smtp.bz/v1/smtp/send" +MAIL_API_KEY="P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev" +MAIL_SENDER="noreply@mailing.pena.digital" # URL settings DEFAULT_REDIRECTION_URL = "https://shub.pena.digital/recover/" -AUTH_EXCHANGE_URL = "http://10.6.0.11:59300/auth/exchange" -RECOVER_URL = "https://shub.pena.digital/recover/" -DISCOUNT_ADDRESS = "http://10.6.0.11:9001" +AUTH_MICROSERVICE_URL = "http://10.6.0.11:59300" +MAIL_RECOVERY_URL = "https://shub.pena.digital/recover/" +DISCOUNT_MICROSERVICE_GRPC_URL = "http://10.6.0.11:9001" +TRASH_LOG_HOST = "localhost:7113" # Kafka settings -KAFKA_BROKERS="10.6.0.11:9092" +KAFKA_BROKERS="localhost:9092" KAFKA_TOPIC_TARIFF="tariffs" diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..5d17c60 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,24 @@ +name: Deploy +run-name: ${{ gitea.actor }} build image and push to container registry + +on: + push: + branches: + - 'main' + - 'staging' + +jobs: + CreateImage: + runs-on: [hubstaging] + uses: http://gitea.pena/PenaDevops/actions.git/.gitea/workflows/build-image.yml@v1.1.6-p + with: + runner: hubstaging + secrets: + REGISTRY_USER: ${{ secrets.REGISTRY_USER }} + REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} + DeployService: + runs-on: [hubstaging] + needs: CreateImage + uses: http://gitea.pena/PenaDevops/actions.git/.gitea/workflows/deploy.yml@v1.1.4-p7 + with: + runner: hubstaging diff --git a/.gitea/workflows/lint.yml b/.gitea/workflows/lint.yml new file mode 100644 index 0000000..0bd7867 --- /dev/null +++ b/.gitea/workflows/lint.yml @@ -0,0 +1,14 @@ +name: Lint +run-name: ${{ gitea.actor }} produce linting + +on: + push: + branches: + - 'dev' + +jobs: + Lint: + runs-on: [hubstaging] + uses: http://gitea.pena/PenaDevops/actions.git/.gitea/workflows/lint.yml@v1.1.2 + with: + runner: hubstaging diff --git a/.gitignore b/.gitignore index 38a452d..99feb3c 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,4 @@ fabric.properties # End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,goland,go /recover.bolt +main diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 0f14ba6..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,38 +0,0 @@ -include: - - project: "devops/pena-continuous-integration" - file: "/templates/docker/build-template.gitlab-ci.yml" - - project: "devops/pena-continuous-integration" - file: "/templates/docker/deploy-template.gitlab-ci.yml" - - project: "devops/pena-continuous-integration" - file: "/templates/docker/golint.gitlab-ci.yml" - - project: "devops/pena-continuous-integration" - file: "/templates/docker/service-discovery.gitlab-ci.yml" -stages: - - lint - - build - - deploy - - service-discovery - -lint: - extends: .golint_template - -build-app: - extends: .build_template - -deploy-to-staging: - rules: - - if: "$CI_COMMIT_BRANCH == $STAGING_BRANCH" - extends: .deploy_template - tags: - - staging - extends: .deploy_template - -deploy-to-prod: - rules: - - if: "$CI_COMMIT_BRANCH == $PRODUCTION_BRANCH" - tags: - - prod - extends: .deploy_template - -service-discovery: - extends: .sd_artefacts_template diff --git a/Dockerfile b/Dockerfile index feb89c7..ad0919c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # BUILD -FROM penahub.gitlab.yandexcloud.net:5050/devops/dockerhub-backup/golang AS build +FROM gitea.pena/penadevops/container-images/golang:main as build # Update packages and clear cache RUN apk add --no-cache curl @@ -10,14 +10,12 @@ RUN mkdir /app/bin -p # Add main files to app RUN apk add git ADD . . -ENV GOPRIVATE=penahub.gitlab.yandexcloud.net/backend/penahub_common -RUN git config --global url."https://buildToken:glpat-axA8ttckx3aPf_xd2Dym@penahub.gitlab.yandexcloud.net/".insteadOf "https://penahub.gitlab.yandexcloud.net/" RUN go mod download # Build app RUN GOOS=linux go build -o bin ./... # PRODUCTION -FROM penahub.gitlab.yandexcloud.net:5050/devops/dockerhub-backup/alpine AS production +FROM gitea.pena/penadevops/container-images/alpine:main # Install packages RUN apk --no-cache add ca-certificates diff --git a/Taskfile.dist.yml b/Taskfile.dist.yml index c96d07c..bac807b 100644 --- a/Taskfile.dist.yml +++ b/Taskfile.dist.yml @@ -3,8 +3,8 @@ version: "3" tasks: update-linter: cmds: - - go get -u penahub.gitlab.yandexcloud.net/devops/linters/golang.git + - go get -u gitea.pena/PenaSide/linters-golang lint: cmds: - task: update-linter - - cmd: golangci-lint run -v -c $(go list -f '{{"{{"}}.Dir{{"}}"}}' -m penahub.gitlab.yandexcloud.net/devops/linters/golang.git)/.golangci.yml + - cmd: golangci-lint run -v -c $(go list -f '{{"{{"}}.Dir{{"}}"}}' -m gitea.pena/PenaSide/linters-golang)/.golangci.yml diff --git a/cmd/codeword/main.go b/cmd/codeword/main.go index 01aa102..a1fef7e 100644 --- a/cmd/codeword/main.go +++ b/cmd/codeword/main.go @@ -1,16 +1,16 @@ package main import ( - "codeword/internal/app" - "codeword/internal/initialize" "context" "fmt" + "gitea.pena/PenaSide/codeword/internal/app" + "gitea.pena/PenaSide/codeword/internal/initialize" "go.uber.org/zap" "os" "os/signal" + _ "gitea.pena/PenaSide/linters-golang/pkg/dummy" "syscall" "time" - _ "penahub.gitlab.yandexcloud.net/devops/linters/golang.git/pkg/dummy" ) var ( diff --git a/cmd/validator/main.go b/cmd/validator/main.go new file mode 100644 index 0000000..3fc8565 --- /dev/null +++ b/cmd/validator/main.go @@ -0,0 +1,107 @@ +package main + +import ( + "errors" + "fmt" + "gitea.pena/PenaSide/codeword/internal/initialize" + "gitea.pena/PenaSide/codeword/internal/utils/encrypt" + "gitea.pena/PenaSide/common/validate" + "github.com/caarlos0/env/v8" + "log" +) + +func main() { + config, err := loadConfig() + if err != nil { + log.Fatalf("error loading config: %v", err) + } + + urls := []string{ + config.AuthMicroserviceURL, + config.DiscountMicroserviceGRPC, + config.TrashLogHost, + config.ExternalCfg.MailClientCfg.ApiURL, + config.DefaultRedirectionURL, + config.MailRecoveryURL, + } + if err = validateURLs(urls); err != nil { + log.Fatalf("error validating urls: %v", err) + } + + if err = validateEncrypt(config); err != nil { + log.Fatalf("error validating encrypt: %v", err) + } + + if err = validate.ValidateRedis(config.RedisHost, config.RedisPassword, config.RedisDB); err != nil { + log.Fatalf("error validating redis: %v", err) + } + + if err = validate.ValidateKafka(config.KafkaBrokers, config.KafkaTopicTariff); err != nil { + log.Fatalf("error validating kafka: %v", err) + } + + if err = validate.ValidateSmtp(config.ExternalCfg.MailClientCfg.ApiKey); err != nil { + log.Fatalf("error validating smtp: %v", err) + } + + if err = validate.ValidateMongo(config.ExternalCfg.Database); err != nil { + log.Fatalf("error validating mongodb: %v", err) + } + +} + +func loadConfig() (*initialize.Config, error) { + var config initialize.Config + + if err := env.Parse(&config); err != nil { + return nil, err + } + + return &config, nil +} + +func validateURLs(urls []string) error { + for index, u := range urls { + if u == "" { + return fmt.Errorf("empty url, index: %d", index) + } + // todo check the liveness of these URLs, many services do not support + } + return nil +} + +func validateEncrypt(cfg *initialize.Config) error { + if cfg.EncryptPrivateKey == "" { + return errors.New("encrypt private key dont be empty") + } + + if cfg.EncryptPublicKey == "" { + return errors.New("encrypt public key dont be empty") + } + + if cfg.EncryptSignSecret == "" { + return errors.New("encrypt sign secret dont be empty") + } + + encryptUtil := encrypt.New(&encrypt.EncryptDeps{ + PrivateKey: cfg.EncryptPrivateKey, + PublicKey: cfg.EncryptPublicKey, + SignSecret: cfg.EncryptSignSecret, + }) + + sign, err := encryptUtil.SignCommonSecret() + if err != nil { + return err + } + + ok, err := encryptUtil.VerifySignature(sign) + if err != nil { + return err + } + + if !ok { + return errors.New("failed verify signature, invalid keys") + } + + return nil +} diff --git a/cmd/validator/main_test.go b/cmd/validator/main_test.go new file mode 100644 index 0000000..8b42512 --- /dev/null +++ b/cmd/validator/main_test.go @@ -0,0 +1,16 @@ +package main + +import ( + "gitea.pena/PenaSide/codeword/internal/initialize" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestValidateEncrypt(t *testing.T) { + err := validateEncrypt(&initialize.Config{ + EncryptPublicKey: "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAEbnIvjIMle4rqVol6K2XUqOxHy1KJoNoZdKJrRUPKL4=\n-----END PUBLIC KEY-----", + EncryptPrivateKey: "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIKn0BKwF3vZvODgWAnUIwQhd8de5oZhY48gc23EWfrfs\n-----END PRIVATE KEY-----", + EncryptSignSecret: "pena-auth-microservice-group", + }) + assert.NoError(t, err) +} diff --git a/deployments/staging/docker-compose.yaml b/deployments/staging/docker-compose.yaml index e59b90d..deb6db7 100644 --- a/deployments/staging/docker-compose.yaml +++ b/deployments/staging/docker-compose.yaml @@ -2,48 +2,34 @@ version: '3.3' services: codewordv1.0.0: - hostname: codewordv1.0.0 - container_name: codewordv1.0.0 - image: $CI_REGISTRY_IMAGE/staging:$CI_COMMIT_REF_SLUG.$CI_PIPELINE_ID + image: gitea.pena:3000/penaside/codeword/staging:$GITHUB_RUN_NUMBER tty: true environment: APP_NAME: 'codeword' - HTTP_CLIENT_HOST: '0.0.0.0' - HTTP_CLIENT_PORT: '3000' - HTTP_ADMIN_HOST: '0.0.0.0' - HTTP_ADMIN_PORT: '3001' - MONGO_HOST: '10.8.0.6' - MONGO_PORT: '27017' - MONGO_USER: 'auth-service-user' - MONGO_PASSWORD: 'LFYFpTvqtxSzXDJV' - MONGO_DB: 'auth' - MONGO_AUTH: 'auth' - PUBLIC_CURVE_KEY: "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAEbnIvjIMle4rqVol6K2XUqOxHy1KJoNoZdKJrRUPKL4=\n-----END PUBLIC KEY-----" - PRIVATE_CURVE_KEY: "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIKn0BKwF3vZvODgWAnUIwQhd8de5oZhY48gc23EWfrfs\n-----END PRIVATE KEY-----" - SIGN_SECRET: 'pena-auth-microservice-group' - REDIS_ADDR: '10.8.0.5:6379' - REDIS_PASS: 'Redalert2' + CLIENT_HTTP_URL: '0.0.0.0:3000' + ADMIN_HTTP_URL: '0.0.0.0:3001' + MONGO_URL: mongodb://auth-service-user:LFYFpTvqtxSzXDJV@10.7.0.6:27017/?authSource=auth + ENCRYPT_PUBLIC_KEY: "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAEbnIvjIMle4rqVol6K2XUqOxHy1KJoNoZdKJrRUPKL4=\n-----END PUBLIC KEY-----" + ENCRYPT_PRIVATE_KEY: "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIKn0BKwF3vZvODgWAnUIwQhd8de5oZhY48gc23EWfrfs\n-----END PRIVATE KEY-----" + ENCRYPT_SIGN_SECRET: 'pena-auth-microservice-group' + REDIS_HOST: '10.7.0.6:6379' + REDIS_PASSWORD: 'Redalert2' REDIS_DB: 3 - SMTP_API_URL: 'https://api.smtp.bz/v1/smtp/send' - SMTP_HOST: 'connect.mailclient.bz' - SMTP_PORT: '587' - SMTP_UNAME: 'kotilion.95@gmail.com' - SMTP_PASS: 'vWwbCSg4bf0p' - SMTP_API_KEY: 'P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev' - SMTP_SENDER: 'noreply@mailing.pena.digital' + API_URL: 'https://api.smtp.bz/v1/smtp/send' + MAIL_API_KEY: 'P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev' + MAIL_SENDER: 'noreply@mailing.pena.digital' DEFAULT_REDIRECTION_URL: 'https://shub.pena.digital/' - AUTH_EXCHANGE_URL: 'http://10.8.0.6:59300/auth/exchange' + AUTH_EXCHANGE_URL: 'http://10.7.0.6:59300/auth/exchange' RECOVERY_URL: 'https://shub.pena.digital/codeword/v1.0.0/recover/' JWT_AUDIENCE: 'pena' JWT_ISSUER: 'pena-auth-service' JWT_PUBLIC_KEY: $JWT_PUBLIC_KEY - KAFKA_BROKERS: "10.8.0.6:9092" + KAFKA_BROKERS: "10.7.0.6:9092" KAFKA_TOPIC_TARIFF: "tariffs" - DISCOUNT_ADDRESS: "10.8.0.6:9001" + DISCOUNT_ADDRESS: "10.7.0.6:9001" GRPC_HOST: "0.0.0.0" - TRASH_LOG_HOST: "10.8.0.15:7113" - MODULE_LOGGER: "codeword-staging" + TRASH_LOG_HOST: "10.7.0.5:7113" ports: - - 10.8.0.6:19100:3000 - - 10.8.0.6:29100:3001 - - 10.8.0.6:39100:9000 + - 10.7.0.6:19100:3000 + - 10.7.0.6:29100:3001 + - 10.7.0.6:39100:9000 diff --git a/go.mod b/go.mod index 0d290cf..863baa1 100644 --- a/go.mod +++ b/go.mod @@ -1,27 +1,29 @@ -module codeword +module gitea.pena/PenaSide/codeword -go 1.22.2 +go 1.23.2 + +toolchain go1.23.4 require ( + gitea.pena/PenaSide/common v0.0.0-20250103085335-91ea31fee517 + gitea.pena/PenaSide/hlog v0.0.0-20241125221102-a54c29c002a9 + gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735 + gitea.pena/PenaSide/trashlog v0.0.0-20241210185614-9ec567aa311f github.com/caarlos0/env/v8 v8.0.0 github.com/go-redis/redis/v8 v8.11.5 - github.com/gofiber/fiber/v2 v2.51.0 + github.com/gofiber/fiber/v2 v2.52.5 github.com/golang-jwt/jwt/v5 v5.2.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/joho/godotenv v1.5.1 github.com/pioz/faker v1.7.3 - github.com/rs/xid v1.5.0 - github.com/stretchr/testify v1.8.4 - github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf - github.com/twmb/franz-go v1.15.4 + github.com/rs/xid v1.6.0 + github.com/stretchr/testify v1.9.0 + github.com/twmb/franz-go v1.18.0 go.mongodb.org/mongo-driver v1.13.1 go.uber.org/zap v1.27.0 google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac google.golang.org/grpc v1.60.1 google.golang.org/protobuf v1.32.0 - penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607202348-efe5f2bf3e8c - penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3 - penahub.gitlab.yandexcloud.net/external/trashlog v0.1.5 ) require ( @@ -31,22 +33,28 @@ require ( github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/go-ini/ini v1.67.0 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.1 // indirect - github.com/google/uuid v1.4.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/minio-go/v7 v7.0.81 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect - github.com/pierrec/lz4/v4 v4.1.19 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/skeris/appInit v1.0.2 // indirect - github.com/twmb/franz-go/pkg/kmsg v1.7.0 // indirect + github.com/twmb/franz-go/pkg/kmsg v1.9.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.50.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect @@ -54,14 +62,15 @@ require ( github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect go.etcd.io/bbolt v1.3.6 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/tucnak/telebot.v2 v2.5.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3 // indirect ) diff --git a/go.sum b/go.sum index ae06b14..69a2bc1 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,12 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +gitea.pena/PenaSide/common v0.0.0-20250103085335-91ea31fee517 h1:EgBe8VcdPwmxbSzYLndncP+NmR73uYuXxkTeDlEttEE= +gitea.pena/PenaSide/common v0.0.0-20250103085335-91ea31fee517/go.mod h1:91EuBCgcqgJ6mG36n2pds8sPwwfaJytLWOzY3h2YFKU= +gitea.pena/PenaSide/hlog v0.0.0-20241125221102-a54c29c002a9 h1:tBkXWNIt8icmkMMnq8MA421RWkUy4OZh5P7C3q8uCu4= +gitea.pena/PenaSide/hlog v0.0.0-20241125221102-a54c29c002a9/go.mod h1:sanhSL8aEsfcq21P+eItYiAnKAre+B67nGJmDfk2cf0= +gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735 h1:jDVeUhGBTXBibmW5dmtJg2m2+z5z2Rf6J4G0LpjVoJ0= +gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735/go.mod h1:gdd+vOT6up9STkEbxa2qESLIMZFjCmRbkcheFQCVgZU= +gitea.pena/PenaSide/trashlog v0.0.0-20241210185614-9ec567aa311f h1:vwuUtO03Qowaf2XtSxDeI817+MsvPp/M4jAC2ecYr1M= +gitea.pena/PenaSide/trashlog v0.0.0-20241210185614-9ec567aa311f/go.mod h1:GRfWJerTUlgy82CiYAxE4tVYSVV54zEJJQy17Fx46E4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= @@ -21,6 +29,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -29,14 +39,18 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ= -github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= @@ -57,8 +71,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= @@ -67,8 +81,11 @@ github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwA github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -85,6 +102,10 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.81 h1:SzhMN0TQ6T/xSBu6Nvw3M5M8voM+Ht8RH3hE8S7zxaA= +github.com/minio/minio-go/v7 v7.0.81/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -96,8 +117,8 @@ github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5h github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4= -github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pioz/faker v1.7.3 h1:Tez8Emuq0UN+/d6mo3a9m/9ZZ/zdfJk0c5RtRatrceM= github.com/pioz/faker v1.7.3/go.mod h1:xSpay5w/oz1a6+ww0M3vfpe40pSIykeUPeWEc3TvVlc= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -109,8 +130,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/skeris/appInit v1.0.2 h1:Hr4KbXYd6kolTVq4cXGqDpgnpmaauiOiKizA1+Ep4KQ= github.com/skeris/appInit v1.0.2/go.mod h1:4ElEeXWVGzU3dlYq/eMWJ/U5hd+LKisc1z3+ySh1XmY= @@ -122,20 +143,18 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P 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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33 h1:N9f/Q+2Ssa+yDcbfaoLTYvXmdeyUUxsJKdPUVsjSmiA= github.com/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33/go.mod h1:rpcH99JknBh8seZmlOlUg51gasZH6QH34oXNsIwYT6E= -github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf h1:TJJm6KcBssmbWzplF5lzixXl1RBAi/ViPs1GaSOkhwo= -github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf/go.mod h1:1FsorU3vnXO9xS9SrhUp8fRb/6H/Zfll0rPt1i4GWaA= -github.com/twmb/franz-go v1.15.4 h1:qBCkHaiutetnrXjAUWA99D9FEcZVMt2AYwkH3vWEQTw= -github.com/twmb/franz-go v1.15.4/go.mod h1:rC18hqNmfo8TMc1kz7CQmHL74PLNF8KVvhflxiiJZCU= -github.com/twmb/franz-go/pkg/kmsg v1.7.0 h1:a457IbvezYfA5UkiBvyV3zj0Is3y1i8EJgqjJYoij2E= -github.com/twmb/franz-go/pkg/kmsg v1.7.0/go.mod h1:se9Mjdt0Nwzc9lnjJ0HyDtLyBnaBDAd7pCje47OhSyw= +github.com/twmb/franz-go v1.18.0 h1:25FjMZfdozBywVX+5xrWC2W+W76i0xykKjTdEeD2ejw= +github.com/twmb/franz-go v1.18.0/go.mod h1:zXCGy74M0p5FbXsLeASdyvfLFsBvTubVqctIaa5wQ+I= +github.com/twmb/franz-go/pkg/kmsg v1.9.0 h1:JojYUph2TKAau6SBtErXpXGC7E3gg4vGZMv9xFU/B6M= +github.com/twmb/franz-go/pkg/kmsg v1.9.0/go.mod h1:CMbfazviCyY6HM0SXuG5t9vOwYDHRCSrJJyBAe5paqg= 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.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e9M= -github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -173,8 +192,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -195,8 +214,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -204,8 +223,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -219,9 +238,10 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc 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.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -230,8 +250,8 @@ 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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -291,13 +311,5 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607202348-efe5f2bf3e8c h1:CWb4UcuNXhd1KTNOmy2U0TJO4+Qxgxrj5cwkyFqbgrk= -penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607202348-efe5f2bf3e8c/go.mod h1:+bPxq2wfW5S1gd+83vZYmHm33AE7nEBfznWS8AM1TKE= -penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240803124813-79e62d2acf3c h1:imtXaIVscs8it6SfAmDxjNxqQSF44GgCTl1N6JT6unA= -penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240803124813-79e62d2acf3c/go.mod h1:i7M72RIpkSjcQtHID6KKj9RT/EYZ1rxS6tIPKWa/BSY= -penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240828181923-80f1728efccc h1:tKp1NYn+FJOq/mCyc4SJjcGdYdr1AhXnyw7f80uex0A= -penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240828181923-80f1728efccc/go.mod h1:i7M72RIpkSjcQtHID6KKj9RT/EYZ1rxS6tIPKWa/BSY= penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3 h1:sf6e2mp582L3i/FMDd2q6QuWm1njRXzYpIX0SipsvM4= penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3/go.mod h1:i7M72RIpkSjcQtHID6KKj9RT/EYZ1rxS6tIPKWa/BSY= -penahub.gitlab.yandexcloud.net/external/trashlog v0.1.5 h1:amsK0bkSJxBisk334aFo5ZmVPvN1dBT0Sv5j3V5IsT8= -penahub.gitlab.yandexcloud.net/external/trashlog v0.1.5/go.mod h1:J8kQNEP4bL7ZNKHxuT4tfe6a3FHyovpAPkyytN4qllc= diff --git a/internal/adapters/client/auth.go b/internal/adapters/client/auth.go index f2af518..38bf73c 100644 --- a/internal/adapters/client/auth.go +++ b/internal/adapters/client/auth.go @@ -1,29 +1,29 @@ package client import ( - "codeword/internal/models" "encoding/json" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) type AuthClientDeps struct { - AuthUrl string - FiberClient *fiber.Client - Logger *zap.Logger + AuthUrl string + Logger *zap.Logger } type AuthClient struct { - deps AuthClientDeps + authUrl string + fiberClient *fiber.Client + logger *zap.Logger } func NewAuthClient(deps AuthClientDeps) *AuthClient { - if deps.FiberClient == nil { - deps.FiberClient = fiber.AcquireClient() - } return &AuthClient{ - deps: deps, + authUrl: deps.AuthUrl, + fiberClient: fiber.AcquireClient(), + logger: deps.Logger, } } @@ -35,30 +35,30 @@ func (a *AuthClient) RefreshAuthToken(userID, signature string) (*models.Refresh bodyBytes, err := json.Marshal(body) if err != nil { - a.deps.Logger.Error("Failed to encode request body", zap.Error(err)) + a.logger.Error("Failed to encode request body", zap.Error(err)) return nil, err } - agent := a.deps.FiberClient.Post(a.deps.AuthUrl) + agent := a.fiberClient.Post(fmt.Sprintf("%s/auth/exchange", a.authUrl)) agent.Set("Content-Type", "application/json").Body(bodyBytes) statusCode, resBody, errs := agent.Bytes() if len(errs) > 0 { for _, err := range errs { - a.deps.Logger.Error("Error in exchange auth token request", zap.Error(err)) + a.logger.Error("Error in exchange auth token request", zap.Error(err)) } return nil, fmt.Errorf("request failed: %v", errs) } if statusCode != fiber.StatusOK { errorMessage := fmt.Sprintf("received an incorrect response from the authentication service: %d", statusCode) - a.deps.Logger.Error(errorMessage, zap.Int("status", statusCode), zap.String("respBody", string(resBody)), zap.String("UserID", userID),zap.String("sign", signature)) + a.logger.Error(errorMessage, zap.Int("status", statusCode), zap.String("respBody", string(resBody)), zap.String("UserID", userID), zap.String("sign", signature)) return nil, fmt.Errorf(errorMessage) } var tokens models.RefreshResponse if err := json.Unmarshal(resBody, &tokens); err != nil { - a.deps.Logger.Error("failed to unmarshal auth service response", zap.Error(err)) + a.logger.Error("failed to unmarshal auth service response", zap.Error(err)) return nil, err } diff --git a/internal/adapters/client/mail.go b/internal/adapters/client/mail.go index 161ae7b..2c3e491 100644 --- a/internal/adapters/client/mail.go +++ b/internal/adapters/client/mail.go @@ -9,46 +9,46 @@ import ( ) type RecoveryEmailSenderDeps struct { - SmtpApiUrl string - SmtpHost string - SmtpPort string - SmtpSender string - Username string - Password string + ApiUrl string + Sender string ApiKey string - FiberClient *fiber.Client Logger *zap.Logger RecoveryUrl string } type RecoveryEmailSender struct { - deps RecoveryEmailSenderDeps + apiUrl string + sender string + apiKey string + fiberClient *fiber.Client + logger *zap.Logger + recoveryUrl string } func NewRecoveryEmailSender(deps RecoveryEmailSenderDeps) *RecoveryEmailSender { - if deps.FiberClient == nil { - deps.FiberClient = fiber.AcquireClient() - } return &RecoveryEmailSender{ - deps: deps, + apiUrl: deps.ApiUrl, + sender: deps.Sender, + apiKey: deps.ApiKey, + fiberClient: fiber.AcquireClient(), + logger: deps.Logger, + recoveryUrl: deps.RecoveryUrl, } } func (r *RecoveryEmailSender) SendRecoveryEmail(email string, signature string) error { - url := r.deps.SmtpApiUrl - fmt.Println(email, signature) message := fmt.Sprintf(`Здравствуйте, ваша ссылка для восстановление пароля(доступна всего 15 минут) -Если это были не вы, напишите пожалуйста в техническую поддержку.`, r.deps.RecoveryUrl + signature) +Если это были не вы, напишите пожалуйста в техническую поддержку.`, r.recoveryUrl+signature) form := new(bytes.Buffer) writer := multipart.NewWriter(form) defer writer.Close() fields := map[string]string{ - "from": r.deps.SmtpSender, + "from": r.sender, "to": email, "subject": "Восстановление доступа", "html": message, @@ -64,20 +64,20 @@ func (r *RecoveryEmailSender) SendRecoveryEmail(email string, signature string) return err } - req := r.deps.FiberClient.Post(url).Body(form.Bytes()).ContentType(writer.FormDataContentType()) - if r.deps.ApiKey != "" { - req.Set("Authorization", r.deps.ApiKey) + req := r.fiberClient.Post(r.apiUrl).Body(form.Bytes()).ContentType(writer.FormDataContentType()) + if r.apiKey != "" { + req.Set("Authorization", r.apiKey) } statusCode, body, errs := req.Bytes() if errs != nil { - r.deps.Logger.Error("Error sending request", zap.Error(errs[0])) + r.logger.Error("Error sending request", zap.Error(errs[0])) return errs[0] } if statusCode != fiber.StatusOK { err := fmt.Errorf("the SMTP service returned an error: %s Response body: %s", statusCode, body) - r.deps.Logger.Error("Error sending email", zap.Error(err)) + r.logger.Error("Error sending email", zap.Error(err)) return err } diff --git a/internal/app/app.go b/internal/app/app.go index 7170007..b8ece20 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -1,29 +1,29 @@ package app import ( - "codeword/internal/controller/admin/admin_promocode" - "codeword/internal/controller/admin/admin_recovery" - "codeword/internal/controller/client/client_promocode" - "codeword/internal/controller/client/client_recovery" - "codeword/internal/controller/rpc_controllers" - "codeword/internal/initialize" - "codeword/internal/models" - "codeword/internal/repository" - "codeword/internal/server/grpc" - httpserver "codeword/internal/server/http" - "codeword/internal/services" - "codeword/internal/utils/middleware" - "codeword/internal/worker/purge_worker" - "codeword/internal/worker/recovery_worker" - "codeword/pkg/closer" "context" "errors" - "github.com/themakers/hlog" + "gitea.pena/PenaSide/codeword/internal/controller/admin/admin_promocode" + "gitea.pena/PenaSide/codeword/internal/controller/admin/admin_recovery" + "gitea.pena/PenaSide/codeword/internal/controller/client/client_promocode" + "gitea.pena/PenaSide/codeword/internal/controller/client/client_recovery" + "gitea.pena/PenaSide/codeword/internal/controller/rpc_controllers" + "gitea.pena/PenaSide/codeword/internal/initialize" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/repository" + "gitea.pena/PenaSide/codeword/internal/server/grpc" + httpserver "gitea.pena/PenaSide/codeword/internal/server/http" + "gitea.pena/PenaSide/codeword/internal/services" + "gitea.pena/PenaSide/codeword/internal/utils/middleware" + "gitea.pena/PenaSide/codeword/internal/worker/purge_worker" + "gitea.pena/PenaSide/codeword/internal/worker/recovery_worker" + "gitea.pena/PenaSide/codeword/pkg/closer" + "gitea.pena/PenaSide/hlog" + "gitea.pena/PenaSide/trashlog/app" + "gitea.pena/PenaSide/trashlog/wrappers/zaptrashlog" "github.com/twmb/franz-go/pkg/kgo" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "penahub.gitlab.yandexcloud.net/external/trashlog/app" - "penahub.gitlab.yandexcloud.net/external/trashlog/wrappers/zaptrashlog" "time" ) @@ -53,7 +53,7 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B return zapcore.NewTee(core, clickHouseLogger) })) - loggerHlog := hlog.New(loggerForHlog).Module(cfg.ModuleLogger) + loggerHlog := hlog.New(loggerForHlog).Module(initialize.ModuleLogger) loggerHlog.With(models.AllFields{}) loggerHlog.Emit(app.InfoSvcStarted{}) @@ -71,9 +71,9 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B } kafkaTariffClient, err := kgo.NewClient( - kgo.SeedBrokers(cfg.KafkaBrokers), + kgo.SeedBrokers(cfg.KafkaBrokers...), kgo.ConsumeResetOffset(kgo.NewOffset().AtStart()), - kgo.DefaultProduceTopic(cfg.KafkaTopic), + kgo.DefaultProduceTopic(cfg.KafkaTopicTariff), ) if err != nil { return err @@ -84,7 +84,7 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B return err } - discountRpcClient, err := initialize.DiscountGRPCClient(cfg.DiscountServiceAddress) + discountRpcClient, err := initialize.DiscountGRPCClient(cfg.DiscountMicroserviceGRPC) if err != nil { logger.Error("failed to connect to discount service", zap.Error(err)) return err @@ -93,7 +93,7 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B brokers := initialize.NewBrokers(initialize.BrokersDeps{ Logger: logger, TariffClient: kafkaTariffClient, - Topic: cfg.KafkaTopic, + Topic: cfg.KafkaTopicTariff, }) rdb, err := initialize.Redis(ctx, cfg) @@ -134,15 +134,13 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B Logger: logger, Service: recoveryService, DefaultURL: cfg.DefaultRedirectionURL, - RecoveryURL: cfg.RecoveryUrl, + RecoveryURL: cfg.MailRecoveryURL, }) clientPromoCodeController := client_promocode.NewPromoCodeController(client_promocode.Deps{Logger: logger, PromoCodeService: promoService}) adminRecoveryController := admin_recovery.NewRecoveryController(admin_recovery.Deps{ - Logger: logger, - Service: recoveryService, - DefaultURL: cfg.DefaultRedirectionURL, - RecoveryURL: cfg.RecoveryUrl, + Logger: logger, + Service: recoveryService, }) adminPromoCodeController := admin_promocode.NewPromoCodeController(admin_promocode.Deps{Logger: logger, PromoCodeService: promoService}) controllerRpc := rpc_controllers.InitRpcControllers(promoService) @@ -184,23 +182,20 @@ func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger, build B }) go func() { - if err := clientServer.Start(cfg.HTTPClientHost + ":" + cfg.HTTPClientPort); err != nil { + if err := clientServer.Start(cfg.ClientHttpURL); err != nil { logger.Error("Client server startup error", zap.Error(err)) cancel() } }() go func() { - if err := adminServer.Start(cfg.HTTPAdminHost + ":" + cfg.HTTPAdminPort); err != nil { + if err := adminServer.Start(cfg.AdminHttpURL); err != nil { logger.Error("Admin server startup error", zap.Error(err)) cancel() } }() - go grpcServer.Run(grpc.DepsGrpcRun{ - Host: cfg.GrpcHost, - Port: cfg.GrpcPort, - }) + go grpcServer.Run(cfg.GrpcURL) clientServer.ListRoutes() adminServer.ListRoutes() diff --git a/internal/controller/admin/admin_promocode/promocode_controller.go b/internal/controller/admin/admin_promocode/promocode_controller.go index 50f2c48..1382326 100644 --- a/internal/controller/admin/admin_promocode/promocode_controller.go +++ b/internal/controller/admin/admin_promocode/promocode_controller.go @@ -1,15 +1,15 @@ package admin_promocode import ( - "codeword/internal/models" - "codeword/internal/repository" - "codeword/internal/services" - "codeword/internal/utils/middleware" "errors" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/repository" + "gitea.pena/PenaSide/codeword/internal/services" + "gitea.pena/PenaSide/codeword/internal/utils/middleware" "github.com/gofiber/fiber/v2" "go.uber.org/zap" - "penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw" + "gitea.pena/PenaSide/common/log_mw" ) type Deps struct { diff --git a/internal/controller/admin/admin_recovery/recovery_controller.go b/internal/controller/admin/admin_recovery/recovery_controller.go index f5669a5..9d526d9 100644 --- a/internal/controller/admin/admin_recovery/recovery_controller.go +++ b/internal/controller/admin/admin_recovery/recovery_controller.go @@ -1,33 +1,27 @@ package admin_recovery import ( - "codeword/internal/services" "fmt" + "gitea.pena/PenaSide/codeword/internal/services" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "time" ) type Deps struct { - Logger *zap.Logger - Service *services.RecoveryService - DefaultURL string - RecoveryURL string + Logger *zap.Logger + Service *services.RecoveryService } type RecoveryController struct { - logger *zap.Logger - service *services.RecoveryService - defaultURL string - recoveryURL string + logger *zap.Logger + service *services.RecoveryService } func NewRecoveryController(deps Deps) *RecoveryController { return &RecoveryController{ - logger: deps.Logger, - service: deps.Service, - defaultURL: deps.DefaultURL, - recoveryURL: deps.RecoveryURL, + logger: deps.Logger, + service: deps.Service, } } diff --git a/internal/controller/client/client_promocode/promocode_controller.go b/internal/controller/client/client_promocode/promocode_controller.go index 2939ec2..8b82236 100644 --- a/internal/controller/client/client_promocode/promocode_controller.go +++ b/internal/controller/client/client_promocode/promocode_controller.go @@ -1,15 +1,15 @@ package client_promocode import ( - "codeword/internal/models" - "codeword/internal/repository" - "codeword/internal/services" - "codeword/internal/utils/middleware" "errors" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/repository" + "gitea.pena/PenaSide/codeword/internal/services" + "gitea.pena/PenaSide/codeword/internal/utils/middleware" "github.com/gofiber/fiber/v2" "go.uber.org/zap" - "penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw" + "gitea.pena/PenaSide/common/log_mw" ) type Deps struct { diff --git a/internal/controller/client/client_recovery/recovery_controller.go b/internal/controller/client/client_recovery/recovery_controller.go index 5f53b3d..81d23f2 100644 --- a/internal/controller/client/client_recovery/recovery_controller.go +++ b/internal/controller/client/client_recovery/recovery_controller.go @@ -1,14 +1,14 @@ package client_recovery import ( - "codeword/internal/models" - "codeword/internal/repository" - "codeword/internal/services" "encoding/base64" "errors" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/repository" + "gitea.pena/PenaSide/codeword/internal/services" "github.com/gofiber/fiber/v2" "go.uber.org/zap" - "penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw" + "gitea.pena/PenaSide/common/log_mw" "time" ) diff --git a/internal/controller/rpc_controllers/promoCode.go b/internal/controller/rpc_controllers/promoCode.go index 3aa237f..ae19386 100644 --- a/internal/controller/rpc_controllers/promoCode.go +++ b/internal/controller/rpc_controllers/promoCode.go @@ -1,6 +1,6 @@ package rpc_controllers -import "codeword/internal/services" +import "gitea.pena/PenaSide/codeword/internal/services" type RpcRegister struct { Service *services.PromoCodeService diff --git a/internal/initialize/clients.go b/internal/initialize/clients.go index e32051b..3ef8e41 100644 --- a/internal/initialize/clients.go +++ b/internal/initialize/clients.go @@ -1,30 +1,23 @@ package initialize import ( - "codeword/internal/adapters/client" - "github.com/gofiber/fiber/v2" + "gitea.pena/PenaSide/codeword/internal/adapters/client" "go.uber.org/zap" ) func RecoveryEmailSender(cfg Config, logger *zap.Logger) *client.RecoveryEmailSender { return client.NewRecoveryEmailSender(client.RecoveryEmailSenderDeps{ - SmtpApiUrl: cfg.SmtpApiUrl, - SmtpHost: cfg.SmtpHost, - SmtpPort: cfg.SmtpPort, - SmtpSender: cfg.SmtpSender, - Username: cfg.SmtpUsername, - Password: cfg.SmtpPassword, - ApiKey: cfg.SmtpApiKey, - FiberClient: &fiber.Client{}, + ApiUrl: cfg.ExternalCfg.MailClientCfg.ApiURL, + Sender: cfg.ExternalCfg.MailClientCfg.Sender, + ApiKey: cfg.ExternalCfg.MailClientCfg.ApiKey, Logger: logger, - RecoveryUrl: cfg.RecoveryUrl, + RecoveryUrl: cfg.MailRecoveryURL, }) } func AuthClient(cfg Config, logger *zap.Logger) *client.AuthClient { return client.NewAuthClient(client.AuthClientDeps{ - AuthUrl: cfg.AuthURL, - Logger: logger, - FiberClient: &fiber.Client{}, + AuthUrl: cfg.AuthMicroserviceURL, + Logger: logger, }) } diff --git a/internal/initialize/config.go b/internal/initialize/config.go index 284d518..ce8b60e 100644 --- a/internal/initialize/config.go +++ b/internal/initialize/config.go @@ -1,50 +1,50 @@ package initialize import ( + "gitea.pena/PenaSide/common/mongo" "github.com/caarlos0/env/v8" "github.com/joho/godotenv" "log" ) type Config struct { - AppName string `env:"APP_NAME" envDefault:"codeword"` - HTTPClientHost string `env:"HTTP_CLIENT_HOST" envDefault:"localhost"` - HTTPClientPort string `env:"HTTP_CLIENT_PORT" envDefault:"3000"` - HTTPAdminHost string `env:"HTTP_ADMIN_HOST" envDefault:"localhost"` - HTTPAdminPort string `env:"HTTP_ADMIN_PORT" envDefault:"3001"` - MongoHost string `env:"MONGO_HOST" envDefault:"127.0.0.1"` - MongoPort string `env:"MONGO_PORT" envDefault:"27020"` - MongoUser string `env:"MONGO_USER" envDefault:"test"` - MongoPassword string `env:"MONGO_PASSWORD" envDefault:"test"` - MongoDatabase string `env:"MONGO_DB" envDefault:"admin"` - MongoAuth string `env:"MONGO_AUTH" envDefault:"admin"` - PublicCurveKey string `env:"PUBLIC_CURVE_KEY"` - PrivateCurveKey string `env:"PRIVATE_CURVE_KEY"` - SignSecret string `env:"SIGN_SECRET"` - RedisAddr string `env:"REDIS_ADDR" envDefault:"localhost:6379"` - RedisPassword string `env:"REDIS_PASS" envDefault:"admin"` - RedisDB int `env:"REDIS_DB" envDefault:"2"` - SmtpApiUrl string `env:"SMTP_API_URL"` - SmtpHost string `env:"SMTP_HOST"` - SmtpPort string `env:"SMTP_PORT"` - SmtpUsername string `env:"SMTP_UNAME"` - SmtpPassword string `env:"SMTP_PASS"` - SmtpApiKey string `env:"SMTP_API_KEY"` - SmtpSender string `env:"SMTP_SENDER"` - DefaultRedirectionURL string `env:"DEFAULT_REDIRECTION_URL"` - AuthURL string `env:"AUTH_EXCHANGE_URL"` - KafkaBrokers string `env:"KAFKA_BROKERS"` - KafkaTopic string `env:"KAFKA_TOPIC_TARIFF"` - DiscountServiceAddress string `env:"DISCOUNT_ADDRESS"` - RecoveryUrl string `env:"RECOVERY_URL"` - PrivateKey string `env:"JWT_PRIVATE_KEY"` - PublicKey string `env:"JWT_PUBLIC_KEY,required"` - Issuer string `env:"JWT_ISSUER,required"` - Audience string `env:"JWT_AUDIENCE,required"` - GrpcHost string `env:"GRPC_HOST" envDefault:"localhost"` - GrpcPort string `env:"GRPC_PORT" envDefault:"9000"` - TrashLogHost string `env:"TRASH_LOG_HOST" envDefault:"localhost:7113"` - ModuleLogger string `env:"MODULE_LOGGER" envDefault:"codeword-local"` + AppName string `env:"APP_NAME" envDefault:"codeword"` + ClientHttpURL string `env:"CLIENT_HTTP_URL,required" envDefault:"localhost:3000"` + AdminHttpURL string `env:"ADMIN_HTTP_URL,required" envDefault:"localhost:3001"` + GrpcURL string `env:"GRPC_URL,required" envDefault:"localhost:9000"` + RedisHost string `env:"REDIS_HOST,required" envDefault:"localhost:6379"` + RedisPassword string `env:"REDIS_PASSWORD,required" envDefault:"admin"` + RedisDB int `env:"REDIS_DB,required" envDefault:"2"` + KafkaTopicTariff string `env:"KAFKA_TOPIC_TARIFF,required"` + KafkaBrokers []string `env:"KAFKA_BROKERS,required"` + AuthMicroserviceURL string `env:"AUTH_MICROSERVICE_URL,required"` + DiscountMicroserviceGRPC string `env:"DISCOUNT_MICROSERVICE_GRPC_URL,required"` + TrashLogHost string `env:"TRASH_LOG_HOST,required" envDefault:"localhost:7113"` + MailRecoveryURL string `env:"MAIL_RECOVERY_URL,required"` + EncryptPublicKey string `env:"ENCRYPT_PUBLIC_KEY,required"` + EncryptPrivateKey string `env:"ENCRYPT_PRIVATE_KEY,required"` + EncryptSignSecret string `env:"ENCRYPT_SIGN_SECRET,required"` + DefaultRedirectionURL string `env:"DEFAULT_REDIRECTION_URL,required"` + ExternalCfg ExternalCfg +} + +type ExternalCfg struct { + MailClientCfg MailClientCfg + Database mongo.Configuration + JwtCfg JWTConfiguration +} + +type MailClientCfg struct { + ApiURL string `env:"API_URL,required"` + Sender string `env:"MAIL_SENDER,required"` + ApiKey string `env:"MAIL_API_KEY,required"` +} + +type JWTConfiguration struct { + PrivateKey string `env:"JWT_PRIVATE_KEY"` + PublicKey string `env:"JWT_PUBLIC_KEY,required"` + Issuer string `env:"JWT_ISSUER,required"` + Audience string `env:"JWT_AUDIENCE,required"` } func LoadConfig() (*Config, error) { @@ -57,3 +57,5 @@ func LoadConfig() (*Config, error) { } return &config, nil } + +const ModuleLogger = "codeword" diff --git a/internal/initialize/encrypt.go b/internal/initialize/encrypt.go index 366147d..49c9fdf 100644 --- a/internal/initialize/encrypt.go +++ b/internal/initialize/encrypt.go @@ -1,13 +1,13 @@ package initialize import ( - "codeword/internal/utils/encrypt" + "gitea.pena/PenaSide/codeword/internal/utils/encrypt" ) func Encrypt(cfg Config) *encrypt.Encrypt { return encrypt.New(&encrypt.EncryptDeps{ - PublicKey: cfg.PublicCurveKey, - PrivateKey: cfg.PrivateCurveKey, - SignSecret: cfg.SignSecret, + PublicKey: cfg.EncryptPublicKey, + PrivateKey: cfg.EncryptPrivateKey, + SignSecret: cfg.EncryptSignSecret, }) } diff --git a/internal/initialize/grpc.go b/internal/initialize/grpc.go index 692ca21..4aedb21 100644 --- a/internal/initialize/grpc.go +++ b/internal/initialize/grpc.go @@ -1,8 +1,8 @@ package initialize import ( - "codeword/internal/proto/discount" "context" + "gitea.pena/PenaSide/codeword/internal/proto/discount" "google.golang.org/grpc" "time" ) diff --git a/internal/initialize/kafka.go b/internal/initialize/kafka.go index 8b4019d..e61ea9e 100644 --- a/internal/initialize/kafka.go +++ b/internal/initialize/kafka.go @@ -1,7 +1,7 @@ package initialize import ( - "codeword/internal/kafka/tariff" + "gitea.pena/PenaSide/codeword/internal/kafka/tariff" "github.com/twmb/franz-go/pkg/kgo" "go.uber.org/zap" ) diff --git a/internal/initialize/mongo.go b/internal/initialize/mongo.go index c947b4a..4ed9b2b 100644 --- a/internal/initialize/mongo.go +++ b/internal/initialize/mongo.go @@ -1,29 +1,20 @@ package initialize import ( - "codeword/internal/repository" "context" + "gitea.pena/PenaSide/codeword/internal/repository" + mdb "gitea.pena/PenaSide/common/mongo" "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" - mdb "penahub.gitlab.yandexcloud.net/backend/penahub_common/mongo" "time" ) func MongoDB(ctx context.Context, cfg Config) (*mongo.Database, error) { - dbConfig := &mdb.Configuration{ - Host: cfg.MongoHost, - Port: cfg.MongoPort, - User: cfg.MongoUser, - Password: cfg.MongoPassword, - DatabaseName: cfg.MongoDatabase, - Auth: cfg.MongoAuth, - } - newCtx, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() mongoDeps := &mdb.ConnectDeps{ - Configuration: dbConfig, + Configuration: &cfg.ExternalCfg.Database, Timeout: 10 * time.Second, } diff --git a/internal/initialize/redis.go b/internal/initialize/redis.go index d8de002..6b9cd53 100644 --- a/internal/initialize/redis.go +++ b/internal/initialize/redis.go @@ -7,7 +7,7 @@ import ( func Redis(ctx context.Context, cfg Config) (*redis.Client, error) { rdb := redis.NewClient(&redis.Options{ - Addr: cfg.RedisAddr, + Addr: cfg.RedisHost, Password: cfg.RedisPassword, DB: cfg.RedisDB, }) diff --git a/internal/kafka/tariff/producer.go b/internal/kafka/tariff/producer.go index b7fd098..50d15dd 100644 --- a/internal/kafka/tariff/producer.go +++ b/internal/kafka/tariff/producer.go @@ -1,14 +1,14 @@ package tariff import ( - "codeword/internal/models" - "codeword/internal/utils/transfer" "context" + "fmt" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/utils/transfer" "github.com/twmb/franz-go/pkg/kgo" "go.uber.org/zap" "google.golang.org/protobuf/proto" "log" - "fmt" ) type ProducerDeps struct { diff --git a/internal/models/tariff.go b/internal/models/tariff.go index 00da357..96bef67 100644 --- a/internal/models/tariff.go +++ b/internal/models/tariff.go @@ -1,7 +1,7 @@ package models import ( - "codeword/internal/proto/broker" + "gitea.pena/PenaSide/codeword/internal/proto/broker" "time" ) diff --git a/internal/repository/codeword_repository.go b/internal/repository/codeword_repository.go index d2a9fec..46bfd9a 100644 --- a/internal/repository/codeword_repository.go +++ b/internal/repository/codeword_repository.go @@ -1,9 +1,9 @@ package repository import ( - "codeword/internal/models" "context" "encoding/json" + "gitea.pena/PenaSide/codeword/internal/models" "github.com/go-redis/redis/v8" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" diff --git a/internal/repository/promocode_repository.go b/internal/repository/promocode_repository.go index 5fa9246..e4d3aa3 100644 --- a/internal/repository/promocode_repository.go +++ b/internal/repository/promocode_repository.go @@ -1,8 +1,8 @@ package repository import ( - "codeword/internal/models" "context" + "gitea.pena/PenaSide/codeword/internal/models" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" diff --git a/internal/repository/promocode_stats.go b/internal/repository/promocode_stats.go index b438d45..ec1480f 100644 --- a/internal/repository/promocode_stats.go +++ b/internal/repository/promocode_stats.go @@ -1,9 +1,9 @@ package repository import ( - "codeword/internal/models" - codeword_rpc "codeword/internal/proto/codeword" "context" + "gitea.pena/PenaSide/codeword/internal/models" + codeword_rpc "gitea.pena/PenaSide/codeword/internal/proto/codeword" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" diff --git a/internal/repository/user_repository.go b/internal/repository/user_repository.go index 97a62ae..3934783 100644 --- a/internal/repository/user_repository.go +++ b/internal/repository/user_repository.go @@ -1,8 +1,8 @@ package repository import ( - "codeword/internal/models" "context" + "gitea.pena/PenaSide/codeword/internal/models" "github.com/go-redis/redis/v8" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" diff --git a/internal/server/grpc/rpc_server.go b/internal/server/grpc/rpc_server.go index 75a69fb..4db2523 100644 --- a/internal/server/grpc/rpc_server.go +++ b/internal/server/grpc/rpc_server.go @@ -1,10 +1,10 @@ package grpc import ( - "codeword/internal/controller/rpc_controllers" - codeword_rpc "codeword/internal/proto/codeword" "context" "fmt" + "gitea.pena/PenaSide/codeword/internal/controller/rpc_controllers" + codeword_rpc "gitea.pena/PenaSide/codeword/internal/proto/codeword" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_zap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" @@ -36,13 +36,8 @@ func NewGRPC(logger *zap.Logger) (*GRPC, error) { }, nil } -type DepsGrpcRun struct { - Host string - Port string -} - -func (g *GRPC) Run(config DepsGrpcRun) { - connectionString := fmt.Sprintf("%s:%s", config.Host, config.Port) +func (g *GRPC) Run(addr string) { + connectionString := fmt.Sprintf(addr) g.logger.Info("Starting GRPC Server", zap.String("host", connectionString)) diff --git a/internal/server/http/http_server.go b/internal/server/http/http_server.go index 6df5235..e8f0ab1 100644 --- a/internal/server/http/http_server.go +++ b/internal/server/http/http_server.go @@ -1,13 +1,13 @@ package http import ( - "codeword/internal/utils/middleware" "context" "fmt" + "gitea.pena/PenaSide/codeword/internal/utils/middleware" + "gitea.pena/PenaSide/common/log_mw" + "gitea.pena/PenaSide/hlog" "github.com/gofiber/fiber/v2" - "github.com/themakers/hlog" "go.uber.org/zap" - "penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw" ) type ServerConfig struct { diff --git a/internal/services/promocode_service.go b/internal/services/promocode_service.go index 8d267df..abecdb3 100644 --- a/internal/services/promocode_service.go +++ b/internal/services/promocode_service.go @@ -1,15 +1,15 @@ package services import ( - "codeword/internal/kafka/tariff" - "codeword/internal/models" - codeword_rpc "codeword/internal/proto/codeword" - "codeword/internal/proto/discount" - "codeword/internal/repository" - "codeword/internal/utils/genID" "context" "errors" "fmt" + "gitea.pena/PenaSide/codeword/internal/kafka/tariff" + "gitea.pena/PenaSide/codeword/internal/models" + codeword_rpc "gitea.pena/PenaSide/codeword/internal/proto/codeword" + "gitea.pena/PenaSide/codeword/internal/proto/discount" + "gitea.pena/PenaSide/codeword/internal/repository" + "gitea.pena/PenaSide/codeword/internal/utils/genID" "go.mongodb.org/mongo-driver/bson/primitive" "go.uber.org/zap" "time" diff --git a/internal/services/recovery_service.go b/internal/services/recovery_service.go index 348b834..b8cc633 100644 --- a/internal/services/recovery_service.go +++ b/internal/services/recovery_service.go @@ -1,11 +1,11 @@ package services import ( - "codeword/internal/adapters/client" - "codeword/internal/models" - "codeword/internal/utils/encrypt" "context" "encoding/base64" + "gitea.pena/PenaSide/codeword/internal/adapters/client" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/utils/encrypt" "go.uber.org/zap" ) diff --git a/internal/utils/middleware/authenticator.go b/internal/utils/middleware/authenticator.go index 7ce2108..eb4343a 100644 --- a/internal/utils/middleware/authenticator.go +++ b/internal/utils/middleware/authenticator.go @@ -1,8 +1,8 @@ package middleware import ( - "codeword/internal/models" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" "strings" "github.com/gofiber/fiber/v2" diff --git a/internal/utils/middleware/jwt.go b/internal/utils/middleware/jwt.go index 86b52e7..e4b6bc3 100644 --- a/internal/utils/middleware/jwt.go +++ b/internal/utils/middleware/jwt.go @@ -1,9 +1,9 @@ package middleware import ( - "codeword/internal/initialize" "errors" "fmt" + "gitea.pena/PenaSide/codeword/internal/initialize" "github.com/golang-jwt/jwt/v5" "time" ) @@ -19,10 +19,10 @@ type JWT struct { func NewJWT(configuration *initialize.Config) *JWT { return &JWT{ - privateKey: []byte(configuration.PrivateKey), - publicKey: []byte(configuration.PublicKey), - issuer: configuration.Issuer, - audience: configuration.Audience, + privateKey: []byte(configuration.ExternalCfg.JwtCfg.PrivateKey), + publicKey: []byte(configuration.ExternalCfg.JwtCfg.PublicKey), + issuer: configuration.ExternalCfg.JwtCfg.Issuer, + audience: configuration.ExternalCfg.JwtCfg.Audience, algorithm: jwt.SigningMethodRS256, expiresIn: 15 * time.Minute, } diff --git a/internal/utils/transfer/privilege.go b/internal/utils/transfer/privilege.go index 6affadc..450ab0a 100644 --- a/internal/utils/transfer/privilege.go +++ b/internal/utils/transfer/privilege.go @@ -1,9 +1,9 @@ package transfer import ( - "codeword/internal/models" - "codeword/internal/proto/broker" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/proto/broker" ) func PrivilegeModelToProto(privilege *models.Privilege) *broker.PrivilegeMessage { diff --git a/internal/utils/transfer/tariff.go b/internal/utils/transfer/tariff.go index 592c56e..20c7f3c 100644 --- a/internal/utils/transfer/tariff.go +++ b/internal/utils/transfer/tariff.go @@ -1,8 +1,8 @@ package transfer import ( - "codeword/internal/models" - "codeword/internal/proto/broker" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/proto/broker" ) func TariffModelToProtoMessage(userID string, tariffModel *models.Tariff) *broker.TariffMessage { diff --git a/internal/worker/recovery_worker/recovery_worker.go b/internal/worker/recovery_worker/recovery_worker.go index df79493..a37c343 100644 --- a/internal/worker/recovery_worker/recovery_worker.go +++ b/internal/worker/recovery_worker/recovery_worker.go @@ -1,10 +1,10 @@ package recovery_worker import ( - "codeword/internal/adapters/client" - "codeword/internal/models" "context" "encoding/json" + "gitea.pena/PenaSide/codeword/internal/adapters/client" + "gitea.pena/PenaSide/codeword/internal/models" "github.com/go-redis/redis/v8" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" diff --git a/tests/e2e/promo_test.go b/tests/e2e/promo_test.go index 822dfd1..2cf8a7a 100644 --- a/tests/e2e/promo_test.go +++ b/tests/e2e/promo_test.go @@ -1,10 +1,10 @@ package e2e import ( - "codeword/internal/models" - "codeword/tests/helpers" "encoding/json" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/tests/helpers" "github.com/gofiber/fiber/v2" "github.com/pioz/faker" "github.com/stretchr/testify/assert" diff --git a/tests/e2e/recover_test.go b/tests/e2e/recover_test.go index 0aab88f..0e617c0 100644 --- a/tests/e2e/recover_test.go +++ b/tests/e2e/recover_test.go @@ -1,9 +1,9 @@ package e2e import ( - "codeword/internal/models" "encoding/json" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" "github.com/gofiber/fiber/v2" "github.com/stretchr/testify/assert" "testing" diff --git a/tests/helpers/jwt.go b/tests/helpers/jwt.go index 42becda..1360492 100644 --- a/tests/helpers/jwt.go +++ b/tests/helpers/jwt.go @@ -1,8 +1,8 @@ package helpers import ( - "codeword/internal/initialize" - "codeword/internal/utils/middleware" + "gitea.pena/PenaSide/codeword/internal/initialize" + "gitea.pena/PenaSide/codeword/internal/utils/middleware" "strings" ) @@ -30,9 +30,13 @@ func InitializeJWT() *middleware.JWT { -----END RSA PRIVATE KEY-----`, "\t", "", -1) return middleware.NewJWT(&initialize.Config{ - PrivateKey: privateKey, - PublicKey: publicKey, - Audience: "pena", - Issuer: "pena-auth-service", + ExternalCfg: initialize.ExternalCfg{ + JwtCfg: initialize.JWTConfiguration{ + PrivateKey: privateKey, + PublicKey: publicKey, + Audience: "pena", + Issuer: "pena-auth-service", + }, + }, }) } diff --git a/tests/repository_test/repository_test.go b/tests/repository_test/repository_test.go index ef364d7..07d7537 100644 --- a/tests/repository_test/repository_test.go +++ b/tests/repository_test/repository_test.go @@ -1,10 +1,10 @@ package repository_test import ( - "codeword/internal/models" - "codeword/internal/repository" "context" "fmt" + "gitea.pena/PenaSide/codeword/internal/models" + "gitea.pena/PenaSide/codeword/internal/repository" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive"