From 78cb03ec626f1b3535abd4389cb67d3b8603b5d4 Mon Sep 17 00:00:00 2001 From: UnicoYal Date: Wed, 11 Dec 2024 16:49:16 +0300 Subject: [PATCH] Linter --- .github/workflows/cd.yaml | 2 +- .github/workflows/ci.yaml | 2 +- .github/workflows/linter.yaml | 24 + .golangci.pipeline.yml | 42 ++ auth_service/internal/auth/auth.go | 6 +- .../auth/repository/repository_test.go | 19 +- .../internal/auth/service/cookie/cookie.go | 2 +- cmd/main.go | 3 +- go.mod | 24 +- go.sum | 66 ++- internal/app/app.go | 24 +- internal/app/app_test.go | 84 ---- .../movie/service/elastic_service_actor.go | 1 + .../movie/service/elastic_service_movie.go | 1 + internal/app/movie/service/get_actor.go | 1 + internal/app/secur/csrf/handlers/csrf.go | 3 +- internal/app/user/delivery/handler.go | 4 +- internal/app/user/delivery/handler_test.go | 42 +- internal/app/user/service/service.go | 4 +- internal/db/script_elastic/script.go | 455 ++++++++++-------- internal/middleware/log.go | 2 +- movie_service/internal/movie/movie.go | 6 +- .../internal/movie/repository/actordb/db.go | 6 +- .../repository/elasticsearch_search_actor.go | 13 +- .../repository/elasticsearch_search_movie.go | 16 +- .../movie/repository/get_movie_actors.go | 4 +- .../repository/metrics_utils/metrics_utils.go | 2 +- .../movie/repository/movie_collectiondb/db.go | 18 +- .../internal/movie/repository/moviedb/db.go | 24 +- .../movie/repository/repository_test.go | 107 ++-- .../internal/movie/repository/staff/db.go | 4 +- .../internal/movie/service/service_test.go | 2 +- payment_service/internal/payment/payment.go | 6 +- .../repository/metrics_utils/metrics_utils.go | 2 +- .../payment/repository/paymentdb/db.go | 12 +- .../internal/user/repository/favoritedb/db.go | 30 +- .../repository/metrics_utils/metrics_utils.go | 2 +- .../user/repository/repository_test.go | 134 ++++-- .../user/repository/reset_favorite.go | 2 +- .../user/repository/subscriptiondb/db.go | 18 +- .../internal/user/repository/userdb/db.go | 30 +- user_service/internal/user/user.go | 6 +- 42 files changed, 746 insertions(+), 509 deletions(-) create mode 100644 .github/workflows/linter.yaml create mode 100644 .golangci.pipeline.yml diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml index d9e371d7..766b038d 100644 --- a/.github/workflows/cd.yaml +++ b/.github/workflows/cd.yaml @@ -1,4 +1,4 @@ -name: Build and Push Docker Images +name: CD on: push: diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b9a06d11..077049dc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,4 +1,4 @@ -name: Run Tests with Docker +name: CI on: push: diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml new file mode 100644 index 00000000..88aa9978 --- /dev/null +++ b/.github/workflows/linter.yaml @@ -0,0 +1,24 @@ +name: Linter + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + linter: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: '1.22.0' + cache: false + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.53 + args: --timeout=30m --config=./.golangci.pipeline.yaml --issues-exit-code=0 diff --git a/.golangci.pipeline.yml b/.golangci.pipeline.yml new file mode 100644 index 00000000..2d6067e3 --- /dev/null +++ b/.golangci.pipeline.yml @@ -0,0 +1,42 @@ +run: + concurrency: 8 + timeout: 10m + issues-exit-code: 1 + tests: true + skip-files: + - \.pb\.go$ + - \.pb\.gw\.go$ + +output: + format: colored-line-number + print-issued-lines: true + print-linter-name: true + +linters-settings: + govet: + check-shadowing: true + dupl: + threshold: 100 + goconst: + min-len: 2 + min-occurrences: 3 + +linters: + disable-all: true + enable: + - errcheck + - goconst + - goimports + - govet + - ineffassign + - megacheck + - typecheck + - unused + +issues: + exclude-use-default: false + exclude: + - G104 + - exported func .* returns unexported type .*, which can be annoying to use + - should have a package comment + - don't use an underscore in package name diff --git a/auth_service/internal/auth/auth.go b/auth_service/internal/auth/auth.go index b1e24de0..c9503fdf 100644 --- a/auth_service/internal/auth/auth.go +++ b/auth_service/internal/auth/auth.go @@ -15,7 +15,7 @@ import ( "github.com/go-park-mail-ru/2024_2_GOATS/auth_service/internal/interceptors" auth "github.com/go-park-mail-ru/2024_2_GOATS/auth_service/pkg/auth_v1" "github.com/go-redis/redis/v8" - "github.com/grpc-ecosystem/go-grpc-prometheus" + grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rs/zerolog" "google.golang.org/grpc" @@ -58,7 +58,9 @@ func New(isTest bool) (*AuthApp, error) { go func() { http.Handle("/metrics", promhttp.Handler()) - http.ListenAndServe(":9081", nil) + if err := http.ListenAndServe(":9081", nil); err != nil { + logger.Error().Err(err).Msg("Metrics stopped") + } }() return &AuthApp{ diff --git a/auth_service/internal/auth/repository/repository_test.go b/auth_service/internal/auth/repository/repository_test.go index 1d94159d..e5179e9b 100644 --- a/auth_service/internal/auth/repository/repository_test.go +++ b/auth_service/internal/auth/repository/repository_test.go @@ -18,6 +18,7 @@ import ( ) var expirationTime = time.Now().Add(24 * time.Hour) +var closeRDBError = "cannot_close_redis_db" func TestAuthRepository_SetCookie(t *testing.T) { tests := []struct { @@ -63,7 +64,11 @@ func TestAuthRepository_SetCookie(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { rdb, mock := redismock.NewClientMock() - defer rdb.Close() + defer func() { + if err := rdb.Close(); err != nil { + t.Errorf("%s:%v", closeRDBError, err) + } + }() test.mockSetup(mock) repo := NewAuthRepository(rdb) @@ -110,7 +115,11 @@ func TestAuthRepository_DestroySession(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { rdb, mock := redismock.NewClientMock() - defer rdb.Close() + defer func() { + if err := rdb.Close(); err != nil { + t.Errorf("%s:%v", closeRDBError, err) + } + }() test.mockSetup(mock) repo := NewAuthRepository(rdb) @@ -168,7 +177,11 @@ func TestAuthRepository_GetSessionData(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { rdb, mock := redismock.NewClientMock() - defer rdb.Close() + defer func() { + if err := rdb.Close(); err != nil { + t.Errorf("%s:%v", closeRDBError, err) + } + }() test.mockSetup(mock) repo := NewAuthRepository(rdb) diff --git a/auth_service/internal/auth/service/cookie/cookie.go b/auth_service/internal/auth/service/cookie/cookie.go index 51f14462..e1e10478 100644 --- a/auth_service/internal/auth/service/cookie/cookie.go +++ b/auth_service/internal/auth/service/cookie/cookie.go @@ -7,8 +7,8 @@ import ( "fmt" "time" - "github.com/go-park-mail-ru/2024_2_GOATS/auth_service/internal/auth/service/dto" "github.com/go-park-mail-ru/2024_2_GOATS/auth_service/config" + "github.com/go-park-mail-ru/2024_2_GOATS/auth_service/internal/auth/service/dto" "github.com/rs/zerolog/log" ) diff --git a/cmd/main.go b/cmd/main.go index f045fd1b..ed370785 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,8 +1,9 @@ package main import ( - "github.com/go-park-mail-ru/2024_2_GOATS/internal/app" "log" + + "github.com/go-park-mail-ru/2024_2_GOATS/internal/app" ) func main() { diff --git a/go.mod b/go.mod index cf42e11c..422ce6ac 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/elastic/go-elasticsearch/v7 v7.17.10 github.com/go-redis/redis/v8 v8.11.5 github.com/go-redis/redismock/v8 v8.11.5 + github.com/golang-migrate/migrate v3.5.4+incompatible github.com/golang/mock v1.6.0 github.com/gorilla/mux v1.8.1 github.com/gorilla/sessions v1.3.0 @@ -19,9 +20,8 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/rs/zerolog v1.33.0 github.com/spf13/viper v1.19.0 - github.com/stretchr/testify v1.9.0 - go.uber.org/mock v0.5.0 - golang.org/x/crypto v0.27.0 + github.com/stretchr/testify v1.10.0 + golang.org/x/crypto v0.29.0 google.golang.org/grpc v1.68.0 google.golang.org/protobuf v1.35.2 ) @@ -37,10 +37,11 @@ require ( github.com/containerd/continuity v0.4.3 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.4.0+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/golang-migrate/migrate v3.5.4+incompatible // indirect github.com/gorilla/css v1.0.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect @@ -50,16 +51,19 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/gomega v1.34.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.13 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -68,12 +72,14 @@ require ( github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.29.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.18.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index e2424340..e5fe1d46 100644 --- a/go.sum +++ b/go.sum @@ -27,24 +27,36 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-redis/redismock/v8 v8.11.5 h1:RJFIiua58hrBrSpXhnGX3on79AU3S271H4ZhRI1wyVo= github.com/go-redis/redismock/v8 v8.11.5/go.mod h1:UaAU9dEe1C+eGr+FHV5prCWIt0hafyPWbGMEWE0UWdA= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-migrate/migrate v3.5.4+incompatible h1:R7OzwvCJTCgwapPCiX6DyBiu2czIUMDCB118gFTKTUA= github.com/golang-migrate/migrate v3.5.4+incompatible/go.mod h1:IsVUlFN5puWOmXrqjgGUfIRIbU7mr8oNBE2tyERd9Wk= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= @@ -108,6 +120,8 @@ github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwX github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -122,8 +136,9 @@ github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -132,8 +147,8 @@ github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstu github.com/opencontainers/runc v1.1.13/go.mod h1:R016aXacfp/gwQBYw2FDGa9m+n6atbLWrYY8hNMT/sA= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -147,8 +162,8 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -169,34 +184,34 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= -go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -206,8 +221,8 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -232,14 +247,14 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= 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.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -273,7 +288,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/internal/app/app.go b/internal/app/app.go index 4a025916..eb00e732 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -71,7 +71,11 @@ func (a *App) Run() { log.Fatalf("cant connect to grpc") } - defer aGrpcConn.Close() + defer func() { + if clErr := aGrpcConn.Close(); clErr != nil { + log.Fatal("cannot close authGrpcConnection") + } + }() uGrpcConn, err := grpc.NewClient( "user_app:8082", @@ -81,7 +85,11 @@ func (a *App) Run() { log.Fatalf("cant connect to grpc") } - defer uGrpcConn.Close() + defer func() { + if clErr := uGrpcConn.Close(); clErr != nil { + log.Fatal("cannot close userGrpcConnection") + } + }() mGrpcConn, err := grpc.NewClient( "movie_app:8083", @@ -91,7 +99,11 @@ func (a *App) Run() { log.Fatalf("cant connect to grpc") } - defer mGrpcConn.Close() + defer func() { + if clErr := mGrpcConn.Close(); clErr != nil { + log.Fatal("cannot close movieGrpcConnection") + } + }() pGrpcConn, err := grpc.NewClient( "payment_app:8084", @@ -101,7 +113,11 @@ func (a *App) Run() { log.Fatalf("cant connect to grpc") } - defer pGrpcConn.Close() + defer func() { + if clErr := pGrpcConn.Close(); clErr != nil { + log.Fatal("cannot close paymentGrpcConnection") + } + }() sessManager := client.NewAuthClient(auth.NewSessionRPCClient(aGrpcConn)) usrManager := client.NewUserClient(user.NewUserRPCClient(uGrpcConn)) diff --git a/internal/app/app_test.go b/internal/app/app_test.go index ffa3b4ff..9650a68d 100644 --- a/internal/app/app_test.go +++ b/internal/app/app_test.go @@ -2,38 +2,18 @@ package app import ( "context" - "fmt" "os" "testing" "time" "github.com/go-park-mail-ru/2024_2_GOATS/config" _ "github.com/lib/pq" - "github.com/ory/dockertest" - "github.com/ory/dockertest/docker" "github.com/stretchr/testify/require" ) func TestAppIntegration(t *testing.T) { ctx := testContext(t) - // pool, err := dockertest.NewPool("") - // require.NoError(t, err, "cannot create new pool") - - // pg, err := initPostgres(ctx, pool) - // require.NoError(t, err, "cannot init postgres") - - // defer func() { - // require.NoError(t, pool.Purge(pg), "failed to stop postgres container") - // }() - - // rdb, err := initRedis(ctx, pool) - // require.NoError(t, err, "cannot init redis") - - // defer func() { - // require.NoError(t, pool.Purge(rdb), "failed to stop redis container") - // }() - app, err := New(true) require.NoError(t, err, "cannot create app") @@ -46,13 +26,6 @@ func TestAppIntegration(t *testing.T) { }() time.Sleep(1 * time.Second) - // if err := app.Database.Ping(); err != nil { - // require.NoError(t, err, "failed to ping postgres from test") - // } - - // if err := app.Redis.Ping(ctx).Err(); err != nil { - // require.NoError(t, err, "failed to ping redis from test") - // } require.NoError(t, app.Server.Shutdown(ctx), "failed to shut down server") @@ -67,60 +40,3 @@ func testContext(t *testing.T) context.Context { return config.WrapContext(context.Background(), cfg) } - -func initPostgres(ctx context.Context, pool *dockertest.Pool) (*dockertest.Resource, error) { - pgCfg := config.FromContext(ctx).Databases.Postgres - opts := dockertest.RunOptions{ - Repository: "postgres", - Tag: "latest", - Env: []string{ - "POSTGRES_PASSWORD=" + pgCfg.Password, - "POSTGRES_USER=" + pgCfg.User, - "POSTGRES_DB=" + pgCfg.Name, - }, - ExposedPorts: []string{"5432/tcp"}, - PortBindings: map[docker.Port][]docker.PortBinding{ - "5432/tcp": { - {HostIP: "0.0.0.0", HostPort: fmt.Sprintf("%d/tcp", pgCfg.Port)}, - }, - }, - } - - resource, err := pool.RunWithOptions(&opts) - if err != nil { - return nil, fmt.Errorf("error while initing postgres: %w", err) - } - - err = resource.Expire(30) - if err != nil { - return nil, fmt.Errorf("auto expiration err: %w", err) - } - - return resource, nil -} - -func initRedis(ctx context.Context, pool *dockertest.Pool) (*dockertest.Resource, error) { - redisCfg := config.FromContext(ctx).Databases.Redis - opts := dockertest.RunOptions{ - Repository: "redis", - Tag: "latest", - ExposedPorts: []string{"6379/tcp"}, - PortBindings: map[docker.Port][]docker.PortBinding{ - "6379/tcp": { - {HostIP: "0.0.0.0", HostPort: fmt.Sprintf("%d/tcp", redisCfg.Port)}, - }, - }, - } - - resource, err := pool.RunWithOptions(&opts) - if err != nil { - return nil, fmt.Errorf("error while initing redis: %w", err) - } - - err = resource.Expire(30) - if err != nil { - return nil, fmt.Errorf("auto expiration err: %w", err) - } - - return resource, nil -} diff --git a/internal/app/movie/service/elastic_service_actor.go b/internal/app/movie/service/elastic_service_actor.go index 83b7210a..5a6f06ea 100644 --- a/internal/app/movie/service/elastic_service_actor.go +++ b/internal/app/movie/service/elastic_service_actor.go @@ -2,6 +2,7 @@ package service import ( "context" + "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models" ) diff --git a/internal/app/movie/service/elastic_service_movie.go b/internal/app/movie/service/elastic_service_movie.go index 73ae4267..30ab046a 100644 --- a/internal/app/movie/service/elastic_service_movie.go +++ b/internal/app/movie/service/elastic_service_movie.go @@ -2,6 +2,7 @@ package service import ( "context" + "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models" ) diff --git a/internal/app/movie/service/get_actor.go b/internal/app/movie/service/get_actor.go index 66d5762a..58b7d35a 100644 --- a/internal/app/movie/service/get_actor.go +++ b/internal/app/movie/service/get_actor.go @@ -3,6 +3,7 @@ package service import ( "context" "errors" + errVals "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/errors" "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models" ) diff --git a/internal/app/secur/csrf/handlers/csrf.go b/internal/app/secur/csrf/handlers/csrf.go index ec8a63a3..afa0c6be 100644 --- a/internal/app/secur/csrf/handlers/csrf.go +++ b/internal/app/secur/csrf/handlers/csrf.go @@ -1,10 +1,11 @@ package handlers import ( + "net/http" + token_gen "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/secur/csrf/token" "github.com/gorilla/sessions" "github.com/rs/zerolog/log" - "net/http" ) var store = sessions.NewCookieStore([]byte("secret-key")) diff --git a/internal/app/user/delivery/handler.go b/internal/app/user/delivery/handler.go index 8db2f4ab..748a4347 100644 --- a/internal/app/user/delivery/handler.go +++ b/internal/app/user/delivery/handler.go @@ -155,8 +155,8 @@ func (u *UserHandler) parseProfileRequest(r *http.Request, usrID int) (*api.Upda defer func() { if file != nil { - if err := file.Close(); err != nil { - logger.Error().Err(fmt.Errorf("cannot close file: %v", err)).Msg("close_file_error") + if clErr := file.Close(); clErr != nil { + logger.Error().Err(fmt.Errorf("cannot close file: %v", clErr)).Msg("close_file_error") } } }() diff --git a/internal/app/user/delivery/handler_test.go b/internal/app/user/delivery/handler_test.go index 233e7346..c2e9ded0 100644 --- a/internal/app/user/delivery/handler_test.go +++ b/internal/app/user/delivery/handler_test.go @@ -84,7 +84,12 @@ func TestUserHandler_UpdatePassword(t *testing.T) { handler.UpdatePassword(w, req) res := w.Result() - defer res.Body.Close() + + defer func() { + if err := res.Body.Close(); err != nil { + t.Errorf("cannot close updatePassword body") + } + }() assert.Equal(t, test.statusCode, w.Result().StatusCode) if test.resp == "" { @@ -166,10 +171,13 @@ func TestUserHandler_UpdateProfile(t *testing.T) { if test.fileData != nil { part, _ := writer.CreateFormFile("avatar", "avatar.png") - part.Write(test.fileData) + _, err := part.Write(test.fileData) + assert.NoError(t, err) } - writer.Close() + if err := writer.Close(); err != nil { + t.Errorf("cannot_close_writer: %v", err) + } req := httptest.NewRequest(http.MethodPost, "/users/1/update_profile", body) req.Header.Set("Content-Type", writer.FormDataContentType()) @@ -188,7 +196,12 @@ func TestUserHandler_UpdateProfile(t *testing.T) { handler.UpdateProfile(w, req) res := w.Result() - defer res.Body.Close() + + defer func() { + if err := res.Body.Close(); err != nil { + t.Errorf("cannot close updateProfile body") + } + }() assert.Equal(t, test.statusCode, res.StatusCode) if test.resp == "" { @@ -243,7 +256,12 @@ func TestUserHandler_SetFavorite(t *testing.T) { handler.SetFavorite(w, req) res := w.Result() - defer res.Body.Close() + + defer func() { + if err := res.Body.Close(); err != nil { + t.Errorf("cannot close setFavorite body") + } + }() assert.Equal(t, test.statusCode, w.Result().StatusCode) if test.resp == "" { @@ -298,7 +316,12 @@ func TestUserHandler_ResetFavorite(t *testing.T) { handler.ResetFavorite(w, req) res := w.Result() - defer res.Body.Close() + + defer func() { + if err := res.Body.Close(); err != nil { + t.Errorf("cannot close resetFavorite body") + } + }() assert.Equal(t, test.statusCode, w.Result().StatusCode) if test.resp == "" { @@ -355,7 +378,12 @@ func TestUserHandler_GetFavorites(t *testing.T) { handler.GetFavorites(w, req) res := w.Result() - defer res.Body.Close() + + defer func() { + if err := res.Body.Close(); err != nil { + t.Errorf("cannot close GetFavorites body") + } + }() assert.Equal(t, test.statusCode, w.Result().StatusCode) if test.resp == "" { diff --git a/internal/app/user/service/service.go b/internal/app/user/service/service.go index b483d4d2..196e5d65 100644 --- a/internal/app/user/service/service.go +++ b/internal/app/user/service/service.go @@ -7,12 +7,12 @@ import ( type UserService struct { userClient client.UserClientInterface - mvClient client.MovieClientInterface + mvClient client.MovieClientInterface } func NewUserService(usrClient client.UserClientInterface, mvClient client.MovieClientInterface) delivery.UserServiceInterface { return &UserService{ userClient: usrClient, - mvClient: mvClient, + mvClient: mvClient, } } diff --git a/internal/db/script_elastic/script.go b/internal/db/script_elastic/script.go index 1fd1a5d6..0f1db550 100644 --- a/internal/db/script_elastic/script.go +++ b/internal/db/script_elastic/script.go @@ -31,7 +31,7 @@ type Actor struct { } func delIndex(indexName string) { - url := fmt.Sprintf("http://localhost:9200/%s", indexName) + url := fmt.Sprintf("http://83.166.232.3:9200/%s", indexName) req, err := http.NewRequest("DELETE", url, bytes.NewBuffer([]byte(""))) if err != nil { log.Fatalf("Error creating request for index %s: %v", indexName, err) @@ -44,16 +44,25 @@ func delIndex(indexName string) { if err != nil { log.Fatalf("Error sending HTTP request to create index %s: %v", indexName, err) } - defer resp.Body.Close() + defer func() { + if clErr := resp.Body.Close(); clErr != nil { + fmt.Printf("cannot close delIndex body: %v", clErr) + } + }() body := make([]byte, 1024) - resp.Body.Read(body) + _, err = resp.Body.Read(body) + + if err != nil { + fmt.Printf("error deleting index: %v", err) + return + } fmt.Printf("Index %s creation status: %s\n", indexName, resp.Status) fmt.Printf("Response body: %s\n", body) } func createIndex(indexName, mapping string) { - url := fmt.Sprintf("http://localhost:9200/%s", indexName) + url := fmt.Sprintf("http://83.166.232.3:9200/%s", indexName) req, err := http.NewRequest("PUT", url, bytes.NewBuffer([]byte(mapping))) if err != nil { log.Fatalf("Error creating request for index %s: %v", indexName, err) @@ -66,10 +75,20 @@ func createIndex(indexName, mapping string) { if err != nil { log.Fatalf("Error sending HTTP request to create index %s: %v", indexName, err) } - defer resp.Body.Close() + defer func() { + if clErr := resp.Body.Close(); clErr != nil { + fmt.Printf("cannot close createIndex body: %v", clErr) + } + }() body := make([]byte, 1024) - resp.Body.Read(body) + _, err = resp.Body.Read(body) + + if err != nil { + fmt.Printf("error creating index: %v", err) + return + } + fmt.Printf("Index %s creation status: %s\n", indexName, resp.Status) fmt.Printf("Response body: %s\n", body) } @@ -80,15 +99,25 @@ func addMovie(id int, movie Movie) { log.Fatalf("Error marshaling movie_service data: %v", err) } - url := fmt.Sprintf("http://localhost:9200/movies/_doc/%d", id) + url := fmt.Sprintf("http://83.166.232.3:9200/movies/_doc/%d", id) resp, err := http.Post(url, "application/json", bytes.NewBuffer(data)) if err != nil { log.Fatalf("Error sending HTTP request: %v", err) } - defer resp.Body.Close() + + defer func() { + if clErr := resp.Body.Close(); clErr != nil { + fmt.Printf("cannot close addMovie body: %v", clErr) + } + }() body := make([]byte, 1024) - resp.Body.Read(body) + _, err = resp.Body.Read(body) + + if err != nil { + fmt.Println(fmt.Errorf("error adding movies: %w", err)) + return + } fmt.Printf("Movie with ID %d added with status: %s\n", id, resp.Status) fmt.Printf("Response body: %s\n", body) } @@ -99,15 +128,25 @@ func addActor(id int, actor Actor) { log.Fatalf("Error marshaling actor data: %v", err) } - url := fmt.Sprintf("http://localhost:9200/actors/_doc/%d", id) + url := fmt.Sprintf("http://83.166.232.3:9200/actors/_doc/%d", id) resp, err := http.Post(url, "application/json", bytes.NewBuffer(data)) if err != nil { log.Fatalf("Error sending HTTP request: %v", err) } - defer resp.Body.Close() + + defer func() { + if clErr := resp.Body.Close(); clErr != nil { + fmt.Printf("cannot close addActor body: %v", clErr) + } + }() body := make([]byte, 1024) - resp.Body.Read(body) + _, err = resp.Body.Read(body) + + if err != nil { + fmt.Println(fmt.Errorf("error adding actors: %w", err)) + return + } fmt.Printf("Actor with ID %d added with status: %s\n", id, resp.Status) fmt.Printf("Response body: %s\n", body) } @@ -141,10 +180,10 @@ func main() { "card_url": { "type": "text" }, "album_url": { "type": "text" }, "rating": { "type": "float" }, - "release_date": { - "type": "date", - "format": "yyyy-MM-dd'T'HH:mm:ss'Z'", - "ignore_malformed": true + "release_date": { + "type": "date", + "format": "yyyy-MM-dd'T'HH:mm:ss'Z'", + "ignore_malformed": true }, "movie_type": { "type": "keyword" }, "country": { "type": "text" } @@ -160,8 +199,8 @@ func main() { { Id: "1", Title: "Игра в кальмара", - CardURL: "/static/movies/squid-game/card.png", - AlbumURL: "/static/movies/squid-game/poster.png", + CardURL: "/static/movies_all/squid-game/card.webp", + AlbumURL: "/static/movies_all/squid-game/poster.webp", Rating: 7.6, MovieType: "film", Country: "Франция", @@ -169,8 +208,8 @@ func main() { { Id: "2", Title: "Бумажный дом", - CardURL: "/static/movies/paper_house/card.png", - AlbumURL: "/static/movies/paper_house/poster.png", + CardURL: "/static/movies_all/paper_house/card.webp", + AlbumURL: "/static/movies_all/paper_house/poster.webp", Rating: 8.2, MovieType: "film", Country: "Франция", @@ -178,8 +217,8 @@ func main() { { Id: "3", Title: "Кухня", - CardURL: "/static/movies/kitcnen/card.png", - AlbumURL: "/static/movies/kitcnen/poster.png", + CardURL: "/static/movies_all/kitcnen/card.webp", + AlbumURL: "/static/movies_all/kitcnen/poster.webp", Rating: 8.2, MovieType: "film", Country: "Франция", @@ -187,8 +226,8 @@ func main() { { Id: "4", Title: "1+1", - CardURL: "/static/movies/1+1/card.png", - AlbumURL: "/static/movies/1+1/poster.png", + CardURL: "/static/movies_all/1_plus_1/card.webp", + AlbumURL: "/static/movies_all/1_plus_1/poster.webp", Rating: 8.8, MovieType: "film", Country: "Франция", @@ -196,8 +235,8 @@ func main() { { Id: "5", Title: "Аватар", - CardURL: "/static/movies/avatar/card.png", - AlbumURL: "/static/movies/avatar/poster.png", + CardURL: "/static/movies_all/avatar/card.webp", + AlbumURL: "/static/movies_all/avatar/poster.webp", Rating: 8.0, MovieType: "film", Country: "США", @@ -205,8 +244,8 @@ func main() { { Id: "6", Title: "Иллюзия обмана", - CardURL: "/static/movies/how-you-see-me/card.png", - AlbumURL: "/static/movies/how-you-see-me/poster.png", + CardURL: "/static/movies_all/how-you-see-me/card.webp", + AlbumURL: "/static/movies_all/how-you-see-me/poster.webp", Rating: 7.7, MovieType: "film", Country: "США", @@ -214,8 +253,8 @@ func main() { { Id: "7", Title: "Бесславные ублюдки", - CardURL: "/static/movies/inglourious-basterds/card.png", - AlbumURL: "/static/movies/inglourious-basterds/poster.png", + CardURL: "/static/movies_all/inglourious-basterds/card.webp", + AlbumURL: "/static/movies_all/inglourious-basterds/poster.webp", Rating: 8.0, MovieType: "film", Country: "США", @@ -223,8 +262,8 @@ func main() { { Id: "8", Title: "Интерстеллар", - CardURL: "/static/movies/interstellar/card.png", - AlbumURL: "/static/movies/interstellar/poster.png", + CardURL: "/static/movies_all/interstellar/card.webp", + AlbumURL: "/static/movies_all/interstellar/poster.webp", Rating: 8.6, MovieType: "film", Country: "США", @@ -232,8 +271,8 @@ func main() { { Id: "9", Title: "Легенда №17", - CardURL: "/static/movies/legend17/card.png", - AlbumURL: "/static/movies/legend17/poster.png", + CardURL: "/static/movies_all/legend17/card.webp", + AlbumURL: "/static/movies_all/legend17/poster.webp", Rating: 8.0, MovieType: "film", Country: "США", @@ -241,8 +280,8 @@ func main() { { Id: "10", Title: "Человек, который изменил все", - CardURL: "/static/movies/moneyball/card.png", - AlbumURL: "/static/movies/moneyball/poster.png", + CardURL: "/static/movies_all/moneyball/card.webp", + AlbumURL: "/static/movies_all/moneyball/poster.webp", Rating: 7.7, MovieType: "film", Country: "США", @@ -250,8 +289,8 @@ func main() { { Id: "11", Title: "Остров проклятых", - CardURL: "/static/movies/shutter-island/card.png", - AlbumURL: "/static/movies/shutter-island/poster.png", + CardURL: "/static/movies_all/shutter-island/card.webp", + AlbumURL: "/static/movies_all/shutter-island/poster.webp", Rating: 8.5, MovieType: "film", Country: "США", @@ -259,8 +298,8 @@ func main() { { Id: "12", Title: "Такси 2", - CardURL: "/static/movies/taxi2/card.png", - AlbumURL: "/static/movies/taxi2/poster.png", + CardURL: "/static/movies_all/taxi2/card.webp", + AlbumURL: "/static/movies_all/taxi2/poster.webp", Rating: 7.7, MovieType: "film", Country: "США", @@ -268,8 +307,8 @@ func main() { { Id: "13", Title: "Множественные святые Ньюагка", - CardURL: "/static/movies/the-many-saints-of-newark/card.png", - AlbumURL: "/static/movies/the-many-saints-of-newark/poster.png", + CardURL: "/static/movies_all/the-many-saints-of-newark/card.webp", + AlbumURL: "/static/movies_all/the-many-saints-of-newark/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -277,8 +316,8 @@ func main() { { Id: "14", Title: "Перевозчик", - CardURL: "/static/movies/the-transporter/card.png", - AlbumURL: "/static/movies/the-transporter/poster.png", + CardURL: "/static/movies_all/the-transporter/card.webp", + AlbumURL: "/static/movies_all/the-transporter/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -286,8 +325,8 @@ func main() { { Id: "15", Title: "Трансформеры", - CardURL: "/static/movies/transformers/card.png", - AlbumURL: "/static/movies/transformers/poster.png", + CardURL: "/static/movies_all/transformers/card.webp", + AlbumURL: "/static/movies_all/transformers/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -295,8 +334,8 @@ func main() { { Id: "16", Title: "Волк с Уолл-Стрит", - CardURL: "/static/movies/wolf-of-wall-street/card.png", - AlbumURL: "/static/movies/wolf-of-wall-street/poster.png", + CardURL: "/static/movies_all/wolf-of-wall-street/card.webp", + AlbumURL: "/static/movies_all/wolf-of-wall-street/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -304,8 +343,8 @@ func main() { { Id: "17", Title: "Мстители", - CardURL: "/static/movies/avengers/card.png", - AlbumURL: "/static/movies/avengers/poster.png", + CardURL: "/static/movies_all/avengers/card.webp", + AlbumURL: "/static/movies_all/avengers/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -313,8 +352,8 @@ func main() { { Id: "18", Title: "Еще по одной", - CardURL: "/static/movies/drunk/card.png", - AlbumURL: "/static/movies/drunk/poster.png", + CardURL: "/static/movies_all/drunk/card.webp", + AlbumURL: "/static/movies_all/drunk/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -322,8 +361,8 @@ func main() { { Id: "19", Title: "Форд против Феррари", - CardURL: "/static/movies/ford-v-ferrari/card.png", - AlbumURL: "/static/movies/ford-v-ferrari/poster.png", + CardURL: "/static/movies_all/ford-v-ferrari/card.webp", + AlbumURL: "/static/movies_all/ford-v-ferrari/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -331,8 +370,8 @@ func main() { { Id: "20", Title: "Зеленая книга", - CardURL: "/static/movies/greenbook/card.png", - AlbumURL: "/static/movies/greenbook/poster.png", + CardURL: "/static/movies_all/greenbook/card.webp", + AlbumURL: "/static/movies_all/greenbook/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -340,8 +379,8 @@ func main() { { Id: "21", Title: "Однажды в Голливуде", - CardURL: "/static/movies/once-in-hollywood/card.png", - AlbumURL: "/static/movies/once-in-hollywood/poster.png", + CardURL: "/static/movies_all/once-in-hollywood/card.webp", + AlbumURL: "/static/movies_all/once-in-hollywood/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -349,8 +388,8 @@ func main() { { Id: "22", Title: "Ламборгини", - CardURL: "/static/movies/lamborgini/card.png", - AlbumURL: "/static/movies/lamborgini/poster.png", + CardURL: "/static/movies_all/lamborgini/card.webp", + AlbumURL: "/static/movies_all/lamborgini/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -358,8 +397,8 @@ func main() { { Id: "23", Title: "Легенда", - CardURL: "/static/movies/legend/card.png", - AlbumURL: "/static/movies/legend/poster.png", + CardURL: "/static/movies_all/legend/card.webp", + AlbumURL: "/static/movies_all/legend/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -367,8 +406,8 @@ func main() { { Id: "24", Title: "Пеле: Рождение легенды", - CardURL: "/static/movies/pele/card.png", - AlbumURL: "/static/movies/pele/poster.png", + CardURL: "/static/movies_all/pele/card.webp", + AlbumURL: "/static/movies_all/pele/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -376,8 +415,8 @@ func main() { { Id: "25", Title: "Стрельцов", - CardURL: "/static/movies/streltsov/card.png", - AlbumURL: "/static/movies/streltsov/poster.png", + CardURL: "/static/movies_all/streltsov/card.webp", + AlbumURL: "/static/movies_all/streltsov/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -385,8 +424,8 @@ func main() { { Id: "26", Title: "Гнев человеческий", - CardURL: "/static/movies/wrath-of-man/card.png", - AlbumURL: "/static/movies/wrath-of-man/poster.png", + CardURL: "/static/movies_all/wrath-of-man/card.webp", + AlbumURL: "/static/movies_all/wrath-of-man/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -394,8 +433,8 @@ func main() { { Id: "27", Title: "Брат 2", - CardURL: "/static/movies/brother2/card.png", - AlbumURL: "/static/movies/brother2/poster.png", + CardURL: "/static/movies_all/brother2/card.webp", + AlbumURL: "/static/movies_all/brother2/poster.webp", Rating: 5.9, MovieType: "film", Country: "США", @@ -410,8 +449,8 @@ func main() { { Id: "1", FullName: "Педро Гонсалес Алонсо", - PhotoURL: "/static/actors/alonso/small.png", - PhotoBigURL: "/static/actors/alonso/big.png", + PhotoURL: "/static/actors/alonso/small.webp", + PhotoBigURL: "/static/actors/alonso/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -419,8 +458,8 @@ func main() { { Id: "2", FullName: "Анн Ле Ни", - PhotoURL: "/static/actors/alonso/small.png", - PhotoBigURL: "/static/actors/ann-le-ni/big.png", + PhotoURL: "/static/actors/alonso/small.webp", + PhotoBigURL: "/static/actors/ann-le-ni/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -428,8 +467,8 @@ func main() { { Id: "3", FullName: "Франсуа Берлеан", - PhotoURL: "/static/actors/berleand/big.png", - PhotoBigURL: "/static/actors/berleand/big.png", + PhotoURL: "/static/actors/berleand/big.webp", + PhotoBigURL: "/static/actors/berleand/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -437,8 +476,8 @@ func main() { { Id: "4", FullName: "Сергей Бодров", - PhotoURL: "/static/actors/bodrov/big.png", - PhotoBigURL: "/static/actors/bodrov/big.png", + PhotoURL: "/static/actors/bodrov/big.webp", + PhotoBigURL: "/static/actors/bodrov/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -446,8 +485,8 @@ func main() { { Id: "5", FullName: "Марк Богатырёв", - PhotoURL: "/static/actors/bogatyrev/big.png", - PhotoBigURL: "/static/actors/bogatyrev/big.png", + PhotoURL: "/static/actors/bogatyrev/big.webp", + PhotoBigURL: "/static/actors/bogatyrev/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -455,8 +494,8 @@ func main() { { Id: "6", FullName: "Мария Бонневи", - PhotoURL: "/static/actors/bonnevie/big.png", - PhotoBigURL: "/static/actors/bonnevie/big.png", + PhotoURL: "/static/actors/bonnevie/big.webp", + PhotoBigURL: "/static/actors/bonnevie/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -464,8 +503,8 @@ func main() { { Id: "7", FullName: "Линда Эдна Карделлини", - PhotoURL: "/static/actors/cardellini/big.png", - PhotoBigURL: "/static/actors/cardellini/big.png", + PhotoURL: "/static/actors/cardellini/big.webp", + PhotoBigURL: "/static/actors/cardellini/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -474,8 +513,8 @@ func main() { { Id: "8", FullName: "Джессика Честейн", - PhotoURL: "/static/actors/alonso/small.png", - PhotoBigURL: "/static/actors/chastain/big.png", + PhotoURL: "/static/actors/alonso/small.webp", + PhotoBigURL: "/static/actors/chastain/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -483,8 +522,8 @@ func main() { { Id: "9", FullName: "Крис Эванс", - PhotoURL: "/static/actors/alonso/small.png", - PhotoBigURL: "/static/actors/chris-evans/big.png", + PhotoURL: "/static/actors/alonso/small.webp", + PhotoBigURL: "/static/actors/chris-evans/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -492,8 +531,8 @@ func main() { { Id: "10", FullName: "Кристиан Бэйл", - PhotoURL: "/static/actors/alonso/small.png", - PhotoBigURL: "/static/actors/christian-bale/big.png", + PhotoURL: "/static/actors/alonso/small.webp", + PhotoBigURL: "/static/actors/christian-bale/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -501,8 +540,8 @@ func main() { { Id: "11", FullName: "Урсула Корберо Дельгадо", - PhotoURL: "/static/actors/corbero/small.png", - PhotoBigURL: "/static/actors/corbero/big.png", + PhotoURL: "/static/actors/corbero/small.webp", + PhotoBigURL: "/static/actors/corbero/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -510,8 +549,8 @@ func main() { { Id: "12", FullName: "Марион Котийяр", - PhotoURL: "/static/actors/alonso/small.png", - PhotoBigURL: "/static/actors/cotillard/big.png", + PhotoURL: "/static/actors/alonso/small.webp", + PhotoBigURL: "/static/actors/cotillard/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -519,8 +558,8 @@ func main() { { Id: "13", FullName: "Леонардо ДиКаприо", - PhotoURL: "/static/actors/dicaprio/small.png", - PhotoBigURL: "/static/actors/dicaprio/big.png", + PhotoURL: "/static/actors/dicaprio/small.webp", + PhotoBigURL: "/static/actors/dicaprio/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -528,8 +567,8 @@ func main() { { Id: "14", FullName: "Фредерик Дифенталь", - PhotoURL: "/static/actors/diefenthal/small.png", - PhotoBigURL: "/static/actors/diefenthal/big.png", + PhotoURL: "/static/actors/diefenthal/small.webp", + PhotoBigURL: "/static/actors/diefenthal/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -537,8 +576,8 @@ func main() { { Id: "15", FullName: "Роберт Дауни-младший", - PhotoURL: "/static/actors/downey-jr/small.png", - PhotoBigURL: "/static/actors/downey-jr/big.png", + PhotoURL: "/static/actors/downey-jr/small.webp", + PhotoBigURL: "/static/actors/downey-jr/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -546,8 +585,8 @@ func main() { { Id: "16", FullName: "Кристофер Экклстон", - PhotoURL: "/static/actors/eccleston/small.png", - PhotoBigURL: "/static/actors/eccleston/big.png", + PhotoURL: "/static/actors/eccleston/small.webp", + PhotoBigURL: "/static/actors/eccleston/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -555,8 +594,8 @@ func main() { { Id: "17", FullName: "Джесси Айзенберг", - PhotoURL: "/static/actors/eisenberg/small.png", - PhotoBigURL: "/static/actors/eisenberg/big.png", + PhotoURL: "/static/actors/eisenberg/small.webp", + PhotoBigURL: "/static/actors/eisenberg/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -565,8 +604,8 @@ func main() { { Id: "18", FullName: "Махершала Али", - PhotoURL: "/static/actors/mahershala-ali/small.png", - PhotoBigURL: "/static/actors/mahershala-ali/big.png", + PhotoURL: "/static/actors/mahershala-ali/small.webp", + PhotoBigURL: "/static/actors/mahershala-ali/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -574,8 +613,8 @@ func main() { { Id: "19", FullName: "Владимир Меньшов", - PhotoURL: "/static/actors/menshov/small.png", - PhotoBigURL: "/static/actors/menshov/big.png", + PhotoURL: "/static/actors/menshov/small.webp", + PhotoBigURL: "/static/actors/menshov/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -583,8 +622,8 @@ func main() { { Id: "20", FullName: "Вуди Харрельсон", - PhotoURL: "/static/actors/harrelson/small.png", - PhotoBigURL: "/static/actors/harrelson/big.png", + PhotoURL: "/static/actors/harrelson/small.webp", + PhotoBigURL: "/static/actors/harrelson/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -592,8 +631,8 @@ func main() { { Id: "21", FullName: "Фрэнк Грилло", - PhotoURL: "/static/actors/grillo/small.png", - PhotoBigURL: "/static/actors/grillo/big.png", + PhotoURL: "/static/actors/grillo/small.webp", + PhotoBigURL: "/static/actors/grillo/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -601,8 +640,8 @@ func main() { { Id: "22", FullName: "Бен Кингсли", - PhotoURL: "/static/actors/kingsley/small.png", - PhotoBigURL: "/static/actors/kingsley/big.png", + PhotoURL: "/static/actors/kingsley/small.webp", + PhotoBigURL: "/static/actors/kingsley/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -610,8 +649,8 @@ func main() { { Id: "23", FullName: "Сами Насери", - PhotoURL: "/static/actors/samy-nacery/small.png", - PhotoBigURL: "/static/actors/samy-nacery/big.png", + PhotoURL: "/static/actors/samy-nacery/small.webp", + PhotoBigURL: "/static/actors/samy-nacery/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -619,8 +658,8 @@ func main() { { Id: "24", FullName: "Кристоф Вальц", - PhotoURL: "/static/actors/waltz/small.png", - PhotoBigURL: "/static/actors/waltz/big.png", + PhotoURL: "/static/actors/waltz/small.webp", + PhotoBigURL: "/static/actors/waltz/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -629,8 +668,8 @@ func main() { { Id: "25", FullName: "Сэм Уоррингтон", - PhotoURL: "/static/actors/sam-worthington/small.png", - PhotoBigURL: "/static/actors/sam-worthington/big.png", + PhotoURL: "/static/actors/sam-worthington/small.webp", + PhotoBigURL: "/static/actors/sam-worthington/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -638,8 +677,8 @@ func main() { { Id: "26", FullName: "Дмитрий Юрьевич Назаров", - PhotoURL: "/static/actors/nazarov/small.png", - PhotoBigURL: "/static/actors/nazarov/big.png", + PhotoURL: "/static/actors/nazarov/small.webp", + PhotoBigURL: "/static/actors/nazarov/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -647,8 +686,8 @@ func main() { { Id: "27", FullName: "Энн Хэтэуэй", - PhotoURL: "/static/actors/hathaway/small.png", - PhotoBigURL: "/static/actors/hathaway/big.png", + PhotoURL: "/static/actors/hathaway/small.webp", + PhotoBigURL: "/static/actors/hathaway/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -656,8 +695,8 @@ func main() { { Id: "28", FullName: "Меган Фокс", - PhotoURL: "/static/actors/fox/small.png", - PhotoBigURL: "/static/actors/fox/big.png", + PhotoURL: "/static/actors/fox/small.webp", + PhotoBigURL: "/static/actors/fox/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -665,8 +704,8 @@ func main() { { Id: "29", FullName: "Хайме Лоренте Лопес", - PhotoURL: "/static/actors/lorente/small.png", - PhotoBigURL: "/static/actors/lorente/big.png", + PhotoURL: "/static/actors/lorente/small.webp", + PhotoBigURL: "/static/actors/lorente/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -674,8 +713,8 @@ func main() { { Id: "30", FullName: "Данила Козловский", - PhotoURL: "/static/actors/kozlovsky/small.png", - PhotoBigURL: "/static/actors/kozlovsky/big.png", + PhotoURL: "/static/actors/kozlovsky/small.webp", + PhotoBigURL: "/static/actors/kozlovsky/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -683,8 +722,8 @@ func main() { { Id: "31", FullName: "Вигго Мортенсен", - PhotoURL: "/static/actors/mortensen/small.png", - PhotoBigURL: "/static/actors/mortensen/big.png", + PhotoURL: "/static/actors/mortensen/small.webp", + PhotoBigURL: "/static/actors/mortensen/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -693,8 +732,8 @@ func main() { { Id: "32", FullName: "Стася Милославская", - PhotoURL: "/static/actors/miloslavskaya/small.png", - PhotoBigURL: "/static/actors/miloslavskaya/big.png", + PhotoURL: "/static/actors/miloslavskaya/small.webp", + PhotoBigURL: "/static/actors/miloslavskaya/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -702,8 +741,8 @@ func main() { { Id: "33", FullName: "Сергей Васильевич Маковецкий", - PhotoURL: "/static/actors/makovetskiy/small.png", - PhotoBigURL: "/static/actors/makovetskiy/big.png", + PhotoURL: "/static/actors/makovetskiy/small.webp", + PhotoBigURL: "/static/actors/makovetskiy/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -711,8 +750,8 @@ func main() { { Id: "34", FullName: "Омар Си", - PhotoURL: "/static/actors/omar-sy/small.png", - PhotoBigURL: "/static/actors/omar-sy/big.png", + PhotoURL: "/static/actors/omar-sy/small.webp", + PhotoBigURL: "/static/actors/omar-sy/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -720,8 +759,8 @@ func main() { { Id: "35", FullName: "Сеу Жоржи", - PhotoURL: "/static/actors/jorge/small.png", - PhotoBigURL: "/static/actors/jorge/big.png", + PhotoURL: "/static/actors/jorge/small.webp", + PhotoBigURL: "/static/actors/jorge/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -729,8 +768,8 @@ func main() { { Id: "36", FullName: "Александр Яценко", - PhotoURL: "/static/actors/yatsenko/small.png", - PhotoBigURL: "/static/actors/yatsenko/big.png", + PhotoURL: "/static/actors/yatsenko/small.webp", + PhotoBigURL: "/static/actors/yatsenko/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -738,8 +777,8 @@ func main() { { Id: "37", FullName: "Мэттью Макконахи", - PhotoURL: "/static/actors/mcconaughey/small.png", - PhotoBigURL: "/static/actors/mcconaughey/big.png", + PhotoURL: "/static/actors/mcconaughey/small.webp", + PhotoBigURL: "/static/actors/mcconaughey/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -747,8 +786,8 @@ func main() { { Id: "38", FullName: "Айла Фишер", - PhotoURL: "/static/actors/isla-fisher/small.png", - PhotoBigURL: "/static/actors/isla-fisher/big.png", + PhotoURL: "/static/actors/isla-fisher/small.webp", + PhotoBigURL: "/static/actors/isla-fisher/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -756,8 +795,8 @@ func main() { { Id: "39", FullName: "Том Харди", - PhotoURL: "/static/actors/tom-hardy/small.png", - PhotoBigURL: "/static/actors/tom-hardy/big.png", + PhotoURL: "/static/actors/tom-hardy/small.webp", + PhotoBigURL: "/static/actors/tom-hardy/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -765,8 +804,8 @@ func main() { { Id: "40", FullName: "Джейсон Стэйтем", - PhotoURL: "/static/actors/jason-statham/small.png", - PhotoBigURL: "/static/actors/jason-statham/big.png", + PhotoURL: "/static/actors/jason-statham/small.webp", + PhotoBigURL: "/static/actors/jason-statham/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -775,8 +814,8 @@ func main() { { Id: "41", FullName: "Мишель Родригес", - PhotoURL: "/static/actors/michelle-rodriguez/small.png", - PhotoBigURL: "/static/actors/michelle-rodriguez/big.png", + PhotoURL: "/static/actors/michelle-rodriguez/small.webp", + PhotoBigURL: "/static/actors/michelle-rodriguez/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -784,8 +823,8 @@ func main() { { Id: "42", FullName: "Шая ЛаБаф", - PhotoURL: "/static/actors/labeouf/small.png", - PhotoBigURL: "/static/actors/labeouf/big.png", + PhotoURL: "/static/actors/labeouf/small.webp", + PhotoBigURL: "/static/actors/labeouf/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -793,8 +832,8 @@ func main() { { Id: "43", FullName: "Джона Хилл", - PhotoURL: "/static/actors/jonah-hill/small.png", - PhotoBigURL: "/static/actors/jonah-hill/big.png", + PhotoURL: "/static/actors/jonah-hill/small.webp", + PhotoBigURL: "/static/actors/jonah-hill/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -802,8 +841,8 @@ func main() { { Id: "44", FullName: "Марго Робби", - PhotoURL: "/static/actors/margo-robbie/small.png", - PhotoBigURL: "/static/actors/margo-robbie/big.png", + PhotoURL: "/static/actors/margo-robbie/small.webp", + PhotoBigURL: "/static/actors/margo-robbie/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -811,8 +850,8 @@ func main() { { Id: "45", FullName: "Мадс Миккельсен", - PhotoURL: "/static/actors/mikkelsen/small.png", - PhotoBigURL: "/static/actors/mikkelsen/big.png", + PhotoURL: "/static/actors/mikkelsen/small.webp", + PhotoBigURL: "/static/actors/mikkelsen/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -820,8 +859,8 @@ func main() { { Id: "46", FullName: "Дмитрий Геннадьевич Нагиев", - PhotoURL: "/static/actors/nagiev/small.png", - PhotoBigURL: "/static/actors/nagiev/big.png", + PhotoURL: "/static/actors/nagiev/small.webp", + PhotoBigURL: "/static/actors/nagiev/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -829,8 +868,8 @@ func main() { { Id: "47", FullName: "Елена Подкаминская", - PhotoURL: "/static/actors/podkaminskaya/small.png", - PhotoBigURL: "/static/actors/podkaminskaya/big.png", + PhotoURL: "/static/actors/podkaminskaya/small.webp", + PhotoBigURL: "/static/actors/podkaminskaya/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -838,8 +877,8 @@ func main() { { Id: "48", FullName: "Зои Салдана", - PhotoURL: "/static/actors/saldana/small.png", - PhotoBigURL: "/static/actors/saldana/big.png", + PhotoURL: "/static/actors/saldana/small.webp", + PhotoBigURL: "/static/actors/saldana/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -847,8 +886,8 @@ func main() { { Id: "49", FullName: "Олег Меньшиков", - PhotoURL: "/static/actors/menshikov/small.png", - PhotoBigURL: "/static/actors/menshikov/big.png", + PhotoURL: "/static/actors/menshikov/small.webp", + PhotoBigURL: "/static/actors/menshikov/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -856,8 +895,8 @@ func main() { { Id: "50", FullName: "Шу Ци", - PhotoURL: "/static/actors/shu/small.png", - PhotoBigURL: "/static/actors/shu/big.png", + PhotoURL: "/static/actors/shu/small.webp", + PhotoBigURL: "/static/actors/shu/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -865,8 +904,8 @@ func main() { { Id: "51", FullName: "Альваро Антонио Гарсия", - PhotoURL: "/static/actors/morte/small.png", - PhotoBigURL: "/static/actors/morte/big.png", + PhotoURL: "/static/actors/morte/small.webp", + PhotoBigURL: "/static/actors/morte/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -874,8 +913,8 @@ func main() { { Id: "52", FullName: "Эмили Браунинг", - PhotoURL: "/static/actors/emily-browning/small.png", - PhotoBigURL: "/static/actors/emily-browning/big.png", + PhotoURL: "/static/actors/emily-browning/small.webp", + PhotoBigURL: "/static/actors/emily-browning/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -883,8 +922,8 @@ func main() { { Id: "53", FullName: "Александр Наумов", - PhotoURL: "/static/actors/naumov/small.png", - PhotoBigURL: "/static/actors/naumov/big.png", + PhotoURL: "/static/actors/naumov/small.webp", + PhotoBigURL: "/static/actors/naumov/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -892,8 +931,8 @@ func main() { { Id: "54", FullName: "Мэтт Дэймон", - PhotoURL: "/static/actors/matt-damon/small.png", - PhotoBigURL: "/static/actors/matt-damon/big.png", + PhotoURL: "/static/actors/matt-damon/small.webp", + PhotoBigURL: "/static/actors/matt-damon/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -901,8 +940,8 @@ func main() { { Id: "55", FullName: "Александр Петров", - PhotoURL: "/static/actors/petrov/small.png", - PhotoBigURL: "/static/actors/petrov/big.png", + PhotoURL: "/static/actors/petrov/small.webp", + PhotoBigURL: "/static/actors/petrov/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -910,8 +949,8 @@ func main() { { Id: "56", FullName: "Холт МакКэллани", - PhotoURL: "/static/actors/mccallany/small.png", - PhotoBigURL: "/static/actors/mccallany/big.png", + PhotoURL: "/static/actors/mccallany/small.webp", + PhotoBigURL: "/static/actors/mccallany/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -919,8 +958,8 @@ func main() { { Id: "57", FullName: "Виктор Сухоруков", - PhotoURL: "/static/actors/suhorukov/small.png", - PhotoBigURL: "/static/actors/suhorukov/big.png", + PhotoURL: "/static/actors/suhorukov/small.webp", + PhotoBigURL: "/static/actors/suhorukov/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -928,8 +967,8 @@ func main() { { Id: "58", FullName: "Ли Джонджэ", - PhotoURL: "/static/actors/jae/small.png", - PhotoBigURL: "/static/actors/jae/big.png", + PhotoURL: "/static/actors/jae/small.webp", + PhotoBigURL: "/static/actors/jae/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -937,8 +976,8 @@ func main() { { Id: "59", FullName: "Уильям Брэдли Питт", - PhotoURL: "/static/actors/pitt/small.png", - PhotoBigURL: "/static/actors/pitt/big.png", + PhotoURL: "/static/actors/pitt/small.webp", + PhotoBigURL: "/static/actors/pitt/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -946,8 +985,8 @@ func main() { { Id: "60", FullName: "Пак Хэ-Су", - PhotoURL: "/static/actors/soo/small.png", - PhotoBigURL: "/static/actors/soo/big.png", + PhotoURL: "/static/actors/soo/small.webp", + PhotoBigURL: "/static/actors/soo/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -955,8 +994,8 @@ func main() { { Id: "61", FullName: "Чон Хо-ён", - PhotoURL: "/static/actors/yeon/small.png", - PhotoBigURL: "/static/actors/yeon/big.png", + PhotoURL: "/static/actors/yeon/small.webp", + PhotoBigURL: "/static/actors/yeon/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -964,8 +1003,8 @@ func main() { { Id: "62", FullName: "Диана Крюгер", - PhotoURL: "/static/actors/kruger/small.png", - PhotoBigURL: "/static/actors/kruger/big.png", + PhotoURL: "/static/actors/kruger/small.webp", + PhotoBigURL: "/static/actors/kruger/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -973,8 +1012,8 @@ func main() { { Id: "63", FullName: "Мигель Анхель Гарсия", - PhotoURL: "/static/actors/herran/small.png", - PhotoBigURL: "/static/actors/herran/big.png", + PhotoURL: "/static/actors/herran/small.webp", + PhotoBigURL: "/static/actors/herran/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -982,8 +1021,8 @@ func main() { { Id: "64", FullName: "Виктор Викторович Хориняк", - PhotoURL: "/static/actors/horinyak/small.png", - PhotoBigURL: "/static/actors/horinyak/big.png", + PhotoURL: "/static/actors/horinyak/small.webp", + PhotoBigURL: "/static/actors/horinyak/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -991,8 +1030,8 @@ func main() { { Id: "65", FullName: "Алессандро Нивола", - PhotoURL: "/static/actors/nivola/small.png", - PhotoBigURL: "/static/actors/nivola/big.png", + PhotoURL: "/static/actors/nivola/small.webp", + PhotoBigURL: "/static/actors/nivola/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -1001,8 +1040,8 @@ func main() { { Id: "66", FullName: "Тайриз Дарнелл Гибсон", - PhotoURL: "/static/actors/gibson/small.png", - PhotoBigURL: "/static/actors/gibson/big.png", + PhotoURL: "/static/actors/gibson/small.webp", + PhotoBigURL: "/static/actors/gibson/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -1010,8 +1049,8 @@ func main() { { Id: "67", FullName: "Марк Руффало", - PhotoURL: "/static/actors/mark-ruffalo/small.png", - PhotoBigURL: "/static/actors/mark-ruffalo/big.png", + PhotoURL: "/static/actors/mark-ruffalo/small.webp", + PhotoBigURL: "/static/actors/mark-ruffalo/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -1019,8 +1058,8 @@ func main() { { Id: "68", FullName: "Ольга Николаевна Кузьмина", - PhotoURL: "/static/actors/kuzmina/small.png", - PhotoBigURL: "/static/actors/kuzmina/big.png", + PhotoURL: "/static/actors/kuzmina/small.webp", + PhotoBigURL: "/static/actors/kuzmina/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", @@ -1029,8 +1068,8 @@ func main() { { Id: "69", FullName: "Франсуа Клюзе", - PhotoURL: "/static/actors/kluzet/small.png", - PhotoBigURL: "/static/actors/kluzet/big.png", + PhotoURL: "/static/actors/kluzet/small.webp", + PhotoBigURL: "/static/actors/kluzet/big.webp", Biography: "Педро Гонсалес Алонсо родился 21 июня 1971 года в Виго, Испания. Изучал журналистику и актерское мастерство в Высшей королевской школе драматического искусства в Мадриде...", Country: "Испания", BirthDate: "1971-06-21", diff --git a/internal/middleware/log.go b/internal/middleware/log.go index 9e671821..f0efaea0 100644 --- a/internal/middleware/log.go +++ b/internal/middleware/log.go @@ -12,7 +12,7 @@ type ctxKey int const ( requestIDKey ctxKey = iota - symbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" + symbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" ) func WithLogger(next http.Handler) http.Handler { diff --git a/movie_service/internal/movie/movie.go b/movie_service/internal/movie/movie.go index b4cccd87..17204b07 100644 --- a/movie_service/internal/movie/movie.go +++ b/movie_service/internal/movie/movie.go @@ -19,7 +19,7 @@ import ( "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/repository" "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/service" movie "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/pkg/movie_v1" - "github.com/grpc-ecosystem/go-grpc-prometheus" + grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" _ "github.com/lib/pq" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rs/zerolog" @@ -78,7 +78,9 @@ func New(isTest bool) (*MovieApp, error) { go func() { http.Handle("/metrics", promhttp.Handler()) - http.ListenAndServe(":9083", nil) + if err := http.ListenAndServe(":9083", nil); err != nil { + logger.Error().Err(err).Msg("Metrics stopped") + } }() return &MovieApp{ diff --git a/movie_service/internal/movie/repository/actordb/db.go b/movie_service/internal/movie/repository/actordb/db.go index 790abfe9..006e15e5 100644 --- a/movie_service/internal/movie/repository/actordb/db.go +++ b/movie_service/internal/movie/repository/actordb/db.go @@ -40,8 +40,8 @@ func FindByID(ctx context.Context, actorID int, db *sql.DB) (*dto.RepoActor, err } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -59,7 +59,7 @@ func FindByID(ctx context.Context, actorID int, db *sql.DB) (*dto.RepoActor, err ) if err != nil { - metricsutils.SaveErrorMetric(start, "get_actor_by_id", "actors") + metricsutils.SaveErrorMetric("get_actor_by_id", "actors") errMsg := fmt.Errorf("postgres: error while selecting actor info: %w", err) logger.Error().Err(errMsg).Msg("pg_error") diff --git a/movie_service/internal/movie/repository/elasticsearch_search_actor.go b/movie_service/internal/movie/repository/elasticsearch_search_actor.go index f024c0d7..aea54ee6 100644 --- a/movie_service/internal/movie/repository/elasticsearch_search_actor.go +++ b/movie_service/internal/movie/repository/elasticsearch_search_actor.go @@ -5,13 +5,17 @@ import ( "context" "encoding/json" "fmt" - "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/models" "io" "log" "strconv" + + zl "github.com/rs/zerolog/log" + + "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/models" ) func (r *MovieRepo) SearchActors(ctx context.Context, query string) ([]models.ActorInfo, error) { + logger := zl.Ctx(ctx) searchQuery := map[string]interface{}{ "query": map[string]interface{}{ "match_phrase_prefix": map[string]interface{}{ @@ -34,7 +38,12 @@ func (r *MovieRepo) SearchActors(ctx context.Context, query string) ([]models.Ac if err != nil { return nil, fmt.Errorf("error executing search query: %w", err) } - defer res.Body.Close() + + defer func() { + if err := res.Body.Close(); err != nil { + logger.Error().Err(err).Msg("cannot close searchActors body") + } + }() bodyBytes, _ := io.ReadAll(res.Body) log.Println("ElasticSearch Response:", string(bodyBytes)) diff --git a/movie_service/internal/movie/repository/elasticsearch_search_movie.go b/movie_service/internal/movie/repository/elasticsearch_search_movie.go index 771eecf7..f3d0e792 100644 --- a/movie_service/internal/movie/repository/elasticsearch_search_movie.go +++ b/movie_service/internal/movie/repository/elasticsearch_search_movie.go @@ -5,13 +5,16 @@ import ( "context" "encoding/json" "fmt" - "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/models" "io" "log" "strconv" + + "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/models" + zl "github.com/rs/zerolog/log" ) func (r *MovieRepo) SearchMovies(ctx context.Context, query string) ([]models.MovieInfo, error) { + logger := zl.Ctx(ctx) searchQuery := map[string]interface{}{ "query": map[string]interface{}{ "match_phrase_prefix": map[string]interface{}{ @@ -34,7 +37,12 @@ func (r *MovieRepo) SearchMovies(ctx context.Context, query string) ([]models.Mo if err != nil { return nil, fmt.Errorf("error executing search query: %w", err) } - defer res.Body.Close() + + defer func() { + if clErr := res.Body.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("cannot close searchMovies body") + } + }() bodyBytes, _ := io.ReadAll(res.Body) log.Println("ElasticSearch Response:", string(bodyBytes)) @@ -57,8 +65,8 @@ func (r *MovieRepo) SearchMovies(ctx context.Context, query string) ([]models.Mo } `json:"hits"` } - if err := json.NewDecoder(bytes.NewReader(bodyBytes)).Decode(&esResponse); err != nil { - return nil, fmt.Errorf("error decoding search response: %w", err) + if decErr := json.NewDecoder(bytes.NewReader(bodyBytes)).Decode(&esResponse); decErr != nil { + return nil, fmt.Errorf("error decoding search response: %w", decErr) } log.Println("Hits:", esResponse.Hits.Hits) diff --git a/movie_service/internal/movie/repository/get_movie_actors.go b/movie_service/internal/movie/repository/get_movie_actors.go index 33e1ac1a..4e895ef8 100644 --- a/movie_service/internal/movie/repository/get_movie_actors.go +++ b/movie_service/internal/movie/repository/get_movie_actors.go @@ -19,8 +19,8 @@ func (r *MovieRepo) GetMovieActors(ctx context.Context, mvID int) ([]*models.Act } defer func() { - if err := rows.Close(); err != nil { - logger.Error().Err(err).Msg("cannot close rows while taking movie_service actors") + if clErr := rows.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("cannot close rows while taking movie_service actors") } }() diff --git a/movie_service/internal/movie/repository/metrics_utils/metrics_utils.go b/movie_service/internal/movie/repository/metrics_utils/metrics_utils.go index 753fbf4f..eb83e50e 100644 --- a/movie_service/internal/movie/repository/metrics_utils/metrics_utils.go +++ b/movie_service/internal/movie/repository/metrics_utils/metrics_utils.go @@ -11,6 +11,6 @@ func SaveSuccessMetric(start time.Time, operation string, table string) { metrics.DBQueryDuration.WithLabelValues(operation, table).Observe(duration) } -func SaveErrorMetric(start time.Time, operation string, table string) { +func SaveErrorMetric(operation string, table string) { metrics.DBQueryErrors.WithLabelValues(operation, table).Inc() } diff --git a/movie_service/internal/movie/repository/movie_collectiondb/db.go b/movie_service/internal/movie/repository/movie_collectiondb/db.go index 07228755..9fcd33a7 100644 --- a/movie_service/internal/movie/repository/movie_collectiondb/db.go +++ b/movie_service/internal/movie/repository/movie_collectiondb/db.go @@ -45,15 +45,15 @@ func GetMovieCollections(ctx context.Context, db *sql.DB) (*sql.Rows, error) { } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx) if err != nil { - metricsutils.SaveErrorMetric(start, "get_movie_collections", "collections") + metricsutils.SaveErrorMetric("get_movie_collections", "collections") errMsg := fmt.Errorf("postgres: error while selecting movie_collections: %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -76,14 +76,14 @@ func GetGenreCollections(ctx context.Context, db *sql.DB) (*sql.Rows, error) { } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx) if err != nil { - metricsutils.SaveErrorMetric(start, "get_genres", "genres") + metricsutils.SaveErrorMetric("get_genres", "genres") errMsg := fmt.Errorf("postgres: error while selecting genre_collections: %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -106,14 +106,14 @@ func GetMovieByGenre(ctx context.Context, genre string, db *sql.DB) (*sql.Rows, } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx, genre) if err != nil { - metricsutils.SaveErrorMetric(start, "get_movie_by_genre", "movies") + metricsutils.SaveErrorMetric("get_movie_by_genre", "movies") errMsg := fmt.Errorf("postgres: error while selecting movies by genre: %w", err) logger.Error().Err(errMsg).Msg("pg_error") diff --git a/movie_service/internal/movie/repository/moviedb/db.go b/movie_service/internal/movie/repository/moviedb/db.go index a88c626e..a96e4e5f 100644 --- a/movie_service/internal/movie/repository/moviedb/db.go +++ b/movie_service/internal/movie/repository/moviedb/db.go @@ -92,15 +92,15 @@ func FindByID(ctx context.Context, mvID int, db *sql.DB) (*sql.Rows, error) { } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx, mvID) if err != nil { - metricsutils.SaveErrorMetric(start, "get_movie_by_id", "movies") + metricsutils.SaveErrorMetric("get_movie_by_id", "movies") errMsg := fmt.Errorf("postgres: error while selecting movie_service info: %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -123,15 +123,15 @@ func GetMovieActors(ctx context.Context, mvID int, db *sql.DB) (*sql.Rows, error } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx, mvID) if err != nil { - metricsutils.SaveErrorMetric(start, "get_movie_actors", "actors") + metricsutils.SaveErrorMetric("get_movie_actors", "actors") errMsg := fmt.Errorf("postgres: error while selecting movie_service actors info: %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -154,15 +154,15 @@ func FindByActorID(ctx context.Context, actorID int, db *sql.DB) (*sql.Rows, err } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx, actorID) if err != nil { - metricsutils.SaveErrorMetric(start, "find_by_actor_id", "movies") + metricsutils.SaveErrorMetric("find_by_actor_id", "movies") errMsg := fmt.Errorf("postgres: error while selecting actor's movies: %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -183,15 +183,15 @@ func GetMoviesByIDs(ctx context.Context, mvIDs []uint64, db *sql.DB) (*sql.Rows, } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx, pq.Array(mvIDs)) if err != nil { - metricsutils.SaveErrorMetric(start, "get_movie_by_ids", "movies") + metricsutils.SaveErrorMetric("get_movie_by_ids", "movies") errMsg := fmt.Errorf("postgres: error while selecting favorite movies: %w", err) logger.Error().Err(errMsg).Msg("pg_error") diff --git a/movie_service/internal/movie/repository/repository_test.go b/movie_service/internal/movie/repository/repository_test.go index a58a5cb4..c9c733a6 100644 --- a/movie_service/internal/movie/repository/repository_test.go +++ b/movie_service/internal/movie/repository/repository_test.go @@ -12,10 +12,17 @@ import ( "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/models" ) +var closeDBError = "error_close_db" + func TestGetActor_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() r := NewMovieRepository(db, nil) @@ -92,7 +99,11 @@ func TestGetActor_Success(t *testing.T) { func TestGetActor_FindByIDError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() r := NewMovieRepository(db, nil) @@ -124,7 +135,11 @@ func TestGetActor_FindByIDError(t *testing.T) { func TestGetActor_FindByActorIDError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() r := NewMovieRepository(db, nil) @@ -175,7 +190,11 @@ func TestGetActor_FindByActorIDError(t *testing.T) { func TestGetCollection_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() collID := 1 expectedCollections := []models.Collection{{ @@ -251,7 +270,11 @@ func TestGetCollection_Success(t *testing.T) { func TestGetCollection_ObtainError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() mock.ExpectPrepare(` SELECT @@ -284,7 +307,11 @@ func TestGetCollection_ObtainError(t *testing.T) { func TestGetMovie_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() movieID := 1 expectedMovie := &models.MovieInfo{ @@ -343,31 +370,31 @@ func TestGetMovie_Success(t *testing.T) { `). ExpectQuery(). WithArgs(movieID).RowsWillBeClosed().WillReturnRows(sqlmock.NewRows( - []string{ - "id", - "title", - "short_description", - "long_description", - "card_url", - "album_url", - "rating", - "release_date", - "video_url", - "movie_type", - "title_url", - "directors_name", - "directors_surname", - "country_title", - "episode_id", - "episode_title", - "episode_description", - "season_number", - "episode_number", - "episode_release_date", - "episode_rating", - "episode_preview_url", - "episode_video_url", - }). + []string{ + "id", + "title", + "short_description", + "long_description", + "card_url", + "album_url", + "rating", + "release_date", + "video_url", + "movie_type", + "title_url", + "directors_name", + "directors_surname", + "country_title", + "episode_id", + "episode_title", + "episode_description", + "season_number", + "episode_number", + "episode_release_date", + "episode_rating", + "episode_preview_url", + "episode_video_url", + }). AddRow( 1, "test movie_service", @@ -408,7 +435,11 @@ func TestGetMovie_Success(t *testing.T) { func TestGetMovie_FindByIDError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() movieID := 1 @@ -457,7 +488,11 @@ func TestGetMovie_FindByIDError(t *testing.T) { func TestGetMovieActors_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() movieID := 1 expectedActors := []*models.ActorInfo{{ @@ -503,7 +538,11 @@ func TestGetMovieActors_Success(t *testing.T) { func TestGetMovieActors_DbError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + t.Errorf("%s:%v", closeDBError, err) + } + }() movieID := 1 diff --git a/movie_service/internal/movie/repository/staff/db.go b/movie_service/internal/movie/repository/staff/db.go index 820812d3..c8fc5c40 100644 --- a/movie_service/internal/movie/repository/staff/db.go +++ b/movie_service/internal/movie/repository/staff/db.go @@ -30,8 +30,8 @@ func FindById(ctx context.Context, staffId int, post string, db *sql.DB) *sql.Ro } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() diff --git a/movie_service/internal/movie/service/service_test.go b/movie_service/internal/movie/service/service_test.go index 1363cfbc..a66a1523 100644 --- a/movie_service/internal/movie/service/service_test.go +++ b/movie_service/internal/movie/service/service_test.go @@ -7,8 +7,8 @@ import ( "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/models" servMock "github.com/go-park-mail-ru/2024_2_GOATS/movie_service/internal/movie/service/mocks" - "github.com/stretchr/testify/assert" "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" ) func TestService_GetCollection(t *testing.T) { diff --git a/payment_service/internal/payment/payment.go b/payment_service/internal/payment/payment.go index 3ce7c9d5..3e69f22d 100644 --- a/payment_service/internal/payment/payment.go +++ b/payment_service/internal/payment/payment.go @@ -17,7 +17,7 @@ import ( "github.com/go-park-mail-ru/2024_2_GOATS/payment_service/internal/payment/repository" "github.com/go-park-mail-ru/2024_2_GOATS/payment_service/internal/payment/service" payment "github.com/go-park-mail-ru/2024_2_GOATS/payment_service/pkg/payment_v1" - "github.com/grpc-ecosystem/go-grpc-prometheus" + grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" _ "github.com/lib/pq" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rs/zerolog" @@ -65,7 +65,9 @@ func New(isTest bool) (*PaymentApp, error) { go func() { http.Handle("/metrics", promhttp.Handler()) - http.ListenAndServe(":9082", nil) + if err := http.ListenAndServe(":9084", nil); err != nil { + logger.Error().Err(err).Msg("Metrics stopped") + } }() return &PaymentApp{ diff --git a/payment_service/internal/payment/repository/metrics_utils/metrics_utils.go b/payment_service/internal/payment/repository/metrics_utils/metrics_utils.go index ef205e14..28512047 100644 --- a/payment_service/internal/payment/repository/metrics_utils/metrics_utils.go +++ b/payment_service/internal/payment/repository/metrics_utils/metrics_utils.go @@ -11,6 +11,6 @@ func SaveSuccessMetric(start time.Time, operation string, table string) { metrics.DBQueryDuration.WithLabelValues(operation, table).Observe(duration) } -func SaveErrorMetric(start time.Time, operation string, table string) { +func SaveErrorMetric(operation string, table string) { metrics.DBQueryErrors.WithLabelValues(operation, table).Inc() } diff --git a/payment_service/internal/payment/repository/paymentdb/db.go b/payment_service/internal/payment/repository/paymentdb/db.go index 0ac1da14..d8da895c 100644 --- a/payment_service/internal/payment/repository/paymentdb/db.go +++ b/payment_service/internal/payment/repository/paymentdb/db.go @@ -32,8 +32,8 @@ func Create(ctx context.Context, paymentData *dto.RepoPaymentData, db *sql.DB) ( } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -43,7 +43,7 @@ func Create(ctx context.Context, paymentData *dto.RepoPaymentData, db *sql.DB) ( ).Scan(&pID) if err != nil { - metricsutils.SaveErrorMetric(start, "create_payment", "payments") + metricsutils.SaveErrorMetric("create_payment", "payments") errMsg := fmt.Errorf("postgres: error while creating payment - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -66,8 +66,8 @@ func MarkPaid(ctx context.Context, pID uint64, db *sql.DB) error { } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -77,7 +77,7 @@ func MarkPaid(ctx context.Context, pID uint64, db *sql.DB) error { ) if err != nil { - metricsutils.SaveErrorMetric(start, "mark_paid_payment", "payments") + metricsutils.SaveErrorMetric("mark_paid_payment", "payments") errMsg := fmt.Errorf("postgres: error while marking payment as paid - %w", err) logger.Error().Err(errMsg).Msg("pg_error") diff --git a/user_service/internal/user/repository/favoritedb/db.go b/user_service/internal/user/repository/favoritedb/db.go index 363a4801..9a55c81a 100644 --- a/user_service/internal/user/repository/favoritedb/db.go +++ b/user_service/internal/user/repository/favoritedb/db.go @@ -43,8 +43,8 @@ func Create(ctx context.Context, favReq *dto.RepoFavorite, db *sql.DB) error { } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -54,7 +54,7 @@ func Create(ctx context.Context, favReq *dto.RepoFavorite, db *sql.DB) error { ).Err() if err != nil { - metricsutils.SaveErrorMetric(start, "create_favorite", "favorites") + metricsutils.SaveErrorMetric("create_favorite", "favorites") errMsg := fmt.Errorf("postgres: error while creating favorite - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -77,8 +77,8 @@ func Destroy(ctx context.Context, favReq *dto.RepoFavorite, db *sql.DB) error { } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -88,7 +88,7 @@ func Destroy(ctx context.Context, favReq *dto.RepoFavorite, db *sql.DB) error { ).Err() if err != nil { - metricsutils.SaveErrorMetric(start, "destroy_favorite", "favorites") + metricsutils.SaveErrorMetric("destroy_favorite", "favorites") errMsg := fmt.Errorf("postgres: error while destroying favorite - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -111,14 +111,14 @@ func FindByUserID(ctx context.Context, userID uint64, db *sql.DB) (*sql.Rows, er } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx, userID) if err != nil { - metricsutils.SaveErrorMetric(start, "find_user_favorites", "favorites") + metricsutils.SaveErrorMetric("find_user_favorites", "favorites") errMsg := fmt.Errorf("postgres: error while scanning favorites by user_id - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -141,19 +141,23 @@ func Check(ctx context.Context, favData *dto.RepoFavorite, db *sql.DB) (bool, er } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() rows, err := stmt.QueryContext(ctx, favData.UserID, favData.MovieID) if err != nil { - metricsutils.SaveErrorMetric(start, "check_favorite_existence", "favorites") + metricsutils.SaveErrorMetric("check_favorite_existence", "favorites") errMsg := fmt.Errorf("postgres: failed to check favorite existence: %w", err) logger.Error().Err(errMsg).Msg("database query error") return false, errMsg } - defer rows.Close() + defer func() { + if clErr := rows.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("cannot close rows") + } + }() if rows.Next() { logger.Info().Msgf("postgres: favorite pair for user %d and movie_service %d found", favData.UserID, favData.MovieID) diff --git a/user_service/internal/user/repository/metrics_utils/metrics_utils.go b/user_service/internal/user/repository/metrics_utils/metrics_utils.go index 44735683..64307d95 100644 --- a/user_service/internal/user/repository/metrics_utils/metrics_utils.go +++ b/user_service/internal/user/repository/metrics_utils/metrics_utils.go @@ -11,6 +11,6 @@ func SaveSuccessMetric(start time.Time, operation string, table string) { metrics.DBQueryDuration.WithLabelValues(operation, table).Observe(duration) } -func SaveErrorMetric(start time.Time, operation string, table string) { +func SaveErrorMetric(operation string, table string) { metrics.DBQueryErrors.WithLabelValues(operation, table).Inc() } diff --git a/user_service/internal/user/repository/repository_test.go b/user_service/internal/user/repository/repository_test.go index 5a0f1377..59905b14 100644 --- a/user_service/internal/user/repository/repository_test.go +++ b/user_service/internal/user/repository/repository_test.go @@ -14,17 +14,23 @@ import ( "github.com/go-park-mail-ru/2024_2_GOATS/user_service/internal/user/repository/password" ) +var closeDBError = "error_close_db" +var usrEmail = "test@mail.ru" +var usrUsername = "mr tester" +var pass = "test_password" + func TestCreateUser_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) usrID := 1 - usrEmail := "test@mail.ru" - usrUsername := "mr tester" - pass := "test_password" usrPassword, err := password.HashAndSalt(context.Background(), pass) assert.NoError(t, err) @@ -59,14 +65,14 @@ func TestCreateUser_Success(t *testing.T) { func TestCreateUser_DbError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) - usrEmail := "test@mail.ru" - usrUsername := "mr tester" - pass := "test_password" - regData := &dto.RepoCreateData{ Email: usrEmail, Username: usrUsername, @@ -88,12 +94,15 @@ func TestCreateUser_DbError(t *testing.T) { func TestUpdatePassword_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) usrID := 1 - pass := "test_password" mock.ExpectPrepare(`UPDATE users SET password_hash = \$1, updated_at = \$2 WHERE id = \$3`). ExpectExec(). @@ -109,12 +118,15 @@ func TestUpdatePassword_Success(t *testing.T) { func TestUpdatePassword_DbError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) usrID := 1 - pass := "test_password" mock.ExpectPrepare(`UPDATE users SET password_hash = \$1, updated_at = \$2 WHERE id = \$3`). ExpectExec(). @@ -130,13 +142,15 @@ func TestUpdatePassword_DbError(t *testing.T) { func TestUserByEmail_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) usrID := 1 - usrEmail := "test@mail.ru" - usrUsername := "mr tester" passHash, err := password.HashAndSalt(context.Background(), "test_password") assert.NoError(t, err) @@ -158,12 +172,14 @@ func TestUserByEmail_Success(t *testing.T) { func TestUserByEmail_NotFound(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) - usrEmail := "test@mail.ru" - mock.ExpectPrepare(`SELECT id, email, username, password_hash FROM users WHERE email = \$1`). ExpectQuery(). WithArgs(usrEmail).WillReturnError(sql.ErrNoRows) @@ -178,13 +194,15 @@ func TestUserByEmail_NotFound(t *testing.T) { func TestUserByID_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) usrID := 1 - usrEmail := "test@mail.ru" - usrUsername := "mr tester" passHash, err := password.HashAndSalt(context.Background(), "test_password") assert.NoError(t, err) @@ -210,7 +228,11 @@ func TestUserByID_Success(t *testing.T) { func TestUserByID_NotFound(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) @@ -230,7 +252,11 @@ func TestUserByID_NotFound(t *testing.T) { func TestUpdateProfileData_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) profileData := &dto.RepoUser{ @@ -254,7 +280,11 @@ func TestUpdateProfileData_Success(t *testing.T) { func TestUpdateProfileData_DbError(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) profileData := &dto.RepoUser{ @@ -279,7 +309,11 @@ func TestUpdateProfileData_DbError(t *testing.T) { func TestCheckFavorite_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) favData := &dto.RepoFavorite{ @@ -303,7 +337,11 @@ func TestCheckFavorite_Success(t *testing.T) { func TestCheckFavorite_FalseSuccess(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) favData := &dto.RepoFavorite{ @@ -327,7 +365,11 @@ func TestCheckFavorite_FalseSuccess(t *testing.T) { func TestCheckFavorite_Error(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) favData := &dto.RepoFavorite{ @@ -350,7 +392,11 @@ func TestCheckFavorite_Error(t *testing.T) { func TestGetFavorites_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) expectedFavs := []uint64{1, 2} @@ -372,7 +418,11 @@ func TestGetFavorites_Success(t *testing.T) { func TestGetFavorites_Error(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) usrId := 1 @@ -392,7 +442,11 @@ func TestGetFavorites_Error(t *testing.T) { func TestSetFavorite_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) favData := &dto.RepoFavorite{ @@ -414,7 +468,11 @@ func TestSetFavorite_Success(t *testing.T) { func TestSetFavorite_Error(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) favData := &dto.RepoFavorite{ @@ -436,7 +494,11 @@ func TestSetFavorite_Error(t *testing.T) { func TestResetFavorite_Success(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) favData := &dto.RepoFavorite{ @@ -458,7 +520,11 @@ func TestResetFavorite_Success(t *testing.T) { func TestResetFavorite_Error(t *testing.T) { db, mock, err := sqlmock.New() assert.NoError(t, err) - defer db.Close() + defer func() { + if clErr := db.Close(); clErr != nil { + t.Errorf("%s:%v", closeDBError, clErr) + } + }() r := NewUserRepository(db) favData := &dto.RepoFavorite{ diff --git a/user_service/internal/user/repository/reset_favorite.go b/user_service/internal/user/repository/reset_favorite.go index fe089e22..28b9c6c1 100644 --- a/user_service/internal/user/repository/reset_favorite.go +++ b/user_service/internal/user/repository/reset_favorite.go @@ -4,9 +4,9 @@ import ( "context" "fmt" + "github.com/go-park-mail-ru/2024_2_GOATS/user_service/internal/errors" "github.com/go-park-mail-ru/2024_2_GOATS/user_service/internal/user/repository/dto" "github.com/go-park-mail-ru/2024_2_GOATS/user_service/internal/user/repository/favoritedb" - "github.com/go-park-mail-ru/2024_2_GOATS/user_service/internal/errors" ) func (r *UserRepo) ResetFavorite(ctx context.Context, favData *dto.RepoFavorite) error { diff --git a/user_service/internal/user/repository/subscriptiondb/db.go b/user_service/internal/user/repository/subscriptiondb/db.go index 91b5c547..d4cd0ae8 100644 --- a/user_service/internal/user/repository/subscriptiondb/db.go +++ b/user_service/internal/user/repository/subscriptiondb/db.go @@ -40,8 +40,8 @@ func CreateSubscription(ctx context.Context, subData *dto.RepoCreateSubscription } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -51,7 +51,7 @@ func CreateSubscription(ctx context.Context, subData *dto.RepoCreateSubscription ).Scan(&subID) if err != nil { - metricsutils.SaveErrorMetric(start, "create_subscription", "subscriptions") + metricsutils.SaveErrorMetric("create_subscription", "subscriptions") errMsg := fmt.Errorf("postgres: error while creating subscription - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -74,15 +74,15 @@ func UpdateSubscription(ctx context.Context, subID uint64, db *sql.DB) error { } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() _, err = stmt.ExecContext(ctx, ActiveStatus, time.Now().AddDate(0, 1, 0), subID) if err != nil { - metricsutils.SaveErrorMetric(start, "update_subscription_status", "subscriptions") + metricsutils.SaveErrorMetric("update_subscription_status", "subscriptions") errMsg := fmt.Errorf("postgres: error while updating subscription status - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -106,8 +106,8 @@ func FindByUserID(ctx context.Context, usrID uint64, db *sql.DB) (*dto.RepoSubsc } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -120,7 +120,7 @@ func FindByUserID(ctx context.Context, usrID uint64, db *sql.DB) (*dto.RepoSubsc if err != nil { if !errors.Is(err, sql.ErrNoRows) { - metricsutils.SaveErrorMetric(start, "get_actor_by_id", "actors") + metricsutils.SaveErrorMetric("get_actor_by_id", "actors") errMsg := fmt.Errorf("postgres: error while selecting actor info: %w", err) logger.Error().Err(errMsg).Msg("pg_error") diff --git a/user_service/internal/user/repository/userdb/db.go b/user_service/internal/user/repository/userdb/db.go index 4da4ead8..0e5657ec 100644 --- a/user_service/internal/user/repository/userdb/db.go +++ b/user_service/internal/user/repository/userdb/db.go @@ -40,8 +40,8 @@ func Create(ctx context.Context, registerData dto.RepoCreateData, db *sql.DB) (* } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -51,7 +51,7 @@ func Create(ctx context.Context, registerData dto.RepoCreateData, db *sql.DB) (* ).Scan(&usr.ID, &usr.Email) if err != nil { - metricsutils.SaveErrorMetric(start, "create_user", "users") + metricsutils.SaveErrorMetric("create_user", "users") errMsg := fmt.Errorf("postgres: error while creating user - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -75,15 +75,15 @@ func FindByEmail(ctx context.Context, email string, db *sql.DB) (*dto.RepoUser, } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() err = stmt.QueryRowContext(ctx, email).Scan(&usr.ID, &usr.Email, &usr.Username, &usr.Password) if err != nil { - metricsutils.SaveErrorMetric(start, "find_user_by_email", "users") + metricsutils.SaveErrorMetric("find_user_by_email", "users") errMsg := fmt.Errorf("postgres: error while scanning user by email - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -107,8 +107,8 @@ func FindByID(ctx context.Context, userID uint64, db *sql.DB) (*dto.RepoUser, er } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() @@ -121,7 +121,7 @@ func FindByID(ctx context.Context, userID uint64, db *sql.DB) (*dto.RepoUser, er ) if err != nil { - metricsutils.SaveErrorMetric(start, "find_user_by_id", "users") + metricsutils.SaveErrorMetric("find_user_by_id", "users") errMsg := fmt.Errorf("postgres: error while scanning user by id - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -144,15 +144,15 @@ func UpdatePassword(ctx context.Context, userID uint64, pass string, db *sql.DB) } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() _, err = stmt.ExecContext(ctx, pass, time.Now(), userID) if err != nil { - metricsutils.SaveErrorMetric(start, "update_password", "users") + metricsutils.SaveErrorMetric("update_password", "users") errMsg := fmt.Errorf("postgres: error while updating user password - %w", err) logger.Error().Err(errMsg).Msg("pg_error") @@ -208,14 +208,14 @@ func UpdateProfile(ctx context.Context, usrData *dto.RepoUser, db *sql.DB) error } defer func() { - if err := stmt.Close(); err != nil { - logger.Error().Err(err).Msg("failed_to_close_statement") + if clErr := stmt.Close(); clErr != nil { + logger.Error().Err(clErr).Msg("failed_to_close_statement") } }() _, err = stmt.ExecContext(ctx, args...) if err != nil { - metricsutils.SaveErrorMetric(start, "update_profile", "users") + metricsutils.SaveErrorMetric("update_profile", "users") errMsg := fmt.Errorf("postgres: error while updating user profile - %w", err) logger.Error().Err(errMsg).Msg("pg_error") diff --git a/user_service/internal/user/user.go b/user_service/internal/user/user.go index ee4ee579..abef19f3 100644 --- a/user_service/internal/user/user.go +++ b/user_service/internal/user/user.go @@ -17,7 +17,7 @@ import ( "github.com/go-park-mail-ru/2024_2_GOATS/user_service/internal/user/repository" "github.com/go-park-mail-ru/2024_2_GOATS/user_service/internal/user/service" user "github.com/go-park-mail-ru/2024_2_GOATS/user_service/pkg/user_v1" - "github.com/grpc-ecosystem/go-grpc-prometheus" + grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" _ "github.com/lib/pq" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rs/zerolog" @@ -65,7 +65,9 @@ func New(isTest bool) (*UserApp, error) { go func() { http.Handle("/metrics", promhttp.Handler()) - http.ListenAndServe(":9082", nil) + if err := http.ListenAndServe(":9082", nil); err != nil { + logger.Error().Err(err).Msg("Metrics stopped") + } }() return &UserApp{