Compare commits

..

4 Commits

43 changed files with 663 additions and 449 deletions

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

@ -1,23 +0,0 @@
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

@ -1,14 +0,0 @@
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

89
.gitlab-ci.yml Normal file

@ -0,0 +1,89 @@
include:
- project: "devops/pena-continuous-integration"
file: "/templates/docker/build-template.gitlab-ci.yml"
- project: "devops/pena-continuous-integration"
file: "/templates/docker/clean-template.gitlab-ci.yml"
- project: "devops/pena-continuous-integration"
file: "/templates/docker/deploy-template.gitlab-ci.yml"
stages:
- lint
# - test
- clean
- build
- deploy
lint:
image: golangci/golangci-lint:v1.53.3-alpine
stage: lint
before_script:
- echo GITLAB_TOKEN = $GITLAB_TOKEN
- git config --global url."https://forgomod:${GITLAB_TOKEN}@penahub.gitlab.yandexcloud.net/".insteadOf "https://penahub.gitlab.yandexcloud.net/"
- export GOPRIVATE=penahub.gitlab.yandexcloud.net/backend/penahub_common/
- go install github.com/vektra/mockery/v2@v2.26.0
- go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.12.4
script:
- go generate ./...
- golangci-lint version
- golangci-lint run ./...
# test:
# image: golang:1.20.3-alpine
# stage: test
# coverage: /\(statements\)(?:\s+)?(\d+(?:\.\d+)?%)/
# script:
# - CGO_ENABLED=0 go test ./... -coverprofile=coverage.out
# - go tool cover -html=coverage.out -o coverage.html
# - go tool cover -func coverage.out
# artifacts:
# expire_in: "3 days"
# paths:
# - coverage.html
clear-old-images:
extends: .clean_template
variables:
STAGING_BRANCH: "main"
PRODUCTION_BRANCH: "main"
image:
name: docker/compose:1.28.0
entrypoint: [""]
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker images
script:
- docker system prune -af
build-app:
stage: build
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- echo STAGING_BRANCH = $STAGING_BRANCH
- echo CI_REGISTRY = $CI_REGISTRY
- echo CI_REGISTRY_USER = $CI_REGISTRY_USER
- echo CI_PROJECT_DIR = $CI_PROJECT_DIR
- echo CI_REGISTRY_IMAGE = $CI_REGISTRY_IMAGE
- echo CI_COMMIT_REF_SLUG = $CI_COMMIT_REF_SLUG
- echo DOCKER_BUILD_PATH = $DOCKER_BUILD_PATH
- echo CI_PIPELINE_ID = $CI_PIPELINE_ID
- echo JWT_SECRET = $JWT_SECRET
variables:
DOCKER_BUILD_PATH: "build/Dockerfile"
PRODUCTION_BRANCH: main
STAGING_BRANCH: "main"
rules:
- if: $CI_COMMIT_BRANCH == $PRODUCTION_BRANCH || $CI_COMMIT_BRANCH == $STAGING_BRANCH
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG.$CI_PIPELINE_ID --build-arg GITLAB_TOKEN=$GITLAB_TOKEN $CI_PROJECT_DIR
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG.$CI_PIPELINE_ID
deploy-to-staging:
extends: .deploy_template
variables:
DEPLOY_TO: "staging"
BRANCH: "main"
after_script:
- docker system prune --all --volumes --force

@ -1,11 +1,14 @@
FROM gitea.pena/penadevops/container-images/golang:main as build
FROM golang:alpine as build
WORKDIR /app
ARG GITLAB_TOKEN
RUN apk add git
ENV GOPRIVATE=penahub.gitlab.yandexcloud.net/backend/penahub_common
RUN git config --global url."https://forgomod:${GITLAB_TOKEN}@penahub.gitlab.yandexcloud.net/".insteadOf "https://penahub.gitlab.yandexcloud.net/"
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app
FROM gitea.pena/penadevops/container-images/alpine:main
FROM alpine
EXPOSE 80
COPY --from=build app /
COPY static static
@ -17,4 +20,3 @@ ENV GDISK_CREDENTIALS=./static/gdisk-credentials2.json
RUN apk add --no-cache ca-certificates
RUN mkdir /tmp/downloaded /tmp/generated
CMD ["/app"]

