diff --git a/cmd/main.go b/cmd/main.go index 4d4973e..68bc347 100644 --- a/cmd/main.go +++ b/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)) } } diff --git a/go.mod b/go.mod index a829f4e..3b33cd6 100644 --- a/go.mod +++ b/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 diff --git a/go.sum b/go.sum index 7452230..9e23721 100644 --- a/go.sum +++ b/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= diff --git a/internal/app/app.go b/internal/app/app.go index 1bf2ded..8f1c037 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -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{ diff --git a/internal/controllers/initial.go b/internal/controllers/initial.go index 4131dd0..55bae3e 100644 --- a/internal/controllers/initial.go +++ b/internal/controllers/initial.go @@ -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) diff --git a/internal/controllers/user.go b/internal/controllers/user.go index 8bc68ac..2c9e288 100644 --- a/internal/controllers/user.go +++ b/internal/controllers/user.go @@ -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 { diff --git a/internal/controllers/webhook.go b/internal/controllers/webhook.go index 5ea2abd..7ffeb15 100644 --- a/internal/controllers/webhook.go +++ b/internal/controllers/webhook.go @@ -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") diff --git a/internal/initialize/config.go b/internal/initialize/config.go index ae59134..952ece7 100644 --- a/internal/initialize/config.go +++ b/internal/initialize/config.go @@ -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 } diff --git a/internal/proto/socialauth/models.pb.go b/internal/proto/socialauth/models.pb.go new file mode 100644 index 0000000..9a7236f --- /dev/null +++ b/internal/proto/socialauth/models.pb.go @@ -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 +} diff --git a/internal/repository/rules.go b/internal/repository/rules.go index 6efc09e..b695e7c 100644 --- a/internal/repository/rules.go +++ b/internal/repository/rules.go @@ -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 +// +//} diff --git a/internal/repository/utm.go b/internal/repository/utm.go index df953ec..2c0176c 100644 --- a/internal/repository/utm.go +++ b/internal/repository/utm.go @@ -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 +//} diff --git a/internal/server/http/http.go b/internal/server/http/http.go index d2ac196..b16351e 100644 --- a/internal/server/http/http.go +++ b/internal/server/http/http.go @@ -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, diff --git a/internal/service/initial.go b/internal/service/initial.go index 7563cc6..096e8e2 100644 --- a/internal/service/initial.go +++ b/internal/service/initial.go @@ -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, } } diff --git a/internal/service/user.go b/internal/service/user.go index 5bf4ee9..4315546 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -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)) } diff --git a/internal/service/webhook.go b/internal/service/webhook.go index 0d975cb..170c2ba 100644 --- a/internal/service/webhook.go +++ b/internal/service/webhook.go @@ -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(), diff --git a/internal/tools/proto.go b/internal/tools/proto.go new file mode 100644 index 0000000..b748776 --- /dev/null +++ b/internal/tools/proto.go @@ -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 +} diff --git a/internal/workers/data_updater/data_updater.go b/internal/workers/data_updater/data_updater.go index f0402cd..faf7c0f 100644 --- a/internal/workers/data_updater/data_updater.go +++ b/internal/workers/data_updater/data_updater.go @@ -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 diff --git a/pkg/amoClient/amo.go b/pkg/amoClient/amo.go index fcf1d3d..212598d 100644 --- a/pkg/amoClient/amo.go +++ b/pkg/amoClient/amo.go @@ -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) + } +} diff --git a/pkg/pena-social-auth/client.go b/pkg/pena-social-auth/client.go index 7c44a6d..718ce1d 100644 --- a/pkg/pena-social-auth/client.go +++ b/pkg/pena-social-auth/client.go @@ -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 {