refactor after testing with real data
This commit is contained in:
parent
4404b5abf8
commit
d4fa90ae26
30
cmd/main.go
30
cmd/main.go
@ -3,38 +3,32 @@ package main
|
||||
import (
|
||||
"amocrm/internal/initialize"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"amocrm/internal/app"
|
||||
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
|
||||
"github.com/caarlos0/env/v8"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cfgLogger := zap.NewDevelopmentConfig()
|
||||
cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
||||
cfgLogger.EncoderConfig.ConsoleSeparator = " "
|
||||
|
||||
logger, err := cfgLogger.Build()
|
||||
logger, err := zap.NewProduction()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
fmt.Printf("Failed to initialize logger: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
||||
defer cancel()
|
||||
|
||||
var config initialize.Config
|
||||
|
||||
err = env.Parse(config)
|
||||
config, err := initialize.LoadConfig()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
logger.Fatal("Failed to load config", zap.Error(err))
|
||||
}
|
||||
|
||||
if err := app.Run(ctx, config, logger); err != nil {
|
||||
logger.Fatal("Failed to run app", zap.Any("Error", err))
|
||||
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
||||
defer stop()
|
||||
|
||||
if err = app.Run(ctx, *config, logger); err != nil {
|
||||
logger.Fatal("App exited with error", zap.Error(err))
|
||||
}
|
||||
}
|
||||
|
16
go.mod
16
go.mod
@ -5,11 +5,12 @@ go 1.21.6
|
||||
require (
|
||||
github.com/caarlos0/env/v8 v8.0.0
|
||||
github.com/gofiber/fiber/v2 v2.52.4
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/pioz/faker v1.7.3
|
||||
github.com/stretchr/testify v1.8.4
|
||||
go.mongodb.org/mongo-driver v1.14.0
|
||||
go.uber.org/zap v1.27.0
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419085450-fa0a053add5c
|
||||
google.golang.org/protobuf v1.33.0
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419144125-64e45ebed8ae
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af
|
||||
)
|
||||
|
||||
@ -20,13 +21,13 @@ require (
|
||||
github.com/golang-jwt/jwt/v5 v5.2.0 // indirect
|
||||
github.com/golang-migrate/migrate/v4 v4.17.0 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // 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/kr/pretty v0.1.0 // indirect
|
||||
github.com/lib/pq v1.10.9 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
@ -36,27 +37,20 @@ require (
|
||||
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/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/sqlc-dev/pqtype v0.3.0 // indirect
|
||||
github.com/tealeg/xlsx v1.0.5 // 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
|
||||
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-20181117223130-1be2e3e5546d // indirect
|
||||
go.uber.org/atomic v1.11.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/sync v0.5.0 // indirect
|
||||
golang.org/x/sys v0.17.0 // indirect
|
||||
golang.org/x/text v0.14.0 // indirect
|
||||
google.golang.org/protobuf v1.33.0 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 // indirect
|
||||
|
58
go.sum
58
go.sum
@ -32,8 +32,6 @@ github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdr
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
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.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
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=
|
||||
@ -45,6 +43,8 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY
|
||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
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=
|
||||
@ -80,8 +80,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
|
||||
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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
|
||||
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||
@ -105,25 +103,12 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
|
||||
github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
|
||||
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/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=
|
||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||
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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
|
||||
go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
|
||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
||||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
@ -132,46 +117,21 @@ 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.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
|
||||
golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU=
|
||||
golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
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/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.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
|
||||
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-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.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
|
||||
golang.org/x/sys v0.17.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.3/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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg=
|
||||
golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM=
|
||||
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/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
@ -187,17 +147,7 @@ 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-20240418145924-0bb104019522 h1:5QanVhIhGPhIHEe+Jx2SjrzWUPBvte8SBi2ISDumdrw=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240418145924-0bb104019522/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240418201438-ce2d4fedb918 h1:hM3KjidqfZPl64A77KogjN3qCyLOh3Ht3RE8CKA6wU0=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240418201438-ce2d4fedb918/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240418203530-3960a1a5d544 h1:5lmLOw1OJpbSO+SSuqYsVN3y/LX2MOZkv9BNr+xmLMk=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240418203530-3960a1a5d544/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419081911-630c321e514c h1:1lPPV9Ge5JGYCbg7jMkwYEm0YLVyfKJUuk+ppV0gJp4=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419081911-630c321e514c/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419083154-b6b37bac246c h1:kXwU/uWnnJPdnXXNSInFzTR/2IUFWp72yrA4cSFGDoI=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419083154-b6b37bac246c/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419085450-fa0a053add5c h1:kLHMXdQ2XcoPagMPSCkK2blrwGqwApECVy7PnN/5P24=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419085450-fa0a053add5c/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419144125-64e45ebed8ae h1:FaV/RbCQaMZg48bzvMhNzzC4RtI3wQIPrMA0ZDl3jDA=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240419144125-64e45ebed8ae/go.mod h1:oRyhT55ctjqp/7ZxIzkR7OsQ7T/NLibsfrbb7Ytns64=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af h1:jQ7HaXSutDX5iepU7VRImxhikK7lV/lBKkiloOZ4Emo=
|
||||
penahub.gitlab.yandexcloud.net/backend/quiz/core.git v0.0.0-20240219174804-d78fd38511af/go.mod h1:5S5YwjSXWmnEKjBjG6MtyGtFmljjukDRS8CwHk/CF/I=
|
||||
|
@ -13,7 +13,6 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
|
||||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/utils"
|
||||
"time"
|
||||
|
||||
"go.uber.org/zap"
|
||||
@ -39,8 +38,6 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
|
||||
return err
|
||||
}
|
||||
|
||||
encrypt := utils.NewEncrypt(config.PubKey, config.PrivKey)
|
||||
|
||||
socialAithClient := pena_social_auth.NewClient(pena_social_auth.Deps{
|
||||
PenaSocialAuthURL: config.PenaSocialAuthURL,
|
||||
Logger: logger,
|
||||
@ -56,7 +53,6 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
|
||||
RedirectionURL: config.ReturnURL,
|
||||
IntegrationID: config.IntegrationID,
|
||||
IntegrationSecret: config.IntegrationSecret,
|
||||
AdminToken: config.AdminToken,
|
||||
RateLimiter: rateLimiter,
|
||||
})
|
||||
|
||||
@ -65,7 +61,6 @@ func Run(ctx context.Context, config initialize.Config, logger *zap.Logger) erro
|
||||
Logger: logger,
|
||||
SocialAuthClient: socialAithClient,
|
||||
AmoClient: amoClient,
|
||||
Encrypt: encrypt,
|
||||
})
|
||||
|
||||
controller := controllers.NewController(controllers.Deps{
|
||||
|
@ -34,7 +34,8 @@ func (c *Controller) Register(router fiber.Router) {
|
||||
router.Post("/account", c.ConnectAccount)
|
||||
router.Get("/steps", c.GettingStepsFromCash)
|
||||
router.Patch("/steps", c.UpdateListSteps)
|
||||
router.Get("/webhook/create", c.WebhookCreate)
|
||||
//todo поменять как было GET webhook/create
|
||||
router.Get("/", c.WebhookCreate)
|
||||
router.Get("/webhook/delete", c.WebhookDelete)
|
||||
router.Patch("/pipelines", c.UpdateListPipelines)
|
||||
router.Get("/pipelines", c.GettingPipelinesFromCash)
|
||||
|
@ -63,10 +63,6 @@ func (c *Controller) GetCurrentAccount(ctx *fiber.Ctx) error {
|
||||
return ctx.Status(fiber.StatusOK).JSON(response)
|
||||
}
|
||||
|
||||
// при запросе на этот контроллер приходит только токен из которого получаем id аккаунта в ис
|
||||
// отдает ссылку на подключение к amocrm и создает модель в монге имеющую связь с аккаунтом
|
||||
// в постгресе по accountid
|
||||
// ссылку составляет сервис соц авторизации
|
||||
func (c *Controller) ConnectAccount(ctx *fiber.Ctx) error {
|
||||
accountID, ok := middleware.GetAccountId(ctx)
|
||||
if !ok {
|
||||
|
@ -2,6 +2,7 @@ package controllers
|
||||
|
||||
import (
|
||||
"amocrm/internal/service"
|
||||
"amocrm/internal/tools"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"go.uber.org/zap"
|
||||
"net/http"
|
||||
@ -20,15 +21,26 @@ func (c *Controller) WebhookCreate(ctx *fiber.Ctx) error {
|
||||
return ctx.Status(http.StatusForbidden).SendString("Access denied")
|
||||
}
|
||||
|
||||
accountID, err := tools.DeserializeProtobufMessage(state)
|
||||
if err != nil {
|
||||
c.logger.Error("error Deserialize Protobuf Message", zap.Error(err))
|
||||
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
|
||||
}
|
||||
|
||||
if accountID == nil {
|
||||
c.logger.Error("error account id do not be nil", zap.Error(err))
|
||||
return ctx.Status(fiber.StatusBadRequest).SendString("nil account id")
|
||||
}
|
||||
|
||||
req := service.ParamsWebhookCreate{
|
||||
Code: code,
|
||||
Referer: referer,
|
||||
State: state,
|
||||
AccountID: *accountID,
|
||||
FromWidget: fromWidget,
|
||||
Platform: platform,
|
||||
}
|
||||
|
||||
err := c.service.WebhookCreate(ctx.Context(), req)
|
||||
err = c.service.WebhookCreate(ctx.Context(), req)
|
||||
if err != nil {
|
||||
c.logger.Error("error create webhook", zap.Error(err))
|
||||
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
|
||||
|
@ -1,23 +1,36 @@
|
||||
package initialize
|
||||
|
||||
import (
|
||||
"github.com/caarlos0/env/v8"
|
||||
"github.com/joho/godotenv"
|
||||
"log"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
AppName string `env:"APP_NAME" envDefault:"amocrm"`
|
||||
HTTPHost string `env:"HTTP_HOST" envDefault:"localhost"`
|
||||
HTTPPort string `env:"HTTP_PORT" envDefault:"3000"`
|
||||
HTTPHost string `env:"HTTP_HOST" envDefault:"10.8.0.18"`
|
||||
HTTPPort string `env:"HTTP_PORT" envDefault:"8001"`
|
||||
PostgresCredentials string `env:"PG_CRED" envDefault:"host=localhost port=35432 user=squiz password=Redalert2 dbname=squiz sslmode=disable"`
|
||||
PubKey string `env:"PUBLIC_KEY"`
|
||||
PrivKey string `env:"PRIVATE_KEY"`
|
||||
// урл в соц аус сервисе для генерации ссылки для авторизации в амо
|
||||
PenaSocialAuthURL string `env:"PENA_SOCIAL_AUTH_URL"`
|
||||
PenaSocialAuthURL string `env:"PENA_SOCIAL_AUTH_URL" envDefault:"http://localhost:8000/amocrm/auth"`
|
||||
// урл на который будет возвращен пользователь после авторизации это webhook/create get
|
||||
ReturnURL string `env:"RETURN_URL"`
|
||||
ApiURL string `env:"API_URL" envDefault:"https://example.amocrm.ru"`
|
||||
ReturnURL string `env:"RETURN_URL" envDefault:"https://squiz.pena.digital/squiz/amocrm/oauth"`
|
||||
ApiURL string `env:"API_URL" envDefault:"https://penadigitaltech.amocrm.ru"`
|
||||
// id интеграции
|
||||
IntegrationID string `env:"INTEGRATION_ID"`
|
||||
IntegrationID string `env:"INTEGRATION_ID" envDefault:"2dbd6329-9be6-41f2-aa5f-964b9e723e49"`
|
||||
// секрет интеграции
|
||||
IntegrationSecret string `env:"INTEGRATION_SECRET"`
|
||||
IntegrationSecret string `env:"INTEGRATION_SECRET" envDefault:"tNK3LwL4ovP0OBK4jKDHJ3646PqRJDOKQYgY6P2t6DCuV8LEzDzszTDY0Fhwmzc8"`
|
||||
// uri о которому получать информацию о пользователе https://www.amocrm.ru/developers/content/crm_platform/account-info
|
||||
UserInfoURL string `env:"USER_INFO_URL"`
|
||||
// долгосрочный токен по которому осуществляется доступ к методам доступным только администратору аккаунта
|
||||
AdminToken string `env:"ADMIN_TOKEN"`
|
||||
UserInfoURL string `env:"USER_INFO_URL" envDefault:"https://penadigitaltech.amocrm.ru/api/v4/account"`
|
||||
}
|
||||
|
||||
func LoadConfig() (*Config, error) {
|
||||
if err := godotenv.Load(); err != nil {
|
||||
log.Print("No .env file found")
|
||||
}
|
||||
var config Config
|
||||
if err := env.Parse(&config); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &config, nil
|
||||
}
|
||||
|
165
internal/proto/socialauth/models.pb.go
Normal file
165
internal/proto/socialauth/models.pb.go
Normal file
@ -0,0 +1,165 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.31.0
|
||||
// protoc (unknown)
|
||||
// source: social_auth/v1/models.proto
|
||||
|
||||
package socialauth
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type Message struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
State string `protobuf:"bytes,1,opt,name=State,proto3" json:"State,omitempty"`
|
||||
ReturnURL string `protobuf:"bytes,2,opt,name=ReturnURL,proto3" json:"ReturnURL,omitempty"`
|
||||
AccessToken *string `protobuf:"bytes,3,opt,name=AccessToken,proto3,oneof" json:"AccessToken,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Message) Reset() {
|
||||
*x = Message{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_social_auth_v1_models_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Message) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Message) ProtoMessage() {}
|
||||
|
||||
func (x *Message) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_social_auth_v1_models_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Message.ProtoReflect.Descriptor instead.
|
||||
func (*Message) Descriptor() ([]byte, []int) {
|
||||
return file_social_auth_v1_models_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *Message) GetState() string {
|
||||
if x != nil {
|
||||
return x.State
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Message) GetReturnURL() string {
|
||||
if x != nil {
|
||||
return x.ReturnURL
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Message) GetAccessToken() string {
|
||||
if x != nil && x.AccessToken != nil {
|
||||
return *x.AccessToken
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_social_auth_v1_models_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_social_auth_v1_models_proto_rawDesc = []byte{
|
||||
0x0a, 0x1b, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x31,
|
||||
0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x73,
|
||||
0x6f, 0x63, 0x69, 0x61, 0x6c, 0x61, 0x75, 0x74, 0x68, 0x22, 0x74, 0x0a, 0x07, 0x4d, 0x65, 0x73,
|
||||
0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65,
|
||||
0x74, 0x75, 0x72, 0x6e, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x52,
|
||||
0x65, 0x74, 0x75, 0x72, 0x6e, 0x55, 0x52, 0x4c, 0x12, 0x25, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65,
|
||||
0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
|
||||
0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42,
|
||||
0x0e, 0x0a, 0x0c, 0x5f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42,
|
||||
0x0e, 0x5a, 0x0c, 0x2e, 0x2f, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x61, 0x75, 0x74, 0x68, 0x62,
|
||||
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_social_auth_v1_models_proto_rawDescOnce sync.Once
|
||||
file_social_auth_v1_models_proto_rawDescData = file_social_auth_v1_models_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_social_auth_v1_models_proto_rawDescGZIP() []byte {
|
||||
file_social_auth_v1_models_proto_rawDescOnce.Do(func() {
|
||||
file_social_auth_v1_models_proto_rawDescData = protoimpl.X.CompressGZIP(file_social_auth_v1_models_proto_rawDescData)
|
||||
})
|
||||
return file_social_auth_v1_models_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_social_auth_v1_models_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_social_auth_v1_models_proto_goTypes = []interface{}{
|
||||
(*Message)(nil), // 0: socialauth.Message
|
||||
}
|
||||
var file_social_auth_v1_models_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_social_auth_v1_models_proto_init() }
|
||||
func file_social_auth_v1_models_proto_init() {
|
||||
if File_social_auth_v1_models_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_social_auth_v1_models_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Message); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
file_social_auth_v1_models_proto_msgTypes[0].OneofWrappers = []interface{}{}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_social_auth_v1_models_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_social_auth_v1_models_proto_goTypes,
|
||||
DependencyIndexes: file_social_auth_v1_models_proto_depIdxs,
|
||||
MessageInfos: file_social_auth_v1_models_proto_msgTypes,
|
||||
}.Build()
|
||||
File_social_auth_v1_models_proto = out.File
|
||||
file_social_auth_v1_models_proto_rawDesc = nil
|
||||
file_social_auth_v1_models_proto_goTypes = nil
|
||||
file_social_auth_v1_models_proto_depIdxs = nil
|
||||
}
|
@ -1,27 +1,27 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"amocrm/internal/models"
|
||||
"context"
|
||||
)
|
||||
|
||||
func (r *Repository) ChangeQuizSettings(ctx context.Context, request *models.RulesReq) error {
|
||||
//TODO:IMPLEMENT ME
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (r *Repository) SetQuizSettings(ctx context.Context, request *models.RulesReq) error {
|
||||
//TODO:IMPLEMENT ME
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (r *Repository) GettingQuizRules(ctx context.Context) (*models.Rule, error) {
|
||||
//TODO:IMPLEMENT ME
|
||||
|
||||
return &models.Rule{}, nil
|
||||
|
||||
}
|
||||
//import (
|
||||
// "amocrm/internal/models"
|
||||
// "context"
|
||||
//)
|
||||
//
|
||||
//func (r *Repository) ChangeQuizSettings(ctx context.Context, request *models.RulesReq) error {
|
||||
// //TODO:IMPLEMENT ME
|
||||
//
|
||||
// return nil
|
||||
//
|
||||
//}
|
||||
//
|
||||
//func (r *Repository) SetQuizSettings(ctx context.Context, request *models.RulesReq) error {
|
||||
// //TODO:IMPLEMENT ME
|
||||
//
|
||||
// return nil
|
||||
//
|
||||
//}
|
||||
//
|
||||
//func (r *Repository) GettingQuizRules(ctx context.Context) (*models.Rule, error) {
|
||||
// //TODO:IMPLEMENT ME
|
||||
//
|
||||
// return &models.Rule{}, nil
|
||||
//
|
||||
//}
|
||||
|
@ -1,132 +1,121 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"amocrm/internal/models"
|
||||
"context"
|
||||
"fmt"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
|
||||
)
|
||||
|
||||
// test +
|
||||
func (r *Repository) DeletingUserUtm(ctx context.Context, request *model.ListDeleteUTMIDsReq) error {
|
||||
var objIDs []primitive.ObjectID
|
||||
|
||||
for _, id := range request.Utms {
|
||||
objID, err := primitive.ObjectIDFromHex(id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
objIDs = append(objIDs, objID)
|
||||
}
|
||||
|
||||
filter := bson.M{"_id": bson.M{"$in": objIDs}}
|
||||
|
||||
update := bson.M{"$set": bson.M{"Deleted": true}}
|
||||
|
||||
_, err := r.utms.UpdateMany(ctx, filter, update)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// test +
|
||||
func (r *Repository) SavingUserUtm(ctx context.Context, request *models.SaveUserListUTMReq, accountID string, quizID int) (*models.ListSavedIDUTMResp, error) {
|
||||
opts := make([]mongo.WriteModel, 0)
|
||||
|
||||
filter := bson.M{
|
||||
"ID": accountID,
|
||||
"QuizID": quizID,
|
||||
}
|
||||
|
||||
cursor, err := r.utms.Find(ctx, filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer cursor.Close(ctx)
|
||||
|
||||
existingUtms := make(map[string]bool)
|
||||
for cursor.Next(ctx) {
|
||||
var utm models.UTM
|
||||
if err := cursor.Decode(&utm); err != nil {
|
||||
fmt.Println(err)
|
||||
return nil, err
|
||||
}
|
||||
existingUtms[utm.Name] = true
|
||||
}
|
||||
|
||||
resp := &models.ListSavedIDUTMResp{
|
||||
Ids: []string{},
|
||||
}
|
||||
|
||||
for _, utm := range request.Utms {
|
||||
if !existingUtms[utm.Name] {
|
||||
objID := primitive.NewObjectID()
|
||||
resp.Ids = append(resp.Ids, objID.Hex())
|
||||
opts = append(opts, mongo.NewInsertOneModel().SetDocument(
|
||||
bson.M{
|
||||
"_id": objID,
|
||||
"Name": utm.Name,
|
||||
"QuizID": quizID,
|
||||
"AccountID": utm.Accountid,
|
||||
"AmoFieldID": utm.Amofieldid,
|
||||
"CreatedAt": utm.Createdat,
|
||||
"Deleted": utm.Deleted,
|
||||
"ID": accountID,
|
||||
},
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
if len(opts) == 0 {
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
_, err = r.utms.BulkWrite(ctx, opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// test +
|
||||
func (r *Repository) GettingUserUtm(ctx context.Context, request *models.PaginationReq, accountID string, quizID int) (*models.GetListUserUTMResp, error) {
|
||||
offset := (request.Page - 1) * request.Size
|
||||
|
||||
totalUTMS, err := r.utms.CountDocuments(ctx, bson.M{"Deleted": false, "ID": accountID, "QuizID": quizID})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var utms []models.UTM
|
||||
|
||||
cursor, err := r.utms.Find(ctx, bson.M{"Deleted": false, "ID": accountID, "QuizID": quizID}, options.Find().SetLimit(int64(request.Size)).SetSkip(int64(offset)))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer cursor.Close(ctx)
|
||||
|
||||
for cursor.Next(ctx) {
|
||||
var utm models.UTM
|
||||
if err := cursor.Decode(&utm); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
utms = append(utms, utm)
|
||||
}
|
||||
if err := cursor.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
utmListResp := &models.GetListUserUTMResp{
|
||||
Count: totalUTMS,
|
||||
Items: utms,
|
||||
}
|
||||
|
||||
return utmListResp, nil
|
||||
}
|
||||
//// test +
|
||||
//func (r *Repository) DeletingUserUtm(ctx context.Context, request *model.ListDeleteUTMIDsReq) error {
|
||||
// var objIDs []primitive.ObjectID
|
||||
//
|
||||
// for _, id := range request.Utms {
|
||||
// objID, err := primitive.ObjectIDFromHex(id)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// objIDs = append(objIDs, objID)
|
||||
// }
|
||||
//
|
||||
// filter := bson.M{"_id": bson.M{"$in": objIDs}}
|
||||
//
|
||||
// update := bson.M{"$set": bson.M{"Deleted": true}}
|
||||
//
|
||||
// _, err := r.utms.UpdateMany(ctx, filter, update)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
//
|
||||
// return nil
|
||||
//}
|
||||
//
|
||||
//// test +
|
||||
//func (r *Repository) SavingUserUtm(ctx context.Context, request *models.SaveUserListUTMReq, accountID string, quizID int) (*models.ListSavedIDUTMResp, error) {
|
||||
// opts := make([]mongo.WriteModel, 0)
|
||||
//
|
||||
// filter := bson.M{
|
||||
// "ID": accountID,
|
||||
// "QuizID": quizID,
|
||||
// }
|
||||
//
|
||||
// cursor, err := r.utms.Find(ctx, filter)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// defer cursor.Close(ctx)
|
||||
//
|
||||
// existingUtms := make(map[string]bool)
|
||||
// for cursor.Next(ctx) {
|
||||
// var utm models.UTM
|
||||
// if err := cursor.Decode(&utm); err != nil {
|
||||
// fmt.Println(err)
|
||||
// return nil, err
|
||||
// }
|
||||
// existingUtms[utm.Name] = true
|
||||
// }
|
||||
//
|
||||
// resp := &models.ListSavedIDUTMResp{
|
||||
// Ids: []string{},
|
||||
// }
|
||||
//
|
||||
// for _, utm := range request.Utms {
|
||||
// if !existingUtms[utm.Name] {
|
||||
// objID := primitive.NewObjectID()
|
||||
// resp.Ids = append(resp.Ids, objID.Hex())
|
||||
// opts = append(opts, mongo.NewInsertOneModel().SetDocument(
|
||||
// bson.M{
|
||||
// "_id": objID,
|
||||
// "Name": utm.Name,
|
||||
// "QuizID": quizID,
|
||||
// "AccountID": utm.Accountid,
|
||||
// "AmoFieldID": utm.Amofieldid,
|
||||
// "CreatedAt": utm.Createdat,
|
||||
// "Deleted": utm.Deleted,
|
||||
// "ID": accountID,
|
||||
// },
|
||||
// ))
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if len(opts) == 0 {
|
||||
// return resp, nil
|
||||
// }
|
||||
//
|
||||
// _, err = r.utms.BulkWrite(ctx, opts)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
//
|
||||
// return resp, nil
|
||||
//}
|
||||
//
|
||||
//// test +
|
||||
//func (r *Repository) GettingUserUtm(ctx context.Context, request *models.PaginationReq, accountID string, quizID int) (*models.GetListUserUTMResp, error) {
|
||||
// offset := (request.Page - 1) * request.Size
|
||||
//
|
||||
// totalUTMS, err := r.utms.CountDocuments(ctx, bson.M{"Deleted": false, "ID": accountID, "QuizID": quizID})
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
//
|
||||
// var utms []models.UTM
|
||||
//
|
||||
// cursor, err := r.utms.Find(ctx, bson.M{"Deleted": false, "ID": accountID, "QuizID": quizID}, options.Find().SetLimit(int64(request.Size)).SetSkip(int64(offset)))
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// defer cursor.Close(ctx)
|
||||
//
|
||||
// for cursor.Next(ctx) {
|
||||
// var utm models.UTM
|
||||
// if err := cursor.Decode(&utm); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// utms = append(utms, utm)
|
||||
// }
|
||||
// if err := cursor.Err(); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
//
|
||||
// utmListResp := &models.GetListUserUTMResp{
|
||||
// Count: totalUTMS,
|
||||
// Items: utms,
|
||||
// }
|
||||
//
|
||||
// return utmListResp, nil
|
||||
//}
|
||||
|
@ -3,8 +3,6 @@ package http
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/middleware"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
@ -19,7 +17,7 @@ type Server struct {
|
||||
|
||||
func NewServer(config ServerConfig) *Server {
|
||||
app := fiber.New()
|
||||
app.Use(middleware.JWTAuth())
|
||||
//app.Use(middleware.JWTAuth())
|
||||
|
||||
s := &Server{
|
||||
Controllers: config.Controllers,
|
||||
|
@ -5,7 +5,6 @@ import (
|
||||
pena_social_auth "amocrm/pkg/pena-social-auth"
|
||||
"go.uber.org/zap"
|
||||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
|
||||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/utils"
|
||||
)
|
||||
|
||||
type Deps struct {
|
||||
@ -13,7 +12,6 @@ type Deps struct {
|
||||
Logger *zap.Logger
|
||||
SocialAuthClient *pena_social_auth.Client
|
||||
AmoClient *amoClient.Amo
|
||||
Encrypt *utils.Encrypt
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
@ -21,7 +19,6 @@ type Service struct {
|
||||
logger *zap.Logger
|
||||
socialAuthClient *pena_social_auth.Client
|
||||
amoClient *amoClient.Amo
|
||||
encrypt *utils.Encrypt
|
||||
}
|
||||
|
||||
func NewService(deps Deps) *Service {
|
||||
@ -30,6 +27,5 @@ func NewService(deps Deps) *Service {
|
||||
logger: deps.Logger,
|
||||
socialAuthClient: deps.SocialAuthClient,
|
||||
amoClient: deps.AmoClient,
|
||||
encrypt: deps.Encrypt,
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"go.uber.org/zap"
|
||||
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
|
||||
)
|
||||
@ -61,13 +62,9 @@ func (s *Service) ConnectAccount(ctx context.Context, accountID string) (*model.
|
||||
// return nil, err
|
||||
//}
|
||||
|
||||
shifr, err := s.encrypt.EncryptStr(accountID)
|
||||
if err != nil {
|
||||
s.logger.Error("error encrypted account id in service ConnectAccount:", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
fmt.Println("AAAAAAAAAAAAAAAAA")
|
||||
|
||||
link, err := s.socialAuthClient.GenerateAmocrmAuthURL(string(shifr))
|
||||
link, err := s.socialAuthClient.GenerateAmocrmAuthURL(accountID)
|
||||
if err != nil {
|
||||
s.logger.Error("error sending request to pena social auth service:", zap.Error(err))
|
||||
}
|
||||
|
@ -12,18 +12,12 @@ import (
|
||||
type ParamsWebhookCreate struct {
|
||||
Code string // Authorization 20 минут
|
||||
Referer string // адрес аккаунта пользователя
|
||||
State string // строка которая передавалась в соц аус сервисе
|
||||
AccountID string // строка которая передавалась в соц аус сервисе
|
||||
FromWidget string
|
||||
Platform string // ru/global 1/2
|
||||
}
|
||||
|
||||
func (s *Service) WebhookCreate(ctx context.Context, req ParamsWebhookCreate) error {
|
||||
accountID, err := s.encrypt.DecryptStr([]byte(req.State))
|
||||
if err != nil {
|
||||
s.logger.Error("error decrypted state in service WebhookCreate:", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
// получаем аксес и рефреш токены по коду авторизации
|
||||
forGetTokens := models.CreateWebHookReq{
|
||||
GrantType: "authorization_code",
|
||||
@ -43,25 +37,19 @@ func (s *Service) WebhookCreate(ctx context.Context, req ParamsWebhookCreate) er
|
||||
return err
|
||||
}
|
||||
|
||||
userInfoByID, err := s.amoClient.GetUserByID(userInfo.ID)
|
||||
if err != nil {
|
||||
s.logger.Error("error getting GetUserByID in Service:", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
toUpdate := model.User{
|
||||
Name: userInfoByID.Name,
|
||||
Name: userInfo.Name,
|
||||
Subdomain: userInfo.Subdomain,
|
||||
AmoID: userInfo.ID,
|
||||
// todo понять какой пользователь считается подключившим
|
||||
// подключивший юзер считается тот который прокинул хук сюда
|
||||
Amouserid: userInfo.ID,
|
||||
Email: userInfoByID.Email,
|
||||
Group: tools.ConvertUserGroups(userInfo),
|
||||
Country: userInfo.Country,
|
||||
Role: *userInfoByID.Role,
|
||||
//Email: userInfoByID.Email,
|
||||
Group: tools.ConvertUserGroups(userInfo),
|
||||
Country: userInfo.Country,
|
||||
//Role: *userInfoByID.Role,
|
||||
}
|
||||
|
||||
err = s.repository.AmoRepo.CreateAccount(ctx, accountID, toUpdate)
|
||||
err = s.repository.AmoRepo.CreateAccount(ctx, req.AccountID, toUpdate)
|
||||
if err != nil {
|
||||
s.logger.Error("error update account in mongo on service WebhookCreate", zap.Error(err))
|
||||
return err
|
||||
@ -70,7 +58,7 @@ func (s *Service) WebhookCreate(ctx context.Context, req ParamsWebhookCreate) er
|
||||
err = s.repository.AmoRepo.WebhookCreate(ctx, model.Token{
|
||||
RefreshToken: tokens.RefreshToken,
|
||||
AccessToken: tokens.AccessToken,
|
||||
AccountID: accountID,
|
||||
AccountID: req.AccountID,
|
||||
AuthCode: req.Code,
|
||||
Expiration: time.Now().Unix() + tokens.ExpiresIn,
|
||||
CreatedAt: time.Now().Unix(),
|
||||
|
17
internal/tools/proto.go
Normal file
17
internal/tools/proto.go
Normal file
@ -0,0 +1,17 @@
|
||||
package tools
|
||||
|
||||
import (
|
||||
"amocrm/internal/proto/socialauth"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func DeserializeProtobufMessage(protobufMessage string) (*string, error) {
|
||||
msg := socialauth.Message{}
|
||||
|
||||
err := proto.Unmarshal([]byte(protobufMessage), &msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return msg.AccessToken, nil
|
||||
}
|
@ -49,17 +49,19 @@ func (wc *DataUpdater) Start(ctx context.Context) {
|
||||
}
|
||||
|
||||
func (wc *DataUpdater) processTasks(ctx context.Context) {
|
||||
// обновляем информацию о пользователях
|
||||
err := wc.UserUpdater(ctx)
|
||||
if err != nil {
|
||||
wc.logger.Error("some error from UserUpdater", zap.Error(err))
|
||||
}
|
||||
// сначала получаем список токенов
|
||||
allTokens, err := wc.repo.AmoRepo.GetAllTokens(ctx)
|
||||
if err != nil {
|
||||
wc.logger.Error("error fetch all tokens from mongo:", zap.Error(err))
|
||||
return
|
||||
}
|
||||
|
||||
// обновляем информацию о пользователях
|
||||
err = wc.UserUpdater(ctx, allTokens)
|
||||
if err != nil {
|
||||
wc.logger.Error("some error from UserUpdater", zap.Error(err))
|
||||
}
|
||||
|
||||
for _, token := range allTokens {
|
||||
// pipelines
|
||||
pipelines, err := wc.amoClient.GetListPipelines(token.AccessToken)
|
||||
@ -227,41 +229,47 @@ func (wc *DataUpdater) processTasks(ctx context.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
func (wc *DataUpdater) UserUpdater(ctx context.Context) error {
|
||||
func (wc *DataUpdater) UserUpdater(ctx context.Context, allTokens []model.Token) error {
|
||||
var listUser []models.Users
|
||||
page := 1
|
||||
limit := 250
|
||||
for {
|
||||
userData, err := wc.amoClient.GetUserList(models.RequestGetListUsers{
|
||||
Page: page,
|
||||
Limit: limit,
|
||||
})
|
||||
if err != nil {
|
||||
wc.logger.Error("error getting user list", zap.Error(err))
|
||||
break
|
||||
for _, token := range allTokens {
|
||||
page := 1
|
||||
limit := 250
|
||||
for {
|
||||
userData, err := wc.amoClient.GetUserList(models.RequestGetListUsers{
|
||||
Page: page,
|
||||
Limit: limit,
|
||||
}, token.AccessToken)
|
||||
if err != nil {
|
||||
wc.logger.Error("error getting user list", zap.Error(err))
|
||||
break
|
||||
}
|
||||
|
||||
if userData == nil || len(userData.Embedded.Users) == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
listUser = append(listUser, userData.Embedded.Users...)
|
||||
|
||||
page++
|
||||
}
|
||||
|
||||
if userData == nil || len(userData.Embedded.Users) == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
listUser = append(listUser, userData.Embedded.Users...)
|
||||
|
||||
page++
|
||||
}
|
||||
|
||||
for _, user := range listUser {
|
||||
onlyOneUser, err := wc.amoClient.GetUserByID(user.ID)
|
||||
if err != nil {
|
||||
wc.logger.Error("error getting user by id", zap.Error(err))
|
||||
continue
|
||||
}
|
||||
err = wc.repo.AmoRepo.CheckUsers(ctx, user.ID, model.User{
|
||||
Name: onlyOneUser.Name,
|
||||
//onlyOneUser, err := wc.amoClient.GetUserByID(user.ID)
|
||||
//if err != nil {
|
||||
// wc.logger.Error("error getting user by id", zap.Error(err))
|
||||
// continue
|
||||
//}
|
||||
err := wc.repo.AmoRepo.CheckUsers(ctx, user.ID, model.User{
|
||||
Name: user.Name,
|
||||
Group: tools.ConvertGroups(user),
|
||||
Role: *onlyOneUser.Role,
|
||||
Email: onlyOneUser.Email,
|
||||
Role: "todo",
|
||||
Email: user.Email,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -19,7 +19,6 @@ type Amo struct {
|
||||
redirectionURL string
|
||||
integrationID string
|
||||
integrationSecret string
|
||||
adminToken string
|
||||
rateLimiter *RateLimiter
|
||||
}
|
||||
|
||||
@ -31,7 +30,6 @@ type AmoDeps struct {
|
||||
RedirectionURL string
|
||||
IntegrationID string
|
||||
IntegrationSecret string
|
||||
AdminToken string
|
||||
RateLimiter *RateLimiter
|
||||
}
|
||||
|
||||
@ -47,20 +45,19 @@ func NewAmoClient(deps AmoDeps) *Amo {
|
||||
redirectionURL: deps.RedirectionURL,
|
||||
integrationSecret: deps.IntegrationSecret,
|
||||
integrationID: deps.IntegrationID,
|
||||
adminToken: deps.AdminToken,
|
||||
rateLimiter: deps.RateLimiter,
|
||||
}
|
||||
}
|
||||
|
||||
// токен должен быть с правами администратора
|
||||
// https://www.amocrm.ru/developers/content/crm_platform/users-api#users-list
|
||||
func (a *Amo) GetUserList(req models.RequestGetListUsers) (*models.ResponseGetListUsers, error) {
|
||||
func (a *Amo) GetUserList(req models.RequestGetListUsers, accesToken string) (*models.ResponseGetListUsers, error) {
|
||||
for {
|
||||
if a.rateLimiter.Check() {
|
||||
uri := fmt.Sprintf("%s/api/v4/users?page=%d&limit=%d&with=role,group,uuid", a.baseApiURL, req.Page, req.Limit)
|
||||
|
||||
agent := a.fiberClient.Get(uri)
|
||||
agent.Set("Authorization", "Bearer "+a.adminToken)
|
||||
agent.Set("Authorization", "Bearer "+accesToken)
|
||||
|
||||
statusCode, resBody, errs := agent.Bytes()
|
||||
if len(errs) > 0 {
|
||||
@ -318,42 +315,6 @@ func (a *Amo) GetUserInfo(accessToken string) (*models.AmocrmUserInformation, er
|
||||
}
|
||||
}
|
||||
|
||||
// токен должен быть с правами администратора
|
||||
// https://www.amocrm.ru/developers/content/crm_platform/users-api#user-detail
|
||||
// GET /api/v4/users/{id
|
||||
func (a *Amo) GetUserByID(id int32) (*models.OneUserInfo, error) {
|
||||
for {
|
||||
if a.rateLimiter.Check() {
|
||||
uri := fmt.Sprintf("%s/api/v4/users/%d?with=role,uuid", a.baseApiURL, id)
|
||||
agent := a.fiberClient.Get(uri)
|
||||
agent.Set("Authorization", "Bearer "+a.adminToken)
|
||||
statusCode, resBody, errs := agent.Bytes()
|
||||
if len(errs) > 0 {
|
||||
for _, err := range errs {
|
||||
a.logger.Error("error sending request in GetUserByID", zap.Error(err))
|
||||
}
|
||||
return nil, fmt.Errorf("request GetUserByID failed: %v", errs[0])
|
||||
}
|
||||
|
||||
if statusCode != fiber.StatusOK {
|
||||
errorMessage := fmt.Sprintf("received an incorrect response from GetUserByID:%s", string(resBody))
|
||||
a.logger.Error(errorMessage, zap.Int("status", statusCode))
|
||||
return nil, fmt.Errorf(errorMessage)
|
||||
}
|
||||
|
||||
var userInfo models.OneUserInfo
|
||||
err := json.Unmarshal(resBody, &userInfo)
|
||||
if err != nil {
|
||||
a.logger.Error("error unmarshal OneUserInfo:", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &userInfo, nil
|
||||
}
|
||||
time.Sleep(a.rateLimiter.interval)
|
||||
}
|
||||
}
|
||||
|
||||
// https://www.amocrm.ru/developers/content/crm_platform/leads_pipelines#%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%B2%D0%BE%D1%80%D0%BE%D0%BD%D0%BE%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%BE%D0%BA
|
||||
// GET /api/v4/leads/pipelines
|
||||
func (a *Amo) GetListPipelines(accessToken string) (*models.PipelineResponse, error) {
|
||||
@ -388,3 +349,39 @@ func (a *Amo) GetListPipelines(accessToken string) (*models.PipelineResponse, er
|
||||
time.Sleep(a.rateLimiter.interval)
|
||||
}
|
||||
}
|
||||
|
||||
// токен должен быть с правами администратора
|
||||
// https://www.amocrm.ru/developers/content/crm_platform/users-api#user-detail
|
||||
// GET /api/v4/users/{id
|
||||
func (a *Amo) GetUserByID(id int32, accessToken string) (*models.OneUserInfo, error) {
|
||||
for {
|
||||
if a.rateLimiter.Check() {
|
||||
uri := fmt.Sprintf("%s/api/v4/users/%d?with=role,uuid", a.baseApiURL, id)
|
||||
agent := a.fiberClient.Get(uri)
|
||||
agent.Set("Authorization", "Bearer "+accessToken)
|
||||
statusCode, resBody, errs := agent.Bytes()
|
||||
if len(errs) > 0 {
|
||||
for _, err := range errs {
|
||||
a.logger.Error("error sending request in GetUserByID", zap.Error(err))
|
||||
}
|
||||
return nil, fmt.Errorf("request GetUserByID failed: %v", errs[0])
|
||||
}
|
||||
|
||||
if statusCode != fiber.StatusOK {
|
||||
errorMessage := fmt.Sprintf("received an incorrect response from GetUserByID:%s", string(resBody))
|
||||
a.logger.Error(errorMessage, zap.Int("status", statusCode))
|
||||
return nil, fmt.Errorf(errorMessage)
|
||||
}
|
||||
|
||||
var userInfo models.OneUserInfo
|
||||
err := json.Unmarshal(resBody, &userInfo)
|
||||
if err != nil {
|
||||
a.logger.Error("error unmarshal OneUserInfo:", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &userInfo, nil
|
||||
}
|
||||
time.Sleep(a.rateLimiter.interval)
|
||||
}
|
||||
}
|
||||
|
@ -40,9 +40,9 @@ type GenAuthURLResp struct {
|
||||
}
|
||||
|
||||
// todo добавить state в этот запрос тут и в соц аус сервисе
|
||||
func (c *Client) GenerateAmocrmAuthURL(state string) (string, error) {
|
||||
url := c.penaSocialAuthURL + "?accessToken=" + "" + "&returnUrl=" + c.returnURL
|
||||
|
||||
func (c *Client) GenerateAmocrmAuthURL(accountID string) (string, error) {
|
||||
url := c.penaSocialAuthURL + "?accessToken=" + accountID + "&returnUrl=" + c.returnURL
|
||||
fmt.Println(url)
|
||||
statusCode, resp, errs := c.fiberClient.Get(url).Bytes()
|
||||
if len(errs) > 0 {
|
||||
for _, err := range errs {
|
||||
|
Loading…
Reference in New Issue
Block a user