Compare commits

...

25 Commits

Author SHA1 Message Date
ded9befb35 fix kafka ip
All checks were successful
Deploy / CreateImage (push) Successful in 2m25s
Deploy / DeployService (push) Successful in 22s
2025-03-20 02:17:15 +03:00
68c6e25260 --
All checks were successful
Deploy / CreateImage (push) Successful in 2m18s
Deploy / DeployService (push) Successful in 21s
2025-02-28 03:03:31 +03:00
a831c5c316 applied renamer 2025-02-27 16:30:52 +03:00
a19ebea5ec Update docker-compose.yaml 2024-12-22 12:43:51 +00:00
7de5821692 add refresher docker compose service 2024-12-03 17:14:11 +03:00
bd307dcddf - 2024-12-03 16:22:05 +03:00
Pasha
54b558636c added new cmd refresh tokens 2024-12-03 16:13:19 +03:00
0e13df1f83 more recovering 2024-12-03 02:28:22 +03:00
df757e097b debug 2024-12-02 22:07:08 +03:00
a7596ff33d debug 2024-12-02 21:45:54 +03:00
75870273bd add recover to worker 2024-12-02 21:15:20 +03:00
b375f8dbbc fix typo 2024-12-02 20:31:20 +03:00
c29636f2d3 -- 2024-12-02 17:51:42 +03:00
8f8ab4aa0f -- 2024-12-02 17:46:00 +03:00
1a0da95d1d add account id to quiz rules getting 2024-11-29 01:46:24 +03:00
c138e94c61 fix: allow patch deleted rules 2024-11-29 00:54:09 +03:00
f3f3c05ed7 fix: multi answers from subquery 2024-11-27 21:41:42 +03:00
42a11924c1 fix: if account is deleted token updater shoul skip updateing rather then break 2024-11-11 16:15:37 +03:00
266e5f0487 if field already exists set delete false 2024-11-06 21:20:06 +03:00
de874994b9 if tag already exists set delete true 2024-11-06 20:43:48 +03:00
51510cd655 -- 2024-11-04 15:53:03 +03:00
37f4b69948 -- 2024-11-04 15:46:19 +03:00
437b74d748 -- 2024-11-04 15:33:13 +03:00
ab5a751786 -- 2024-11-04 15:11:34 +03:00
ef6cd11e86 public key and inntegration id 2024-08-13 15:08:40 +03:00
53 changed files with 705 additions and 465 deletions

@ -0,0 +1,26 @@
name: Deploy
run-name: ${{ gitea.actor }} build image and push to container registry
on:
push:
branches:
- 'main'
jobs:
CreateImage:
runs-on: [squizstaging]
uses: https://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: [squizprod]
needs: CreateImage
uses: https://gitea.pena/PenaDevops/actions.git/.gitea/workflows/deploy.yml@v1.1.4-p7
with:
runner: hubprod
actionid: ${{ gitea.run_id }}

@ -0,0 +1,26 @@
name: Deploy
run-name: ${{ gitea.actor }} build image and push to container registry
on:
push:
branches:
- '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
actionid: ${{ gitea.run_id }}

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.0
with:
runner: hubstaging

@ -1,16 +1,11 @@
FROM dockerhub.timeweb.cloud/golang:alpine as build
FROM gitea.pena/penadevops/container-images/golang:main as build
WORKDIR /app
RUN apk add git
COPY . .
ARG GITLAB_TOKEN
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
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o amocrm ./cmd/main.go
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o token_refresher ./cmd/tokens/main.go
FROM penahub.gitlab.yandexcloud.net:5050/devops/dockerhub-backup/alpine as prod
FROM gitea.pena/penadevops/container-images/alpine:main as prod
COPY --from=build /app/amocrm .
EXPOSE 1488
ENV IS_PROD_LOG=false
ENV IS_PROD=false
COPY --from=build /app/token_refresher .
CMD ["/amocrm"]