@ -13,7 +13,7 @@ import (
"github.com/dgrijalva/jwt-go"
"github.com/pkg/errors"
"golang.org/x/oauth2"
"gitea.pena/PenaSide/docxTemplater/tools"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
)
const (

@ -7,9 +7,9 @@ import (
"github.com/twmb/franz-go/pkg/kgo"
"go.uber.org/zap"
"google.golang.org/protobuf/proto"
"gitea.pena/PenaSide/docxTemplater/broker/tariff/models"
"gitea.pena/PenaSide/docxTemplater/broker/tariff/utils/transfer"
"gitea.pena/PenaSide/docxTemplater/proto/tariff"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff/models"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff/utils/transfer"
"penahub.gitlab.yandexcloud.net/backend/templategen/proto/tariff"
)
type ConsumerDeps struct {
@ -30,17 +30,13 @@ func NewConsumer(deps ConsumerDeps) *Consumer {
}
func (receiver *Consumer) FetchTariffs(ctx context.Context) []models.Tariff {
fmt.Println("redpanda consumer1")
fetches := receiver.client.PollFetches(ctx)
fmt.Println("redpanda consumer2", fetches)
iter := fetches.RecordIter()
fmt.Println("redpanda consumer3", iter)
tariffs := make([]models.Tariff, 0)
for !iter.Done() {
record := iter.Next()
fmt.Println("redpanda consumer4", record)
tariff := tariff.TariffMessage{}
if err := proto.Unmarshal(record.Value, &tariff); err != nil {
@ -51,11 +47,5 @@ func (receiver *Consumer) FetchTariffs(ctx context.Context) []models.Tariff {
tariffs = append(tariffs, *transfer.TariffProtoToModel(&tariff))
}
if err := receiver.client.CommitUncommittedOffsets(ctx); err != nil {
receiver.logger.Error(fmt.Sprintf("error committing message: %v\n", err))
return nil
}
return tariffs
}

@ -1,8 +1,8 @@
package transfer
import (
"gitea.pena/PenaSide/docxTemplater/broker/tariff/models"
"gitea.pena/PenaSide/docxTemplater/proto/tariff"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff/models"
"penahub.gitlab.yandexcloud.net/backend/templategen/proto/tariff"
)
func PrivilegeProtoToModel(privilege *tariff.PrivilegeMessage) *models.Privilege {

@ -3,8 +3,8 @@ package transfer
import (
"time"
"gitea.pena/PenaSide/docxTemplater/broker/tariff/models"
"gitea.pena/PenaSide/docxTemplater/proto/tariff"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff/models"
"penahub.gitlab.yandexcloud.net/backend/templategen/proto/tariff"
)
func TariffProtoToModel(tariff *tariff.TariffMessage) *models.Tariff {

@ -8,7 +8,7 @@ import (
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/mongos"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/mongos"
)
type MongoDAL struct {

@ -10,7 +10,7 @@ import (
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
)
type Amo struct {
@ -314,28 +314,23 @@ func (d *Amo) UpdateAccessRules(ctx context.Context, id string, record *model.Am
}
func (d *Amo) AddPrivilege(ctx context.Context, id, privilegeID string, privilegeAmount int64) error {
filter := bson.M{"pena_id": id, "is_deleted": false}
objID, err := primitive.ObjectIDFromHex(id)
if err != nil {
d.logger.Error("ErrorAmoAddPrivilege", zap.Error(err))
return err
}
filter := bson.M{"_id": objID, "is_deleted": false}
privilegeKey := fmt.Sprintf("privileges.%v", privilegeID)
now := time.Now()
old, err := d.GetByPenaID(ctx, id)
if err != nil {
return err
}
var amount int64
oldprivilege, ok := old.Privileges[privilegeID]
if ok {
amount = oldprivilege.Amount + privilegeAmount
}
updateData := bson.M{
privilegeKey: bson.M{
"created_at": now,
"amount": amount,
"amount": privilegeAmount,
},
"updated_at": now,
}
@ -344,8 +339,6 @@ func (d *Amo) AddPrivilege(ctx context.Context, id, privilegeID string, privileg
{Key: "$set", Value: updateData},
}
fmt.Println("ADDPRIVI", filter, update)
_, err = d.coll.UpdateOne(ctx, filter, update)
if err != nil {

@ -9,7 +9,7 @@ import (
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
)
type GDisk struct {

@ -10,7 +10,7 @@ import (
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
)
type History struct {

@ -9,8 +9,8 @@ import (
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/penadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/penadisk"
)
type PenaDisk struct {
@ -90,7 +90,7 @@ func (d *PenaDisk) GetByID(ctx context.Context, id string) (*model.PenaDisk, err
return &result, nil
}
func (d *PenaDisk) GetByPenaID(ctx context.Context, penaID string) (model.PenaDisk, error) {
func (d *PenaDisk) GetByPenaID(ctx context.Context, penaID string) (*model.PenaDisk, error) {
filter := bson.M{"pena_id": penaID, "is_deleted": false}
var result model.PenaDisk
@ -100,15 +100,15 @@ func (d *PenaDisk) GetByPenaID(ctx context.Context, penaID string) (model.PenaDi
if err != nil {
if err == mongo.ErrNoDocuments {
d.logger.Info("InfoGetPenaDisk", zap.String("id", "not found"))
return result, nil
return nil, nil
}
d.logger.Error("ErrorGetPenaDisk", zap.Error(err))
return result, err
return nil, err
}
d.logger.Info("InfoGetPenaDisk", zap.String("id", result.ID))
return result, nil
return &result, nil
}
func (d *PenaDisk) GetByAmoID(ctx context.Context, amoID string) (*model.PenaDisk, error) {

@ -10,7 +10,7 @@ import (
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
)
type Template struct {

@ -9,7 +9,7 @@ import (
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
)
type TemplateGroup struct {

@ -10,7 +10,7 @@ import (
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
)
type WorkerTask struct {

@ -9,8 +9,8 @@ import (
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
YaDisk2 "gitea.pena/PenaSide/docxTemplater/yadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
YaDisk2 "penahub.gitlab.yandexcloud.net/backend/templategen/yadisk"
)
type YaDisk struct {

@ -1,21 +0,0 @@
services:
templategen:
restart: unless-stopped
image: gitea.pena/penaside/docxtemplater/main:$GITHUB_RUN_NUMBER
ports:
- 10.8.0.226:8012:80
- 10.8.0.226:8443:443
environment:
MONGO_URL: mongodb://templategen:54143ffdd9304865586e5cf1@10.8.0.226:27017/?authSource=templategen
PENADISK_URL: http://hubstaging.pena:8011/
PRIVILEGES_DOMAIN: http://10.8.0.226:59304
KAFKA_BROKERS: 10.8.0.226:9092
KAFKA_TARIFF_TOPIC: tariffs
KAFKA_CONSUMER_GROUP_ID: templategen1
EMAIL_HOST: connect.mailclient.bz
EMAIL_PORT: 587
EMAIL_SENDER: noreply@mailing.pena.digital
EMAIL_USERNAME: kotilion.95@gmail.com
EMAIL_PASSWORD: vWwbCSg4bf0p
tty: true

@ -1,21 +1,14 @@
services:
templategen:
container_name: templategen_service
restart: unless-stopped
image: gitea.pena:3000/penaside/docxtemplater/staging:$GITHUB_RUN_NUMBER
image: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG.$CI_PIPELINE_ID
hostname: templategen_service
ports:
- 10.7.0.6:8012:80
- 10.7.0.6:8443:443
- "80:80"
- "443:443"
environment:
MONGO_URL: mongodb://templategen:54143ffdd9304865586e5cf1@mongodb.pena:27017/?authSource=templategen
PENADISK_URL: http://hubstaging.pena:8011/
MONGO_URL: mongodb://$MONGO_USER:$MONGO_PASSWORD@10.6.0.11:27017/?authSource=templategen
PENADISK_URL: $PENADISK_URL
PRIVILEGES_DOMAIN: https://admin.pena.digital/strator
KAFKA_BROKERS: hubstaging.pena:9092
KAFKA_TARIFF_TOPIC: tariffs
KAFKA_CONSUMER_GROUP_ID: templategen1
EMAIL_HOST: connect.mailclient.bz
EMAIL_PORT: 587
EMAIL_SENDER: noreply@mailing.pena.digital
EMAIL_USERNAME: kotilion.95@gmail.com
EMAIL_PASSWORD: vWwbCSg4bf0p
tty: true

@ -15,7 +15,7 @@ import (
"golang.org/x/oauth2/google"
"google.golang.org/api/drive/v3"
"google.golang.org/api/option"
"gitea.pena/PenaSide/docxTemplater/tools"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
)
const (

88
go.mod

@ -1,72 +1,78 @@
module gitea.pena/PenaSide/docxTemplater
module penahub.gitlab.yandexcloud.net/backend/templategen
go 1.23.2
go 1.21.0
toolchain go1.23.3
toolchain go1.23.4
require (
gitea.pena/PenaSide/common v0.0.0-20241213122118-5fbc737eb63e
github.com/danilsolovyov/doc-template v0.0.0-20230327151707-b8182a1ee9f4
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gofiber/fiber/v2 v2.51.0
github.com/gorilla/mux v1.8.1
github.com/gorilla/schema v1.2.1
github.com/minio/minio-go/v7 v7.0.81
github.com/gofiber/fiber/v2 v2.48.0
github.com/gorilla/mux v1.8.0
github.com/gorilla/schema v1.2.0
github.com/minio/minio-go/v7 v7.0.61
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.9.0
github.com/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33
github.com/twmb/franz-go v1.15.3
go.mongodb.org/mongo-driver v1.13.1
go.uber.org/zap v1.27.0
golang.org/x/oauth2 v0.15.0
google.golang.org/api v0.153.0
github.com/twmb/franz-go v1.14.3
go.mongodb.org/mongo-driver v1.12.1
go.uber.org/zap v1.25.0
golang.org/x/oauth2 v0.11.0
google.golang.org/api v0.137.0
google.golang.org/protobuf v1.31.0
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20230712221540-d9932eb7254e
)
require (
cloud.google.com/go/compute v1.23.3 // indirect
cloud.google.com/go/compute v1.23.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
github.com/andybalholm/brotli v1.0.6 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/beevik/etree v1.5.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fatih/color v1.10.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/goccy/go-json v0.10.3 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/s2a-go v0.1.7 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/google/s2a-go v0.1.5 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/lukasjarosch/go-docx v0.5.0 // 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/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/montanaflynn/stats v0.7.1 // indirect
github.com/pierrec/lz4/v4 v4.1.19 // 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
github.com/pierrec/lz4/v4 v4.1.18 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/rs/xid v1.6.0 // indirect
github.com/twmb/franz-go/pkg/kmsg v1.7.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/rs/xid v1.5.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/twmb/franz-go/pkg/kmsg v1.6.1 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasthttp v1.51.0 // indirect
github.com/valyala/fasthttp v1.48.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
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/multierr v1.11.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/appengine v1.6.8 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect
google.golang.org/grpc v1.59.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 // indirect
google.golang.org/grpc v1.57.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

213
go.sum

@ -1,16 +1,25 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=
cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY=
cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
gitea.pena/PenaSide/common v0.0.0-20241213122118-5fbc737eb63e h1:44CqlJOrUaZUsEv7ssFwyDjHn8PxTbTJqhDKlo1kLwE=
gitea.pena/PenaSide/common v0.0.0-20241213122118-5fbc737eb63e/go.mod h1:l4frySn2SkcdYonL0qyiv9+byj8+/GMLohSICnVYDTM=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/beevik/etree v1.5.0 h1:iaQZFSDS+3kYZiGoc9uKeOkUY3nYMXOKLl6KIJxiJWs=
github.com/beevik/etree v1.5.0/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/danilsolovyov/doc-template v0.0.0-20230327151707-b8182a1ee9f4 h1:GwGyqqRbG1MQi+GgPX9yX8FGNwZJPIpyxivb4OjKgnc=
github.com/danilsolovyov/doc-template v0.0.0-20230327151707-b8182a1ee9f4/go.mod h1:nR0IgQFyfxaKnzDMdxyNpNieoL4hW593trhr4q4j6dM=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -23,36 +32,37 @@ github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+m
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=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
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/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.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ=
github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gofiber/fiber/v2 v2.48.0 h1:cRVMCb9aUJDsyHxGFLwz/sGzDggdailZZyptU9F9cU0=
github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@ -61,58 +71,74 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
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/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg=
github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
github.com/google/uuid v1.1.2/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/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM=
github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w=
github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=
github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gorilla/schema v1.2.1 h1:tjDxcmdb+siIqkTNoV+qRH2mjYdr2hHe5MKXbp61ziM=
github.com/gorilla/schema v1.2.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc=
github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
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.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
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/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
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/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/lukasjarosch/go-docx v0.5.0 h1:4vU+gJ4WMdqwRvRVFF+XMw3rPfUGSXlToPJIX3mHQsQ=
github.com/lukasjarosch/go-docx v0.5.0/go.mod h1:ka/NZgDIJId48vMvcfWfduVTY7uV0/f8EgsmCjuS9X0=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
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-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
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/minio/minio-go/v7 v7.0.61 h1:87c+x8J3jxQ5VUGimV9oHdpjsAvy3fhneEBKuoKEVUI=
github.com/minio/minio-go/v7 v7.0.61/go.mod h1:BTu8FcrEw+HidY0zd/0eny43QnVNkXRPXrLXFuQBHXg=
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/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/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
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.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
@ -120,14 +146,14 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
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/twmb/franz-go v1.15.3 h1:96nCgxz4DvGPSCumz6giquYy8GGDNsYCwWcloBdjJ4w=
github.com/twmb/franz-go v1.15.3/go.mod h1:aos+d/UBuigWkOs+6WoqEPto47EvC2jipLAO5qrAu48=
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.14.3 h1:cq8rxAnVYU1uF3SRVn8eEaUf+AaXKWlB0Cl3Ca7JSa4=
github.com/twmb/franz-go v1.14.3/go.mod h1:nMAvTC2kHtK+ceaSHeHm4dlxC78389M/1DjpOswEgu4=
github.com/twmb/franz-go/pkg/kmsg v1.6.1 h1:tm6hXPv5antMHLasTfKv9R+X03AjHSkSkXhQo2c5ALM=
github.com/twmb/franz-go/pkg/kmsg v1.6.1/go.mod h1:se9Mjdt0Nwzc9lnjJ0HyDtLyBnaBDAd7pCje47OhSyw=
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=
github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g=
github.com/valyala/fasthttp v1.48.0 h1:oJWvHb9BIZToTQS3MuQ2R3bJZiNSa2KiNdeI8A+79Tc=
github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
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=
@ -136,27 +162,26 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk=
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk=
go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE=
go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.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=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
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.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
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-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
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=
@ -164,52 +189,61 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
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.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU=
golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk=
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=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.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=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/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.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.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=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
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.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
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=
@ -219,28 +253,31 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4=
google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.137.0 h1:QrKX6uNvzJLr0Fd3vWVqcyrcmFoYi036VUAsZbiF4+s=
google.golang.org/api v0.137.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg=
google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY=
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo=
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM=
google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g=
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 h1:nIgk/EEq3/YlnmVVXVnm14rC2oxgs1o0ong4sD/rd44=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 h1:wukfNtZmZUurLN/atp2hiIeTKn7QJWIQdHzqmsOnAOk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw=
google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@ -256,8 +293,14 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
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=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20230712221540-d9932eb7254e h1:nZLUtqm+u3Tf339bioyyaUsxV10RSqKeukVa52H/+DQ=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20230712221540-d9932eb7254e/go.mod h1:SCqfOb+FHQayOQcxHQKd52Az4sur3hr3Lx1I4UiLf6g=

@ -11,10 +11,10 @@ import (
"github.com/gorilla/schema"
"go.uber.org/zap"
"golang.org/x/oauth2"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/middleware"
"gitea.pena/PenaSide/docxTemplater/penadisk"
"gitea.pena/PenaSide/docxTemplater/tools"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/penadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
)
type ReqAmoSaveToken struct {
@ -112,11 +112,11 @@ func (h *Handlers) AmoSaveToken(w http.ResponseWriter, r *http.Request) {
ExpiresIn: token.Expiry,
TokenType: token.TokenType,
Privileges: map[string]model.ShortPrivilige{
model.PrivilegeTemplateCount: {
model.PrivilegeTemplateCount: model.ShortPrivilige{
Amount: model.BasicAmountPrivilegeTemplateCount,
CreatedAt: time.Now(),
},
model.PrivilegeTemplateStorage: {
model.PrivilegeTemplateStorage: model.ShortPrivilige{
Amount: model.BasicAmountPrivilegeTemplateStorage,
CreatedAt: time.Now(),
},
@ -177,7 +177,7 @@ func (h *Handlers) AmoState(w http.ResponseWriter, r *http.Request) {
return
}
penaStorage, err := h.dal.PenaDisk.GetByAmoID(ctx, amoData.ID)
penaStorage, err := h.dal.PenaDisk.GetByPenaID(ctx, amoData.PenaID)
if err != nil {
h.reportError(w, http.StatusInternalServerError, err)
return
@ -226,7 +226,7 @@ func (h *Handlers) AmoState(w http.ResponseWriter, r *http.Request) {
examples = result
}
if penaStorage.ID == "" {
if penaStorage == nil {
if _, err = penadisk.NewClient(amoData.AccountID).GetDisk(r.Context()); err != nil {
h.logger.Error("ErrorCheckPenaDisk", zap.Error(err))
}

@ -10,11 +10,11 @@ import (
"github.com/gorilla/schema"
"go.uber.org/zap"
"google.golang.org/api/drive/v3"
"gitea.pena/PenaSide/docxTemplater/dal/model"
GDisk "gitea.pena/PenaSide/docxTemplater/gdisk"
"gitea.pena/PenaSide/docxTemplater/middleware"
"gitea.pena/PenaSide/docxTemplater/templategen"
"gitea.pena/PenaSide/docxTemplater/tools"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
GDisk "penahub.gitlab.yandexcloud.net/backend/templategen/gdisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/templategen"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
)
type ReqGDiskSaveToken struct {

@ -1,23 +1,26 @@
package handlers
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"github.com/beevik/etree"
"io"
"net/http"
"net/url"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
"strconv"
"strings"
"time"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/gdisk"
"gitea.pena/PenaSide/docxTemplater/middleware"
"gitea.pena/PenaSide/docxTemplater/penadisk"
"gitea.pena/PenaSide/docxTemplater/templategen"
"gitea.pena/PenaSide/docxTemplater/yadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/gdisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/penadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/templategen"
"penahub.gitlab.yandexcloud.net/backend/templategen/yadisk"
)
type ReqGeneratorByAmoLead struct {
@ -33,22 +36,29 @@ type RespGenerated struct {
// ReqGeneratorService is the request we get on GeneratorService endpoint.
type ReqGeneratorService struct {
DocNumber string `json:"docnumber"`
Date string `json:"date"`
OrgTaxNum string `json:"orgtaxnum"`
OrgName string `json:"orgname"`
Name string `json:"name"`
Amount string `json:"amount"`
Price string `json:"price"`
Sum string `json:"sum"`
Unit string `json:"unit"` // default value set in NewReqGeneratorService()
Tax string `json:"tax"` // default value set in NewReqGeneratorService()
DocNumber string `json:"docnumber" xml:"DocNum"`
Date string `json:"date" xml:"date"`
OrgTaxNum string `json:"orgtaxnum" xml:"orgtaxnum"`
OrgName string `json:"orgname" xml:"orgname"`
Items []Item `json:"items" xml:"items>item"`
TotalSum string `xml:"totalsum"`
}
func NewReqGeneratorService() ReqGeneratorService {
return ReqGeneratorService{
Tax: "НДС не облагается",
Unit: "-",
type Item struct {
Name string `json:"name" xml:"docnumber"`
Amount string `json:"amount" xml:"amount"`
Price string `json:"price" xml:"price"`
Sum string `json:"sum" xml:"sum"`
Unit string `json:"unit" xml:"unit"` // default value set in NewItem()
Tax string `json:"tax" xml:"tax"` // default value set in NewItem()
}
func (r *ReqGeneratorService) NewItem() {
if r.Items != nil && len(r.Items) > 0 {
for i, _ := range r.Items {
r.Items[i].Tax = "НДС не облагается"
r.Items[i].Unit = "-"
}
}
}
@ -382,7 +392,6 @@ func (h *Handlers) GeneratorService(writer http.ResponseWriter, req *http.Reques
}
email := req.FormValue("email")
if email == "" {
err = errors.New("email required")
h.reportError(writer, http.StatusBadRequest, err)
@ -390,21 +399,19 @@ func (h *Handlers) GeneratorService(writer http.ResponseWriter, req *http.Reques
}
dataString := req.FormValue("data")
if dataString == "" {
err = errors.New("data required")
h.reportError(writer, http.StatusBadRequest, err)
return
}
// some default values filled
data := NewReqGeneratorService()
// maybe need to check required fields and report errors if missing
var data ReqGeneratorService
if err = json.Unmarshal([]byte(dataString), &data); err != nil {
h.reportError(writer, http.StatusBadRequest, err)
return
}
data.NewItem()
formFile, formFileHeader, err := req.FormFile("file")
if err != nil {
@ -423,8 +430,8 @@ func (h *Handlers) GeneratorService(writer http.ResponseWriter, req *http.Reques
h.reportError(writer, http.StatusBadRequest, err)
return
}
resultFile, err := templategen.GenerateBytesFile(file, data)
// TODO
resultFile, err := GenerateBytesFile(file, data)
if err != nil {
h.reportError(writer, http.StatusBadRequest, err)
return
@ -442,6 +449,92 @@ func (h *Handlers) GeneratorService(writer http.ResponseWriter, req *http.Reques
}
}
func GenerateBytesFile(file []byte, data ReqGeneratorService) ([]byte, error) {
// разархивируем документ чтобы содержимое поменять
files, err := tools.ExtractDocx(file)
if err != nil {
return nil, err
}
// надо менять только document.xml
modifiedXML, err := modifyDocumentXML(files["word/document.xml"], data)
if err != nil {
return nil, err
}
files["word/document.xml"] = modifiedXML
// заменив отредактированный - опять делаем докс файл
return tools.CreateDocx(files)
}
func modifyDocumentXML(xmlContent []byte, data ReqGeneratorService) ([]byte, error) {
doc := etree.NewDocument()
if err := doc.ReadFromBytes(xmlContent); err != nil {
return nil, err
}
// базовые плейсхолдеры которые просто заменяются
replaceMap := map[string]string{
"DocNum": data.DocNumber,
"Date": data.Date,
"Orgname": data.OrgName,
"INN": data.OrgTaxNum,
"Total": data.TotalSum,
}
for _, element := range doc.FindElements("//w:t") {
if val, exists := replaceMap[element.Text()]; exists {
element.SetText(val)
}
}
// создание таблицы
for _, element := range doc.FindElements("//w:t") {
if element.Text() == "ItemsTable" {
// родительские параметры находим
paragraph := element.Parent().Parent()
grandParent := paragraph.Parent()
// запоминаем где был этот абзац
prevElement := *paragraph
// дропаем старый абзац
grandParent.RemoveChild(paragraph)
// делаем таблицу
table := etree.NewElement("w:tbl")
tblPr := table.CreateElement("w:tblPr")
tblPr.CreateElement("w:tblStyle").CreateAttr("w:val", "TableGrid")
tblPr.CreateElement("w:tblW").CreateAttr("w:w", "5000")
headerRow := table.CreateElement("w:tr")
headers := []string{"№", "Наименование", "Кол-во", "Ед. изм.", "Цена за ед.", "Стоимость", "НДС"}
for _, header := range headers {
tools.CreateTableCell(headerRow, header, true)
}
// заполняем данными
for i, item := range data.Items {
row := table.CreateElement("w:tr")
tools.CreateTableCell(row, fmt.Sprintf("%d", i+1), false)
tools.CreateTableCell(row, item.Name, false)
tools.CreateTableCell(row, item.Amount, false)
tools.CreateTableCell(row, item.Unit, false)
tools.CreateTableCell(row, item.Price, false)
tools.CreateTableCell(row, item.Sum, false)
tools.CreateTableCell(row, item.Tax, false)
}
// вставляем таблицу на место удаленного абзаца где был плейсхолдер ItemsTable
grandParent.InsertChildAt(prevElement.Index(), table)
prevElement = *table
}
}
doc.Indent(4)
var buf bytes.Buffer
if _, err := doc.WriteTo(&buf); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
// generate - локальная функция, для генерации файла, возвращает ссылку для скачивания сгенерированного файла.
func (h *Handlers) generate(r *http.Request, file, name, storageID, storageType,
amoID string, history *model.History, data any) (string, error) {

@ -1,68 +1,91 @@
package handlers
import (
"fmt"
"github.com/stretchr/testify/assert"
"os"
"reflect"
"strings"
"testing"
"github.com/danilsolovyov/doc-template/docx"
"gitea.pena/PenaSide/docxTemplater/templategen"
)
func TestGeneratorService(t *testing.T) {
file, err := os.ReadFile("../assets/TestGeneratorService.docx")
if err != nil {
t.Error(err)
//func TestGeneratorService(t *testing.T) {
// file, err := os.ReadFile("../assets/TestGeneratorService.docx")
// if err != nil {
// t.Error(err)
// }
//
// data := NewReqGeneratorService()
//
// // is filled by json.Unmarshal
// data.DocNumber = "2"
// data.Date = "13.05.2021"
// data.OrgName = `ООО ЛИГА ХОДЬБЫ "ЖЕНЬШЕНЬ" ПРИМОРСКОГО КРАЯ`
// data.OrgTaxNum = "999888111"
// data.Sum = "60 000 руб."
// data.Name = "Консультационные услуги"
// data.Amount = "2"
// data.Price = "1500"
// data.Sum = "3000"
//
// resultBytes, err := templategen.GenerateBytesFile(file, data)
// if err != nil {
// t.Error(err)
// }
//
// document := new(docx.Docx)
// err = document.ReadBytes(resultBytes)
// if err != nil {
// t.Error(err)
// }
//
// // _ = os.WriteFile("/tmp/out3.docx", resultBytes, 0644) // TODO delete
//
// checkAllFieldsPresent(t, document.GetContent(), data)
//}
//
//func checkAllFieldsPresent(t *testing.T, content string, data interface{}) {
// t.Helper()
//
// v := reflect.ValueOf(data)
// vt := v.Type()
//
// for i := 0; i < v.NumField(); i++ {
// field := v.Field(i)
// fieldName := vt.Field(i).Name
// fieldValue := field.Interface()
//
// switch x := fieldValue.(type) {
// case string:
// if !strings.Contains(content, x) {
// t.Errorf("missing value for '%s': '%s'", fieldName, x)
// }
// default:
// t.Error("unhandled field")
// }
// }
//}
func Test_GenerateBytesFile(t *testing.T) {
data := ReqGeneratorService{
DocNumber: "123",
Date: "2023-10-05",
OrgTaxNum: "1234567890",
OrgName: "ООО 'Пример'",
Items: []Item{
{Name: "Услуга 1", Amount: "1", Price: "1000", Sum: "1000"},
{Name: "Услуга 2", Amount: "2", Price: "500", Sum: "1000"},
},
TotalSum: "5000",
}
data := NewReqGeneratorService()
data.NewItem()
// is filled by json.Unmarshal
data.DocNumber = "2"
data.Date = "13.05.2021"
data.OrgName = `ООО ЛИГА ХОДЬБЫ "ЖЕНЬШЕНЬ" ПРИМОРСКОГО КРАЯ`
data.OrgTaxNum = "999888111"
data.Sum = "60 000 руб."
data.Name = "Консультационные услуги"
data.Amount = "2"
data.Price = "1500"
data.Sum = "3000"
fmt.Println(data)
resultBytes, err := templategen.GenerateBytesFile(file, data)
if err != nil {
t.Error(err)
}
file, err := os.ReadFile("../static/examples/docx/report.docx")
assert.NoError(t, err)
genFileBytes, err := GenerateBytesFile(file, data)
assert.NoError(t, err)
document := new(docx.Docx)
err = document.ReadBytes(resultBytes)
if err != nil {
t.Error(err)
}
// _ = os.WriteFile("/tmp/out3.docx", resultBytes, 0644) // TODO delete
checkAllFieldsPresent(t, document.GetContent(), data)
}
func checkAllFieldsPresent(t *testing.T, content string, data interface{}) {
t.Helper()
v := reflect.ValueOf(data)
vt := v.Type()
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
fieldName := vt.Field(i).Name
fieldValue := field.Interface()
switch x := fieldValue.(type) {
case string:
if !strings.Contains(content, x) {
t.Errorf("missing value for '%s': '%s'", fieldName, x)
}
default:
t.Error("unhandled field")
}
}
err = os.WriteFile("testGenBytesFile.docx", genFileBytes, 0664)
assert.NoError(t, err)
}

@ -7,11 +7,11 @@ import (
"net/http"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/amo"
"gitea.pena/PenaSide/docxTemplater/dal"
GDisk "gitea.pena/PenaSide/docxTemplater/gdisk"
smtpclient "gitea.pena/PenaSide/docxTemplater/smtp-client"
YaDisk "gitea.pena/PenaSide/docxTemplater/yadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/amo"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal"
GDisk "penahub.gitlab.yandexcloud.net/backend/templategen/gdisk"
smtpclient "penahub.gitlab.yandexcloud.net/backend/templategen/smtp-client"
YaDisk "penahub.gitlab.yandexcloud.net/backend/templategen/yadisk"
)
type Handlers struct {

@ -4,8 +4,8 @@ import (
"errors"
"net/http"
"gitea.pena/PenaSide/docxTemplater/dal/mongos"
"gitea.pena/PenaSide/docxTemplater/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/mongos"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
)
type ReqGetHistoryByID struct {

@ -5,9 +5,9 @@ import (
"net/http"
"github.com/gorilla/schema"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/middleware"
"gitea.pena/PenaSide/docxTemplater/penadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/penadisk"
)
type ReqPenaDiskSetSettings struct {

@ -5,8 +5,8 @@ import (
"net/http"
"strconv"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
)
type ReqTemplateSet struct {

@ -5,8 +5,8 @@ import (
"net/http"
"github.com/gorilla/mux"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
)
type ReqTemplateGroupCreate struct {

@ -10,10 +10,10 @@ import (
"github.com/gorilla/schema"
"go.uber.org/zap"
"golang.org/x/oauth2"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/middleware"
"gitea.pena/PenaSide/docxTemplater/tools"
"gitea.pena/PenaSide/docxTemplater/yadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
"penahub.gitlab.yandexcloud.net/backend/templategen/yadisk"
)
type ReqYaDiskSaveToken struct {

24
main.go

@ -13,17 +13,17 @@ import (
"github.com/twmb/franz-go/pkg/kgo"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gitea.pena/PenaSide/docxTemplater/amo"
"gitea.pena/PenaSide/docxTemplater/broker/tariff"
"gitea.pena/PenaSide/docxTemplater/dal"
"gitea.pena/PenaSide/docxTemplater/gdisk"
"gitea.pena/PenaSide/docxTemplater/handlers"
"gitea.pena/PenaSide/docxTemplater/middleware"
"gitea.pena/PenaSide/docxTemplater/privileges"
smtpclient "gitea.pena/PenaSide/docxTemplater/smtp-client"
"gitea.pena/PenaSide/docxTemplater/tools"
"gitea.pena/PenaSide/docxTemplater/worker"
"gitea.pena/PenaSide/docxTemplater/yadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/amo"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal"
"penahub.gitlab.yandexcloud.net/backend/templategen/gdisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/handlers"
"penahub.gitlab.yandexcloud.net/backend/templategen/middleware"
"penahub.gitlab.yandexcloud.net/backend/templategen/privileges"
smtpclient "penahub.gitlab.yandexcloud.net/backend/templategen/smtp-client"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
"penahub.gitlab.yandexcloud.net/backend/templategen/worker"
"penahub.gitlab.yandexcloud.net/backend/templategen/yadisk"
)
type Env struct {
@ -112,7 +112,7 @@ func main() {
kafkaTariffClient, err := kgo.NewClient(
kgo.SeedBrokers(opts.KafkaBrokers...),
kgo.ConsumerGroup(opts.KafkaConsumerGroupID),
kgo.ConsumeResetOffset(kgo.NewOffset().AfterMilli(time.Now().UnixMilli())),
kgo.ConsumeResetOffset(kgo.NewOffset().AtStart()),
kgo.DefaultProduceTopic(opts.KafkaTariffTopic),
kgo.ConsumeTopics(opts.KafkaTariffTopic),
)

@ -4,16 +4,16 @@ import (
"context"
"encoding/json"
"errors"
"gitea.pena/PenaSide/common/jwt_adapter"
"net/http"
"strconv"
"strings"
"gitea.pena/PenaSide/docxTemplater/amo"
"gitea.pena/PenaSide/docxTemplater/dal"
"gitea.pena/PenaSide/docxTemplater/dal/model"
"gitea.pena/PenaSide/docxTemplater/tools"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/penahub_common/jwt_adapter"
"penahub.gitlab.yandexcloud.net/backend/templategen/amo"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal/model"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
)
type Middleware struct {

Binary file not shown.

@ -3,7 +3,7 @@ package templategen
import (
"strings"
"gitea.pena/PenaSide/docxTemplater/amo"
"penahub.gitlab.yandexcloud.net/backend/templategen/amo"
)
func AmoLeadFieldsToRuMap(data *amo.Lead) map[string]interface{} {

@ -1,7 +1,7 @@
package templategen
import (
GDisk "gitea.pena/PenaSide/docxTemplater/gdisk"
GDisk "penahub.gitlab.yandexcloud.net/backend/templategen/gdisk"
)
func GDiskGenerateDoc(file, name, saveFolderID string, client *GDisk.Client, data interface{}) (string, string, error) {

@ -7,7 +7,7 @@ import (
"os"
"time"
"gitea.pena/PenaSide/docxTemplater/penadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/penadisk"
)
func PenaDiskGenerateDoc(ctx context.Context, file, name, saveFolder string, client *penadisk.Client, data interface{}) (string, string, error) {

@ -7,7 +7,7 @@ import (
"os"
"time"
YaDisk "gitea.pena/PenaSide/docxTemplater/yadisk"
YaDisk "penahub.gitlab.yandexcloud.net/backend/templategen/yadisk"
)
func YaDiskGenerateDoc(ctx context.Context, file, name, saveFolder string, client *YaDisk.Client, data interface{}) (string, string, error) {

72
tools/xml_doc.go Normal file

@ -0,0 +1,72 @@
package tools
import (
"archive/zip"
"bytes"
"github.com/beevik/etree"
"io"
)
func ExtractDocx(file []byte) (map[string][]byte, error) {
archive, err := zip.NewReader(bytes.NewReader(file), int64(len(file)))
if err != nil {
return nil, err
}
files := make(map[string][]byte)
for _, f := range archive.File {
rc, err := f.Open()
if err != nil {
return nil, err
}
content, err := io.ReadAll(rc)
rc.Close()
if err != nil {
return nil, err
}
files[f.Name] = content
}
return files, nil
}
func CreateDocx(files map[string][]byte) ([]byte, error) {
var buf bytes.Buffer
zipWr := zip.NewWriter(&buf)
for name, content := range files {
file, err := zipWr.Create(name)
if err != nil {
return nil, err
}
_, err = file.Write(content)
if err != nil {
return nil, err
}
}
err := zipWr.Close()
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func CreateTableCell(row *etree.Element, text string, fat bool) {
cell := row.CreateElement("w:tc")
tcPr := cell.CreateElement("w:tcPr")
tcPr.CreateElement("w:tcW").CreateAttr("w:w", "1000")
para := cell.CreateElement("w:p")
run := para.CreateElement("w:r")
if fat {
rPr := run.CreateElement("w:rPr")
rPr.CreateElement("w:b")
}
run.CreateElement("w:t").SetText(text)
cell.AddChild(para)
}

@ -5,11 +5,11 @@ import (
"time"
"go.uber.org/zap"
"gitea.pena/PenaSide/docxTemplater/broker/tariff"
"gitea.pena/PenaSide/docxTemplater/broker/tariff/models"
"gitea.pena/PenaSide/docxTemplater/dal"
"gitea.pena/PenaSide/docxTemplater/penadisk"
"gitea.pena/PenaSide/docxTemplater/privileges"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff/models"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal"
"penahub.gitlab.yandexcloud.net/backend/templategen/penadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/privileges"
)
/* TODO: Сделать рефакторинг кода!
@ -41,29 +41,20 @@ func NewTariffWorker(deps TariffWorkerDeps) *TariffWorker {
}
func (w *TariffWorker) Run(ctx context.Context) {
minuteTick := time.NewTicker(time.Minute)
ticker := time.NewTicker(5 * time.Minute)
for {
select {
case <-ctx.Done():
w.logger.Info("tariff worker done")
minuteTick.Stop()
return
case <-minuteTick.C:
w.updatePrivilegies(ctx)
default:
w.logger.Info("tariff worker tick")
case <-ticker.C:
w.Do(ctx)
}
}
}
func (w *TariffWorker) Do(ctx context.Context) {
// проверяем новые тарифы
tariffs := w.tariffConsumer.FetchTariffs(ctx)
w.logger.Info("get tariff from redpanda", zap.Any("tariff", tariffs))
// получаем актуальные привилегии
getActualPrivileges, err := privileges.GetActualPrivileges(ctx, w.privilegesDomain)
@ -71,12 +62,11 @@ func (w *TariffWorker) Do(ctx context.Context) {
w.logger.Error("cannot get actual privileges", zap.Error(err))
return
}
w.logger.Info("tariff worker tick2", zap.String("pdomain", w.privilegesDomain))
actualPrivileges := make(map[string]models.Privilege)
for _, privilege := range getActualPrivileges {
actualPrivileges[privilege.PrivilegeID] = models.Privilege{
actualPrivileges[privilege.ID] = models.Privilege{
ID: privilege.ID,
Amount: 0,
PrivilegeID: privilege.PrivilegeID,
@ -92,13 +82,16 @@ func (w *TariffWorker) Do(ctx context.Context) {
DeletedAt: privilege.DeletedAt,
}
}
w.logger.Info("tariff worker tick3", zap.Any("pdoin", actualPrivileges))
// проверяем новые тарифы
tariffs := w.tariffConsumer.FetchTariffs(ctx)
for _, tariff := range tariffs {
w.logger.Info("get tariff from redpanda", zap.Any("tariff", tariff))
penadisk := penadisk.NewClient(tariff.UserID)
for _, newPrivilege := range tariff.Privileges {
if newPrivilege.ServiceKey != models.ServiceKey || tariff.UserID == "" || newPrivilege.ID == "" {
if newPrivilege.ServiceKey != models.ServiceKey {
continue
}
@ -126,9 +119,7 @@ func (w *TariffWorker) Do(ctx context.Context) {
}
}
}
}
func (w *TariffWorker) updatePrivilegies(ctx context.Context) {
// получаем пользователей
amos, err := w.dal.Amo.GetAll(ctx)

@ -14,7 +14,7 @@ import (
"time"
"golang.org/x/oauth2"
"gitea.pena/PenaSide/docxTemplater/tools"
"penahub.gitlab.yandexcloud.net/backend/templategen/tools"
)
const (