dev #8

Merged
skeris merged 12 commits from dev into staging 2025-01-04 14:06:14 +00:00
47 changed files with 481 additions and 386 deletions

46
.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"

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

14
.gitea/workflows/lint.yml Normal file

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

1
.gitignore vendored

@ -160,3 +160,4 @@ fabric.properties
# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,goland,go
/recover.bolt
main

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

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

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

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

107
cmd/validator/main.go Normal file

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

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

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

49
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
)

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

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

@ -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(`Здравствуйте, ваша <a href="%s">ссылка для восстановление пароля</a>(доступна всего 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
}

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

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

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

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

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

@ -1,6 +1,6 @@
package rpc_controllers
import "codeword/internal/services"
import "gitea.pena/PenaSide/codeword/internal/services"
type RpcRegister struct {
Service *services.PromoCodeService

@ -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,
})
}

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

@ -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,
})
}

@ -1,8 +1,8 @@
package initialize
import (
"codeword/internal/proto/discount"
"context"
"gitea.pena/PenaSide/codeword/internal/proto/discount"
"google.golang.org/grpc"
"time"
)

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

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

@ -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,
})

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

@ -1,7 +1,7 @@
package models
import (
"codeword/internal/proto/broker"
"gitea.pena/PenaSide/codeword/internal/proto/broker"
"time"
)

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

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

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

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

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

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

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

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

@ -1,8 +1,8 @@
package middleware
import (
"codeword/internal/models"
"fmt"
"gitea.pena/PenaSide/codeword/internal/models"
"strings"
"github.com/gofiber/fiber/v2"

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

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

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

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

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

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

@ -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",
},
},
})
}

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