@ -1,18 +1,18 @@
package main
import (
"amocrm/internal/initialize"
"context"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/initialize"
"os"
"os/signal"
"syscall"
"amocrm/internal/app"
"gitea.pena/SQuiz/amocrm/internal/app"
"go.uber.org/zap"
// import for automatically updating linter rules
_ "penahub.gitlab.yandexcloud.net/devops/linters/golang.git/pkg/dummy"
_ "gitea.pena/PenaSide/linters-golang/pkg/dummy"
)
func main() {

94
cmd/tokens/main.go Normal file

@ -0,0 +1,94 @@
package main
import (
"context"
"errors"
"fmt"
"gitea.pena/SQuiz/amocrm/cmd/tokens/refresh_wc"
"gitea.pena/SQuiz/amocrm/internal/initialize"
"gitea.pena/SQuiz/amocrm/internal/workers/limiter"
"gitea.pena/SQuiz/amocrm/pkg/amoClient"
"gitea.pena/SQuiz/amocrm/pkg/closer"
"gitea.pena/SQuiz/common/dal"
"go.uber.org/zap"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
logger, err := zap.NewProduction()
if err != nil {
fmt.Printf("Failed to initialize logger: %v\n", err)
os.Exit(1)
}
logger = logger.Named("REFRESH_WC")
config, err := initialize.LoadConfig()
if err != nil {
logger.Fatal("Failed to load config", zap.Error(err))
}
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
if err = run(ctx, logger, *config); err != nil {
logger.Fatal("App exited with error", zap.Error(err))
}
}
func run(ctx context.Context, logger *zap.Logger, cfg initialize.Config) error {
defer func() {
if r := recover(); r != nil {
logger.Error("Recovered in app from a panic", zap.Any("error", r))
}
}()
shutdownGroup := closer.NewCloserGroup()
amoRepo, err := dal.NewAmoDal(ctx, cfg.PostgresCredentials)
if err != nil {
logger.Error("error init amo repo", zap.Error(err))
return err
}
rateLimiter := limiter.NewRateLimiter(ctx, 6, 1500*time.Millisecond)
amoCl := amoClient.NewAmoClient(amoClient.AmoDeps{
Logger: logger,
RedirectionURL: cfg.ReturnURL,
IntegrationID: cfg.IntegrationID,
IntegrationSecret: cfg.IntegrationSecret,
RateLimiter: rateLimiter,
})
refreshWC := refresh_wc.NewRefreshWC(refresh_wc.Deps{
Logger: logger,
AmoClient: amoCl,
Repo: amoRepo,
})
go refreshWC.Start(ctx)
shutdownGroup.Add(closer.CloserFunc(amoRepo.Close))
shutdownGroup.Add(closer.CloserFunc(rateLimiter.Stop))
shutdownGroup.Add(closer.CloserFunc(refreshWC.Stop))
<-ctx.Done()
timeoutCtx, timeoutCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer timeoutCancel()
if err := shutdownGroup.Call(timeoutCtx); err != nil {
if errors.Is(err, context.DeadlineExceeded) {
logger.Error("Shutdown timed out", zap.Error(err))
} else {
logger.Error("Failed to shutdown services gracefully", zap.Error(err))
}
return err
}
logger.Info("Application has stopped")
return nil
}

@ -0,0 +1,94 @@
package refresh_wc
import (
"context"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/pkg/amoClient"
"gitea.pena/SQuiz/amocrm/pkg/timer"
"gitea.pena/SQuiz/common/dal"
"gitea.pena/SQuiz/common/model"
"go.uber.org/zap"
"time"
)
type Deps struct {
AmoClient *amoClient.Amo
Repo *dal.AmoDal
Logger *zap.Logger
}
type WebHookUpdater struct {
amoClient *amoClient.Amo
repo *dal.AmoDal
logger *zap.Logger
}
func NewRefreshWC(deps Deps) *WebHookUpdater {
return &WebHookUpdater{
amoClient: deps.AmoClient,
repo: deps.Repo,
logger: deps.Logger,
}
}
func (wc *WebHookUpdater) Start(ctx context.Context) {
nextStart := timer.CalculateTime(3)
ticker := time.NewTicker(time.Nanosecond * time.Duration(nextStart))
defer ticker.Stop()
for {
select {
case <-ticker.C:
wc.processTasks(ctx)
nextStart = timer.CalculateTime(3)
ticker.Reset(time.Nanosecond * time.Duration(nextStart))
case <-ctx.Done():
return
}
}
}
// todo если так нормально будет, то предлагаю батчами сделать, батч на 1000 к примеру,
// делим количество всего токенов на размер батча чтобы было без остатка и строим вейт группу вокруг этого
func (wc *WebHookUpdater) processTasks(ctx context.Context) {
currentTokens, err := wc.repo.AmoRepo.GetAllTokens(ctx)
if err != nil {
wc.logger.Error("Failed to get all tokens", zap.Error(err))
return
}
for _, token := range currentTokens {
user, err := wc.repo.AmoRepo.GetCurrentAccount(ctx, token.AccountID)
if err != nil {
wc.logger.Error("error getting account by id", zap.Error(err))
continue
}
req := models.UpdateWebHookReq{
GrantType: "refresh_token",
RefreshToken: token.RefreshToken,
}
resp, err := wc.amoClient.CreateWebHook(&req, user.Subdomain)
if err != nil {
wc.logger.Error("error create webhook", zap.Error(err))
continue
}
err = wc.repo.AmoRepo.WebhookUpdate(ctx, model.Token{
AccountID: token.AccountID,
RefreshToken: resp.RefreshToken,
AccessToken: resp.AccessToken,
Expiration: time.Now().Unix() + resp.ExpiresIn,
CreatedAt: time.Now().Unix(),
})
if err != nil {
wc.logger.Error("error update token in db", zap.Error(err))
continue
}
}
}
func (wc *WebHookUpdater) Stop(_ context.Context) error {
return nil
}

@ -1,28 +1,49 @@
version: "3"
services:
amocrm:
hostname: squiz-amocrm
container_name: squiz-amocrm
image: $CI_REGISTRY_IMAGE/main:$CI_COMMIT_REF_SLUG.$CI_PIPELINE_ID
image: gitea.pena/squiz/amocrm/main:$GITHUB_RUN_NUMBER
tty: true
environment:
HTTP_HOST: '0.0.0.0'
HTTP_PORT: 1488
REDIS_ADDR: '10.8.0.9:6379'
REDIS_ADDR: '10.8.0.12:6379'
REDIS_PASS: 'Redalert2'
REDIS_DB: 4
PENA_SOCIAL_AUTH_URL: 'http://10.8.0.8:59344/amocrm/auth'
PENA_SOCIAL_AUTH_URL: 'http://10.8.0.226:59344/amocrm/auth'
PUBLIC_ACCESS_SECRET_KEY: $JWT_PUBLIC_KEY
PG_CRED: 'host=10.8.0.9 port=5433 user=squiz password=Redalert2 dbname=squiz sslmode=disable'
PUBLIC_KEY: $PEM_PUB_USERID
PRIVATE_KEY: $PEM_PRIV_USERID
KAFKA_BROKERS: 10.8.0.8:9092
PUBLIC_ACCESS_SECRET_KEY: "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLW1tlHyKC9AG0hGpmkksET2DE\nr7ojSPemxFWAgFgcPJWQ7x3uNbsdJ3bIZFoA/FClaWKMCZmjnH9tv0bKZtY/CDhM\nZEyHpMruRSn6IKrxjtQZWy4uv/w6MzUeyBYG0OvNCiYpdvz5SkAGAUHD5ZNFqn2w\nKKFD0I2Dr59BFVSGJwIDAQAB\n-----END PUBLIC KEY-----"
PG_CRED: 'host=10.8.0.12 port=5433 user=squiz password=Redalert2 dbname=squiz sslmode=disable'
PUBLIC_KEY: "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAn/Q3CKvaxK4YR3N3Iy8O\nIOs218oDQIwoHpmRh3a9V+vTEqT+rY8/Dkf5cnbTMuEBFP1NYtS+pcSFF7nLlZdm\nVb6rhtjLCV0awogeWxJsXCHBOHF7Fv4iqDa85qMwl7XiVXxKo/9kH9TkPsgFsuYt\nvL4Xc1u6ogoYeVHP7ULDMxgmdLd2N9VIVphxsiGDq304NbgWFVr47/J3x3DU0bw+\nF5QdI7ScU/m4T3S0WlhFaG0hblVbH8x+8U81F9OIyJCX9tGZYb6eR3v1pnWP191L\nkpJPSlj9cPPJhl3d6bCyYzGv6k8KQClSs8lsSklPrcXl0ut3raC+oEFp2JkHQL7R\nUlwPr2ZOt9DTTs7l70gvr8FswO4/N6+t+6spce2s3lwN41BWGWHYcc9PuOHqUQTw\nJ3IQQU6NmAyZOjDiZJw7uoNG2rtCqWQRykTULZvtfxh3lMXI/qKM1em+Qo3AZnKC\nY01xhCr4ahPs9Rb4eReigTJSzq+IRSJa1+xPaR4dNm6tAgMBAAE=\n-----END PUBLIC KEY-----"
PRIVATE_KEY: "-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----"
KAFKA_BROKERS: 10.8.0.226:9092
KAFKA_TOPIC: "squiz-amocrm"
GRPC_HOST: "0.0.0.0"
RETURN_URL: "https://quiz.pena.digital/squiz/amocrm/oauth"
REDIRECT_URL: "https://quiz.pena.digital/integrations"
INTEGRATION_ID: "6c7f3fdb-cce7-4fb0-a8a3-640b695c8d00"
INTEGRATION_SECRET: "s5PaAHc4BranEawClbTZs4Bhc1SSTcx1Jf4XRydvp7UqbeZiTAi6plWFYU5HSFQn"
INTEGRATION_ID: "48fc50c2-67a6-4619-bd54-23311619cc79"
INTEGRATION_SECRET: "YRvT2CRFprN7r5N021YTSe1LKT0HJdhaE6GJbGYs08q9llyDrwE5FMuM3HXl7CZ0"
ports:
- 10.8.0.9:1492:1488
- 10.8.0.12:1492:1488
refresher:
image: gitea.pena/squiz/amocrm/main:$GITHUB_RUN_NUMBER
tty: true
command: /token_refresher
environment:
HTTP_HOST: '0.0.0.0'
HTTP_PORT: 1488
REDIS_ADDR: '10.8.0.12:6379'
REDIS_PASS: 'Redalert2'
REDIS_DB: 4
PENA_SOCIAL_AUTH_URL: 'http://10.8.0.226:59344/amocrm/auth'
PUBLIC_ACCESS_SECRET_KEY: "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLW1tlHyKC9AG0hGpmkksET2DE\nr7ojSPemxFWAgFgcPJWQ7x3uNbsdJ3bIZFoA/FClaWKMCZmjnH9tv0bKZtY/CDhM\nZEyHpMruRSn6IKrxjtQZWy4uv/w6MzUeyBYG0OvNCiYpdvz5SkAGAUHD5ZNFqn2w\nKKFD0I2Dr59BFVSGJwIDAQAB\n-----END PUBLIC KEY-----"
PG_CRED: 'host=10.8.0.12 port=5433 user=squiz password=Redalert2 dbname=squiz sslmode=disable'
PUBLIC_KEY: "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAn/Q3CKvaxK4YR3N3Iy8O\nIOs218oDQIwoHpmRh3a9V+vTEqT+rY8/Dkf5cnbTMuEBFP1NYtS+pcSFF7nLlZdm\nVb6rhtjLCV0awogeWxJsXCHBOHF7Fv4iqDa85qMwl7XiVXxKo/9kH9TkPsgFsuYt\nvL4Xc1u6ogoYeVHP7ULDMxgmdLd2N9VIVphxsiGDq304NbgWFVr47/J3x3DU0bw+\nF5QdI7ScU/m4T3S0WlhFaG0hblVbH8x+8U81F9OIyJCX9tGZYb6eR3v1pnWP191L\nkpJPSlj9cPPJhl3d6bCyYzGv6k8KQClSs8lsSklPrcXl0ut3raC+oEFp2JkHQL7R\nUlwPr2ZOt9DTTs7l70gvr8FswO4/N6+t+6spce2s3lwN41BWGWHYcc9PuOHqUQTw\nJ3IQQU6NmAyZOjDiZJw7uoNG2rtCqWQRykTULZvtfxh3lMXI/qKM1em+Qo3AZnKC\nY01xhCr4ahPs9Rb4eReigTJSzq+IRSJa1+xPaR4dNm6tAgMBAAE=\n-----END PUBLIC KEY-----"
PRIVATE_KEY: "-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----"
KAFKA_BROKERS: 10.8.0.226:9092
KAFKA_TOPIC: "squiz-amocrm"
GRPC_HOST: "0.0.0.0"
RETURN_URL: "https://quiz.pena.digital/squiz/amocrm/oauth"
REDIRECT_URL: "https://quiz.pena.digital/integrations"
INTEGRATION_ID: "48fc50c2-67a6-4619-bd54-23311619cc79"
INTEGRATION_SECRET: "YRvT2CRFprN7r5N021YTSe1LKT0HJdhaE6GJbGYs08q9llyDrwE5FMuM3HXl7CZ0"

45
go.mod

@ -1,23 +1,26 @@
module amocrm
module gitea.pena/SQuiz/amocrm
go 1.22.0
go 1.23.2
toolchain go1.22.2
toolchain go1.23.4
require (
gitea.pena/PenaSide/linters-golang v0.0.0-20241207122018-933207374735
gitea.pena/SQuiz/common v0.0.0-20250207214652-9994f2d4d43f
github.com/caarlos0/env/v8 v8.0.0
github.com/go-redis/redis/v8 v8.11.5
github.com/gofiber/fiber/v2 v2.52.4
github.com/joho/godotenv v1.5.1
github.com/lib/pq v1.10.9
github.com/stretchr/testify v1.8.4
github.com/twmb/franz-go v1.16.1
github.com/stretchr/testify v1.9.0
github.com/twmb/franz-go v1.18.0
go.uber.org/zap v1.27.0
google.golang.org/protobuf v1.33.0
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240710173639-ae1b5abeb71f
)
require (
gitea.pena/PenaSide/common v0.0.0-20250103085335-91ea31fee517 // indirect
gitea.pena/PenaSide/hlog v0.0.0-20241125221102-a54c29c002a9 // indirect
github.com/ClickHouse/clickhouse-go v1.5.4 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
@ -25,37 +28,31 @@ require (
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-jwt/jwt/v5 v5.2.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.17.6 // indirect
github.com/klauspost/cpuid/v2 v2.2.6 // 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.69 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pierrec/lz4/v4 v4.1.19 // indirect
github.com/minio/minio-go/v7 v7.0.81 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/rs/xid v1.5.0 // indirect
github.com/rs/xid v1.6.0 // indirect
github.com/tealeg/xlsx v1.0.5 // indirect
github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf // 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.51.0 // indirect
github.com/valyala/tcplisten v1.0.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.20.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
golang.org/x/crypto v0.28.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/text v0.19.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 // indirect
penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240803124813-79e62d2acf3c // indirect
)

84
go.sum

@ -1,3 +1,11 @@
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/SQuiz/common v0.0.0-20250207214652-9994f2d4d43f h1:458FCN98jVkjAqg3yyspgkUdJnKz3BNMiZosrVtPpv8=
gitea.pena/SQuiz/common v0.0.0-20250207214652-9994f2d4d43f/go.mod h1:/YR+uo4RouZshuHPkguk7nAJVKuFt3Z0mTFxUPdlzxQ=
github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0=
github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
@ -19,9 +27,13 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
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-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/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.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM=
github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
@ -32,19 +44,16 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
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/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
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.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
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/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@ -64,15 +73,8 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh
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.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0=
github.com/minio/minio-go/v7 v7.0.69/go.mod h1:XAvOPJQ5Xlzk5o3o/ArO2NMbhSGkimC+bpW/ngRKDmQ=
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
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/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
@ -81,26 +83,24 @@ github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
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/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
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.16.1 h1:rpWc7fB9jd7TgmCyfxzenBI+QbgS8ZfJOUQE+tzPtbE=
github.com/twmb/franz-go v1.16.1/go.mod h1:/pER254UPPGp/4WfGqRi+SIRGE50RSQzVubQp6+N4FA=
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.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA=
@ -113,17 +113,17 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
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/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.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
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/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
@ -132,21 +132,9 @@ google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240628071842-da12f589207e h1:9wh9ch9UaJcC/b/SCgDWdj7UX1mPK7ko1PBNp5PpH5U=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240628071842-da12f589207e/go.mod h1:nfZkoj8MCYaoP+xiPeUn5D0lIzinUr1qDkNfX0ng9rk=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240628183520-89234a64c7fe h1:KRz7Blk/yniyY1iC5omxS8yZPb/uBEm0HhM6HGhs6Rw=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240628183520-89234a64c7fe/go.mod h1:nfZkoj8MCYaoP+xiPeUn5D0lIzinUr1qDkNfX0ng9rk=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240710173639-ae1b5abeb71f h1:AsazJV1Z1eCCKSTylddZnRp8ziy2YZofv7/AyPqqtXM=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240710173639-ae1b5abeb71f/go.mod h1:nfZkoj8MCYaoP+xiPeUn5D0lIzinUr1qDkNfX0ng9rk=
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=

@ -1,25 +1,26 @@
package app
import (
"amocrm/internal/brokers"
"amocrm/internal/controllers"
"amocrm/internal/initialize"
"amocrm/internal/repository"
"amocrm/internal/server/http"
"amocrm/internal/service"
"amocrm/internal/tools"
"amocrm/internal/workers/data_updater"
"amocrm/internal/workers/limiter"
"amocrm/internal/workers/post_deals_worker"
"amocrm/internal/workers/post_fields_worker"
"amocrm/internal/workers/queueUpdater"
"amocrm/internal/workers_methods"
"amocrm/pkg/amoClient"
"amocrm/pkg/closer"
pena_social_auth "amocrm/pkg/pena-social-auth"
"context"
"errors"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/brokers"
"gitea.pena/SQuiz/amocrm/internal/controllers"
"gitea.pena/SQuiz/amocrm/internal/initialize"
"gitea.pena/SQuiz/amocrm/internal/repository"
"gitea.pena/SQuiz/amocrm/internal/server/http"
"gitea.pena/SQuiz/amocrm/internal/service"
"gitea.pena/SQuiz/amocrm/internal/tools"
"gitea.pena/SQuiz/amocrm/internal/workers/data_updater"
"gitea.pena/SQuiz/amocrm/internal/workers/limiter"
"gitea.pena/SQuiz/amocrm/internal/workers/post_deals_worker"
"gitea.pena/SQuiz/amocrm/internal/workers/post_fields_worker"
"gitea.pena/SQuiz/amocrm/internal/workers/queueUpdater"
"gitea.pena/SQuiz/amocrm/internal/workers_methods"
"gitea.pena/SQuiz/amocrm/pkg/amoClient"
"gitea.pena/SQuiz/amocrm/pkg/closer"
pena_social_auth "gitea.pena/SQuiz/amocrm/pkg/pena-social-auth"
"gitea.pena/SQuiz/common/dal"
"time"
"go.uber.org/zap"
@ -28,7 +29,7 @@ import (
func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) error {
defer func() {
if r := recover(); r != nil {
logger.Error("Recovered from a panic", zap.Any("error", r))
logger.Error("Recovered in app from a panic", zap.Any("error", r))
}
}()
@ -135,6 +136,7 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
go dataUpdater.Start(ctx)
go queUpdater.Start(ctx)
fmt.Println("UMBRELLA")
go dealsPoster.Start(ctx)
go fieldsPoster.Start(ctx)

@ -1,9 +1,9 @@
package brokers
import (
"amocrm/internal/models"
"context"
"encoding/json"
"gitea.pena/SQuiz/amocrm/internal/models"
"github.com/twmb/franz-go/pkg/kgo"
"go.uber.org/zap"
)

@ -3,8 +3,8 @@ package controllers
import (
"errors"
"github.com/gofiber/fiber/v2"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"gitea.pena/SQuiz/common/middleware"
"gitea.pena/SQuiz/common/pj_errors"
)
func (c *Controller) GetFieldsWithPagination(ctx *fiber.Ctx) error {

@ -1,8 +1,8 @@
package controllers
import (
"amocrm/internal/service"
"amocrm/internal/tools"
"gitea.pena/SQuiz/amocrm/internal/service"
"gitea.pena/SQuiz/amocrm/internal/tools"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
)

@ -2,7 +2,7 @@ package controllers
import (
"github.com/gofiber/fiber/v2"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/common/model"
"strconv"
)

@ -3,8 +3,8 @@ package controllers
import (
"errors"
"github.com/gofiber/fiber/v2"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"gitea.pena/SQuiz/common/middleware"
"gitea.pena/SQuiz/common/pj_errors"
)
func (c *Controller) UpdateListPipelines(ctx *fiber.Ctx) error {

@ -5,9 +5,9 @@ import (
"fmt"
"github.com/gofiber/fiber/v2"
"github.com/lib/pq"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"gitea.pena/SQuiz/common/middleware"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"strconv"
)
@ -95,8 +95,13 @@ func (c *Controller) GettingQuizRules(ctx *fiber.Ctx) error {
if err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("failed convert quizID to int")
}
accountID, ok := middleware.GetAccountId(ctx)
if !ok {
return ctx.Status(fiber.StatusUnauthorized).SendString("account id is required")
}
response, err := c.service.GettingQuizRules(ctx.Context(), quizIDInt)
response, err := c.service.GettingQuizRules(ctx.Context(),accountID, quizIDInt)
if err != nil {
switch {

@ -3,8 +3,8 @@ package controllers
import (
"errors"
"github.com/gofiber/fiber/v2"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"gitea.pena/SQuiz/common/middleware"
"gitea.pena/SQuiz/common/pj_errors"
"strconv"
)

@ -3,8 +3,8 @@ package controllers
import (
"errors"
"github.com/gofiber/fiber/v2"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"gitea.pena/SQuiz/common/middleware"
"gitea.pena/SQuiz/common/pj_errors"
)
func (c *Controller) GetTagsWithPagination(ctx *fiber.Ctx) error {

@ -4,8 +4,8 @@ import (
"errors"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"gitea.pena/SQuiz/common/middleware"
"gitea.pena/SQuiz/common/pj_errors"
)
func (c *Controller) UpdateListUsers(ctx *fiber.Ctx) error {

@ -1,9 +1,9 @@
package controllers
import (
"amocrm/internal/service"
"amocrm/internal/tools"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/service"
"gitea.pena/SQuiz/amocrm/internal/tools"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"strconv"

@ -1,7 +1,7 @@
package models
import (
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/common/model"
)
type GetListFieldsReq struct {

@ -1,7 +1,7 @@
package models
import (
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/common/model"
)
type GetListTagsReq struct {

@ -1,6 +1,6 @@
package models
import "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
import "gitea.pena/SQuiz/common/model"
type KafkaMessage struct {
AccountID string

@ -1,10 +1,10 @@
package repository
import (
"amocrm/internal/models"
"context"
"encoding/json"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"github.com/go-redis/redis/v8"
"go.uber.org/zap"
"strconv"

@ -4,7 +4,7 @@ import (
"context"
"fmt"
"github.com/gofiber/fiber/v2"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
"gitea.pena/SQuiz/common/middleware"
)
type ServerConfig struct {

@ -1,13 +1,13 @@
package service
import (
"amocrm/internal/models"
"amocrm/internal/tools"
"context"
"database/sql"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/tools"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
)
func (s *Service) GetFieldsWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.UserListFieldsResp, error) {

@ -1,11 +1,11 @@
package service
import (
"amocrm/internal/brokers"
"amocrm/pkg/amoClient"
pena_social_auth "amocrm/pkg/pena-social-auth"
"gitea.pena/SQuiz/amocrm/internal/brokers"
"gitea.pena/SQuiz/amocrm/pkg/amoClient"
pena_social_auth "gitea.pena/SQuiz/amocrm/pkg/pena-social-auth"
"gitea.pena/SQuiz/common/dal"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
)
type Deps struct {

@ -1,12 +1,12 @@
package service
import (
"amocrm/internal/models"
"context"
"database/sql"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
)
func (s *Service) UpdateListPipelines(ctx context.Context, accountID string) error {

@ -1,12 +1,12 @@
package service
import (
"amocrm/internal/models"
"context"
"database/sql"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
)
func (s *Service) ChangeQuizSettings(ctx context.Context, request *model.RulesReq, accountID string, quizID int) error {
@ -75,8 +75,8 @@ func (s *Service) SetQuizSettings(ctx context.Context, request *model.RulesReq,
return nil
}
func (s *Service) GettingQuizRules(ctx context.Context, quizID int) (*model.Rule, error) {
rule, err := s.repository.AmoRepo.GettingQuizRules(ctx, quizID)
func (s *Service) GettingQuizRules(ctx context.Context, accountID string, quizID int) (*model.Rule, error) {
rule, err := s.repository.AmoRepo.GettingQuizRules(ctx, accountID, quizID)
if err != nil {
if err == sql.ErrNoRows {
return nil, pj_errors.ErrNotFound

@ -1,12 +1,12 @@
package service
import (
"amocrm/internal/models"
"context"
"database/sql"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
)
func (s *Service) GetStepsWithPagination(ctx context.Context, req *model.PaginationReq, accountID string, pipelineID int) (*model.UserListStepsResp, error) {

@ -1,12 +1,12 @@
package service
import (
"amocrm/internal/models"
"context"
"database/sql"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
)
func (s *Service) GetTagsWithPagination(ctx context.Context, req *model.PaginationReq, accountID string) (*model.UserListTagsResp, error) {

@ -1,12 +1,12 @@
package service
import (
"amocrm/internal/models"
"context"
"database/sql"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
)
func (s *Service) UpdateListUsers(ctx context.Context, accountID string) error {

@ -1,11 +1,11 @@
package service
import (
"amocrm/internal/models"
"context"
"errors"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/pj_errors"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
)
type ParamsWebhookCreate struct {

@ -1,9 +1,9 @@
package tools
import (
"amocrm/internal/models"
"fmt"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
"strings"
"unicode/utf8"
)

@ -1,9 +1,9 @@
package tools
import (
"amocrm/internal/models"
"fmt"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
"strings"
)

@ -1,8 +1,8 @@
package tools
import (
"amocrm/internal/models"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/common/model"
)
func ConvertUserGroups(groups *models.AmocrmUserInformation) []model.UserGroups {

@ -1,9 +1,9 @@
package tools
import (
"amocrm/internal/proto/socialauth"
"google.golang.org/protobuf/proto"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/proto/socialauth"
"google.golang.org/protobuf/proto"
)
func DeserializeProtobufMessage(protobufMessage string) (string, string, error) {

@ -1,7 +1,7 @@
package tools
import (
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/common/model"
)
func ValidateUtmFields(response *model.UserListFieldsResp) *model.UserListFieldsResp {

@ -1,9 +1,11 @@
package data_updater
import (
"amocrm/internal/brokers"
"amocrm/internal/models"
"context"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/brokers"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/pkg/timer"
"go.uber.org/zap"
"time"
)
@ -26,20 +28,26 @@ func NewDataUpdaterWC(deps Deps) *DataUpdater {
}
func (wc *DataUpdater) Start(ctx context.Context) {
nextStart := calculateTime()
nextStart := timer.CalculateTime(4)
ticker := time.NewTicker(time.Nanosecond * time.Duration(nextStart))
//ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
wc.processTasks(ctx)
nextStart = calculateTime()
ticker.Reset(time.Nanosecond * time.Duration(nextStart))
case <-ctx.Done():
return
}
func() {
defer func() {
if v := recover(); v != nil {
fmt.Println("RECOVERING in DataUpdater", v)
}
}()
select {
case <-ticker.C:
wc.processTasks(ctx)
ticker.Reset(time.Nanosecond * time.Duration(nextStart))
case <-ctx.Done():
return
}
}()
}
}

@ -1,21 +1,21 @@
package post_deals_worker
import (
"amocrm/internal/models"
"amocrm/internal/repository"
"amocrm/internal/tools"
"amocrm/pkg/amoClient"
"context"
"database/sql"
"encoding/json"
"errors"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/repository"
"gitea.pena/SQuiz/amocrm/internal/tools"
"gitea.pena/SQuiz/amocrm/pkg/amoClient"
"gitea.pena/SQuiz/common/dal"
"gitea.pena/SQuiz/common/model"
"gitea.pena/SQuiz/common/pj_errors"
"gitea.pena/SQuiz/common/repository/amo"
"gitea.pena/SQuiz/common/utils"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/amo"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/utils"
"strconv"
"strings"
"time"
@ -45,22 +45,147 @@ func NewPostDealsWC(deps Deps) *PostDeals {
}
func (wc *PostDeals) Start(ctx context.Context) {
fmt.Println("Start")
ticker := time.NewTicker(1 * time.Minute)
defer ticker.Stop()
defer func() {
if v := recover(); v != nil {
fmt.Println("StartFetchingRecover", v)
}
}()
for {
select {
case <-ticker.C:
wc.startFetching(ctx)
func() {
defer func() {
if v := recover(); v != nil {
fmt.Println("RECOVERING in PostDeals", v)
}
}()
select {
case <-ticker.C:
fmt.Println("StartFetching")
wc.startFetching(ctx)
case <-ctx.Done():
return
}
case <-ctx.Done():
fmt.Println("Done")
return
}
}()
}
}
func (wc *PostDeals) processResult(ctx context.Context,
result model.AmoUsersTrueResults,
mapDealReq *map[string][]models.DealReq,
mapTokenDomain *map[string]string,
) error {
defer func() {
if v := recover(); v != nil {
fmt.Println("RECOVERING in processResult", v)
}
}()
fmt.Println("StartFetchingResult", result)
userPrivileges, err := wc.amoRepo.AccountRepo.GetPrivilegesByAccountID(ctx, result.QuizAccountID)
fmt.Println("StartFetchingUP", userPrivileges, err)
if err != nil {
wc.logger.Error("error getting user privileges", zap.Error(err))
return err
}
if !utils.VerifyUserPrivileges(userPrivileges) {
wc.logger.Info("User don't have active quizCnt or quizUnlim privileges, aborting")
//TODO: acquire results only for accounts with active privileges
return nil
}
allAnswers, err := wc.amoRepo.AnswerRepo.GetAllAnswersByQuizID(ctx, result.Session)
fmt.Println("StartFetchingAA", allAnswers, err)
if err != nil {
wc.logger.Error("error getting all user answers by result session", zap.Error(err))
return err
}
userTags, err := wc.amoRepo.AmoRepo.GetUserTagsByID(ctx, result.AmoAccountID)
fmt.Println("StartFetchingUT", userTags, err)
if err != nil {
wc.logger.Error("error getting user tags by ano account id", zap.Error(err))
return err
}
// За один запрос можно передать не более 50 сделок.
deal := models.DealReq{
Name: fmt.Sprintf("deal quiz number %d", result.QuizID),
StatusID: result.StepID,
PipelineID: result.PipelineID,
CreatedBy: 0, //result.AmoAccountID,
UpdatedBy: 0,
CreatedAt: time.Now().Unix(),
ResponsibleUserID: result.PerformerID,
Embed: models.Embedd{
Company: []models.Company{},
Source: models.Source{
Type: "widget",
},
Tags: tools.ConstructAmoTags(userTags, result.TagsToAdd),
},
// строка которая будет возвращенна в респонсе чтоб понимать кто есть что
RequestID: strconv.Itoa(int(result.AnswerID)),
}
leadFields, contactData, companyData, customerToCreate, err := wc.constructField(ctx, allAnswers, result)
fmt.Println("StartFetchingCF", leadFields, contactData, companyData, customerToCreate, err)
if err != nil {
wc.logger.Error("error construct fields", zap.Error(err))
return err
}
currentFields, err := wc.amoRepo.AmoRepo.GetUserFieldsByID(ctx, result.AmoAccountID)
fmt.Println("StartFetchingcuF", currentFields, err)
if err != nil {
wc.logger.Error("error getting current user fields from db", zap.Error(err))
return err
}
utmFields := tools.ConstructUTMFields(result.UTMs, currentFields)
_, err = wc.amoClient.CreatingCustomer(customerToCreate, result.AccessToken, result.SubDomain)
fmt.Println("StartFetchingcC", currentFields, err)
if err != nil {
wc.logger.Error("error sending requests for create customer", zap.Error(err))
return err
}
err = wc.redisRepo.CachingLeadFieldsToRedis(ctx, result.AnswerID, leadFields)
if err != nil {
wc.logger.Error("error saving leads fields in redis", zap.Error(err))
return err
}
deal.Embed.Contact = contactData
deal.Embed.Company = companyData
deal.CustomFieldsValues = utmFields
wc.logger.Info("NOW DEAL CONSTRUCTED IS:", zap.Any("DEAL", deal))
if len((*mapDealReq)[result.AccessToken]) >= 49 {
wc.logger.Info("reached maximum number of deals for access token", zap.String("access_token", result.AccessToken))
err = wc.sendingDealsReq(ctx, *mapDealReq, *mapTokenDomain)
if err != nil {
wc.logger.Error("error sending requests for create deals", zap.Error(err))
return err
}
mapDealReqTemp := make(map[string][]models.DealReq)
mapDealReq = &mapDealReqTemp
}
(*mapDealReq)[result.AccessToken] = append((*mapDealReq)[result.AccessToken], deal)
(*mapTokenDomain)[result.AccessToken] = result.SubDomain
return nil
}
func (wc *PostDeals) startFetching(ctx context.Context) {
results, err := wc.amoRepo.AmoRepo.GettingAmoUsersTrueResults(ctx)
fmt.Println("StartFetchingResults", results, err)
if err != nil {
wc.logger.Error("error fetching users answers true results, for sending data to amo", zap.Error(err))
return
@ -70,92 +195,9 @@ func (wc *PostDeals) startFetching(ctx context.Context) {
mapTokenDomain := make(map[string]string)
for _, result := range results {
userPrivileges, err := wc.amoRepo.AccountRepo.GetPrivilegesByAccountID(ctx, result.QuizAccountID)
if err != nil {
wc.logger.Error("error getting user privileges", zap.Error(err))
return
if err := wc.processResult(ctx, result, &mapDealReq, &mapTokenDomain); err != nil {
wc.logger.Error("error processing result", zap.Error(err))
}
if !utils.VerifyUserPrivileges(userPrivileges) {
wc.logger.Info("User don't have active quizCnt or quizUnlim privileges, aborting")
continue
}
allAnswers, err := wc.amoRepo.AnswerRepo.GetAllAnswersByQuizID(ctx, result.Session)
if err != nil {
wc.logger.Error("error getting all user answers by result session", zap.Error(err))
return
}
userTags, err := wc.amoRepo.AmoRepo.GetUserTagsByID(ctx, result.AmoAccountID)
if err != nil {
wc.logger.Error("error getting user tags by ano account id", zap.Error(err))
return
}
// За один запрос можно передать не более 50 сделок.
deal := models.DealReq{
Name: fmt.Sprintf("deal quiz number %d", result.QuizID),
StatusID: result.StepID,
PipelineID: result.PipelineID,
CreatedBy: 0, //result.AmoAccountID,
UpdatedBy: 0,
CreatedAt: time.Now().Unix(),
ResponsibleUserID: result.PerformerID,
Embed: models.Embedd{
Company: []models.Company{},
Source: models.Source{
Type: "widget",
},
Tags: tools.ConstructAmoTags(userTags, result.TagsToAdd),
},
// строка которая будет возвращенна в респонсе чтоб понимать кто есть что
RequestID: strconv.Itoa(int(result.AnswerID)),
}
leadFields, contactData, companyData, customerToCreate, err := wc.constructField(ctx, allAnswers, result)
if err != nil {
wc.logger.Error("error construct fields", zap.Error(err))
return
}
currentFields, err := wc.amoRepo.AmoRepo.GetUserFieldsByID(ctx, result.AmoAccountID)
if err != nil {
wc.logger.Error("error getting current user fields from db", zap.Error(err))
return
}
utmFields := tools.ConstructUTMFields(result.UTMs, currentFields)
_, err = wc.amoClient.CreatingCustomer(customerToCreate, result.AccessToken, result.SubDomain)
if err != nil {
wc.logger.Error("error sending requests for create customer", zap.Error(err))
continue
}
err = wc.redisRepo.CachingLeadFieldsToRedis(ctx, result.AnswerID, leadFields)
if err != nil {
wc.logger.Error("error saving leads fields in redis", zap.Error(err))
return
}
deal.Embed.Contact = contactData
deal.Embed.Company = companyData
deal.CustomFieldsValues = utmFields
wc.logger.Info("NOW DEAL CONSTRUCTED IS:", zap.Any("DEAL", deal))
if len(mapDealReq[result.AccessToken]) >= 49 {
wc.logger.Info("reached maximum number of deals for access token", zap.String("access_token", result.AccessToken))
err = wc.sendingDealsReq(ctx, mapDealReq, mapTokenDomain)
if err != nil {
wc.logger.Error("error sending requests for create deals", zap.Error(err))
return
}
mapDealReq = make(map[string][]models.DealReq)
}
mapDealReq[result.AccessToken] = append(mapDealReq[result.AccessToken], deal)
mapTokenDomain[result.AccessToken] = result.SubDomain
}
err = wc.sendingDealsReq(ctx, mapDealReq, mapTokenDomain)

@ -1,14 +1,14 @@
package post_fields_worker
import (
"amocrm/internal/models"
"amocrm/internal/repository"
"amocrm/pkg/amoClient"
"context"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/repository"
"gitea.pena/SQuiz/amocrm/pkg/amoClient"
"gitea.pena/SQuiz/common/dal"
"gitea.pena/SQuiz/common/repository/amo"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/amo"
"time"
)
@ -40,14 +40,51 @@ func (wc *PostFields) Start(ctx context.Context) {
defer ticker.Stop()
for {
select {
case <-ticker.C:
wc.processTask(ctx)
func() {
defer func() {
if v := recover(); v != nil {
fmt.Println("RECOVERING in PostFields", v)
}
}()
select {
case <-ticker.C:
wc.processTask(ctx)
case <-ctx.Done():
return
case <-ctx.Done():
return
}
}()
}
}
func (wc *PostFields) processDeal(ctx context.Context, token string, dealsData []models.MappingDealsData, forRestoringMap map[int32]models.ForRestoringData) error {
defer func() {
if v := recover(); v != nil {
fmt.Println("RECOVERING inprocessDeal", v)
}
}()
errorCheckerMap, err := wc.sendForUpdate(ctx, token, dealsData)
if err != nil {
wc.logger.Error("error updating deals fields in db", zap.Error(err))
return err
}
for dealID, _ := range errorCheckerMap {
restoringData := forRestoringMap[dealID]
err = wc.redisRepo.CachingDealToRedis(ctx, restoringData.SaveDeal)
if err != nil {
wc.logger.Error("error restoring deal in redis", zap.Error(err))
return err
}
err = wc.redisRepo.CachingLeadFieldsToRedis(ctx, restoringData.SaveDeal.AnswerID, restoringData.LeadFields)
if err != nil {
wc.logger.Error("error restoring deal fields in redis", zap.Error(err))
return err
}
}
return nil
}
func (wc *PostFields) processTask(ctx context.Context) {
@ -57,24 +94,8 @@ func (wc *PostFields) processTask(ctx context.Context) {
return
}
for token, dealsData := range dealsDataForUpdate {
errorCheckerMap, err := wc.sendForUpdate(ctx, token, dealsData)
if err != nil {
wc.logger.Error("error updating deals fields in db", zap.Error(err))
}
for dealID, _ := range errorCheckerMap {
restoringData := forRestoringMap[dealID]
err = wc.redisRepo.CachingDealToRedis(ctx, restoringData.SaveDeal)
if err != nil {
wc.logger.Error("error restoring deal in redis", zap.Error(err))
return
}
err = wc.redisRepo.CachingLeadFieldsToRedis(ctx, restoringData.SaveDeal.AnswerID, restoringData.LeadFields)
if err != nil {
wc.logger.Error("error restoring deal fields in redis", zap.Error(err))
return
}
if err := wc.processDeal(ctx, token, dealsData, forRestoringMap); err != nil {
wc.logger.Error("error processDeal", zap.Error(err))
}
}
}

@ -1,13 +1,14 @@
package queueUpdater
import (
"amocrm/internal/models"
"amocrm/internal/workers_methods"
"context"
"encoding/json"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/workers_methods"
"gitea.pena/SQuiz/common/model"
"github.com/twmb/franz-go/pkg/kgo"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"time"
)
@ -36,13 +37,20 @@ func (wc *QueueUpdater) Start(ctx context.Context) {
defer ticker.Stop()
for {
select {
case <-ticker.C:
wc.consumeMessages(ctx)
func() {
defer func() {
if v := recover(); v != nil {
fmt.Println("queuer recover", v)
}
}()
select {
case <-ticker.C:
wc.consumeMessages(ctx)
case <-ctx.Done():
return
}
case <-ctx.Done():
return
}
}()
}
}

@ -1,78 +0,0 @@
package tokens
import (
"amocrm/pkg/amoClient"
"context"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"time"
)
type Deps struct {
AmoClient *amoClient.Amo
Repo *dal.AmoDal
Logger *zap.Logger
}
type Token struct {
amoClient *amoClient.Amo
repo *dal.AmoDal
logger *zap.Logger
}
func NewRefreshWC(deps Deps) *Token {
return &Token{
amoClient: deps.AmoClient,
repo: deps.Repo,
logger: deps.Logger,
}
}
func (wc *Token) Start(ctx context.Context) {
ticker := time.NewTicker(5 * time.Minute)
defer ticker.Stop()
for {
select {
case <-ticker.C:
wc.processTasks(ctx)
case <-ctx.Done():
return
}
}
}
func (wc *Token) processTasks(ctx context.Context) {
//tokens, err := wc.repo.AmoRepo.CheckExpired(ctx)
//if err != nil {
// wc.logger.Error("error fetch expired tokens in mongo", zap.Error(err))
// return
//}
//for _, token := range tokens {
// req := models.UpdateWebHookReq{
// GrantType: "refresh_token",
// RefreshToken: token.RefreshToken,
// }
// newTokens, err := wc.amoClient.CreateWebHook(&req)
// if err != nil {
// wc.logger.Error("error create webhook for update tokens", zap.Error(err))
// continue
// }
// err = wc.repo.AmoRepo.WebhookUpdate(ctx, model.Token{
// AccountID: token.AccountID,
// RefreshToken: newTokens.RefreshToken,
// AccessToken: newTokens.AccessToken,
// Expiration: time.Now().Unix() + newTokens.ExpiresIn,
// CreatedAt: time.Now().Unix(),
// })
// if err != nil {
// wc.logger.Error("error update new tokens in mongo", zap.Error(err))
// continue
// }
//}
}
func (wc *Token) Stop(_ context.Context) error {
return nil
}

@ -1,15 +1,15 @@
package workers_methods
import (
"amocrm/internal/models"
"amocrm/internal/tools"
"amocrm/pkg/amoClient"
"context"
"encoding/json"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/tools"
"gitea.pena/SQuiz/amocrm/pkg/amoClient"
"gitea.pena/SQuiz/common/dal"
"gitea.pena/SQuiz/common/model"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"strings"
"sync"
"time"
@ -41,46 +41,7 @@ func (m *Methods) UpdateTokens(ctx context.Context) ([]model.Token, error) {
m.logger.Error("error getting all tokens from db in UpdateTokens", zap.Error(err))
return nil, err
}
for _, oldToken := range allTokens {
user, err := m.repo.AmoRepo.GetCurrentAccount(ctx, oldToken.AccountID)
if err != nil {
m.logger.Error("error getting account by id in UpdateTokens", zap.Error(err))
return nil, err
}
req := models.UpdateWebHookReq{
GrantType: "refresh_token",
RefreshToken: oldToken.RefreshToken,
}
resp, err := m.amoClient.CreateWebHook(&req, user.Subdomain)
if err != nil {
m.logger.Error("error create webhook in UpdateTokens", zap.Error(err))
continue
}
newToken := model.Token{
AccountID: oldToken.AccountID,
RefreshToken: resp.RefreshToken,
AccessToken: resp.AccessToken,
Expiration: time.Now().Unix() + resp.ExpiresIn,
CreatedAt: time.Now().Unix(),
}
err = m.repo.AmoRepo.WebhookUpdate(ctx, newToken)
if err != nil {
m.logger.Error("error update token in db", zap.Error(err))
return nil, err
}
}
newTokens, err := m.repo.AmoRepo.GetAllTokens(ctx)
if err != nil {
m.logger.Error("error getting all new updated tokens from db in UpdateTokens", zap.Error(err))
return nil, err
}
return newTokens, nil
return allTokens, nil
}
func (m *Methods) CheckUsers(ctx context.Context, allTokens []model.Token) error {

@ -1,15 +1,15 @@
package amoClient
import (
"amocrm/internal/models"
"amocrm/internal/workers/limiter"
"bytes"
"encoding/json"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/workers/limiter"
"gitea.pena/SQuiz/common/model"
"io"
"net/url"
"os"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"strings"
"sync"
"time"
@ -252,8 +252,10 @@ func (a *Amo) GetListTags(req models.GetListTagsReq, accessToken string, domain
return nil, fmt.Errorf("request GetListTags failed: %v", errs[0])
}
a.logger.Info("Succesfull get tags:", zap.String("respBody", string(resBody)), zap.String("fullUrl", fullURL))
if statusCode != fiber.StatusOK {
errorMessage := fmt.Sprintf("received an incorrect response from GetListTags: %s", string(resBody))
errorMessage := fmt.Sprintf("received an incorrect response from GetListTags(%s): %s", fullURL, string(resBody))
a.logger.Error(errorMessage, zap.Int("status", statusCode))
return nil, fmt.Errorf(errorMessage)
}

@ -1,11 +1,11 @@
package amoClient
import (
"amocrm/internal/models"
"amocrm/internal/workers/limiter"
"context"
"encoding/json"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/workers/limiter"
"github.com/gofiber/fiber/v2"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"

@ -1,13 +1,13 @@
package data_updater
package timer
import (
"time"
)
func calculateTime() int64 {
func CalculateTime(hour int) int64 {
now := time.Now()
targetTime := time.Date(now.Year(), now.Month(), now.Day(), 4, 0, 0, 0, now.Location())
targetTime := time.Date(now.Year(), now.Month(), now.Day(), hour, 0, 0, 0, now.Location())
if now.After(targetTime) {
targetTime = targetTime.AddDate(0, 0, 1)
}

14
pkg/timer/timer_test.go Normal file

@ -0,0 +1,14 @@
package timer
import (
"fmt"
"testing"
)
func TestTimer(t *testing.T) {
result := CalculateTime(4)
fmt.Println(result)
result = CalculateTime(3)
fmt.Println(result)
}

@ -1,14 +1,14 @@
package json
import (
"amocrm/internal/models"
"amocrm/internal/tools"
"context"
"encoding/json"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"gitea.pena/SQuiz/amocrm/internal/tools"
"gitea.pena/SQuiz/common/dal"
"gitea.pena/SQuiz/common/model"
"github.com/stretchr/testify/assert"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"testing"
)

@ -1,9 +1,9 @@
package limiter
import (
"amocrm/internal/workers/limiter"
"context"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/workers/limiter"
"testing"
"time"
)

@ -4,7 +4,7 @@ import (
"context"
"fmt"
"github.com/stretchr/testify/assert"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"gitea.pena/SQuiz/common/dal"
"testing"
)

@ -1,9 +1,9 @@
package tools
import (
"amocrm/internal/tools"
"fmt"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"gitea.pena/SQuiz/amocrm/internal/tools"
"gitea.pena/SQuiz/common/model"
"testing"
)