Kaynağa Gözat

Change package name

Dima 1 yıl önce
ebeveyn
işleme
a9d831bbc4

+ 2 - 2
cmd/app/main.go

@@ -3,8 +3,8 @@ package main
 import (
 	"log"
 
-	"github.com/dmitriygnatenko/internal/fiber"
-	sp "github.com/dmitriygnatenko/internal/service_provider"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/fiber"
+	sp "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/service_provider"
 	_ "github.com/lib/pq"
 )
 

+ 19 - 20
go.mod

@@ -1,8 +1,9 @@
-module github.com/dmitriygnatenko
+module git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2
 
 go 1.18
 
 require (
+	github.com/Masterminds/squirrel v1.5.3
 	github.com/brianvoe/gofakeit/v6 v6.19.0
 	github.com/go-playground/locales v0.14.0
 	github.com/go-playground/universal-translator v0.18.0
@@ -11,47 +12,45 @@ require (
 	github.com/gofiber/jwt/v3 v3.3.6
 	github.com/gofiber/template v1.7.1
 	github.com/gojuno/minimock/v3 v3.0.10
+	github.com/golang-jwt/jwt/v4 v4.4.3
 	github.com/lib/pq v1.10.7
-	github.com/spf13/viper v1.10.0
-	github.com/stretchr/testify v1.7.0
+	github.com/spf13/viper v1.15.0
+	github.com/stretchr/testify v1.8.1
+	golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e
 )
 
 require (
-	github.com/Masterminds/squirrel v1.5.3 // indirect
 	github.com/andybalholm/brotli v1.0.4 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
-	github.com/fsnotify/fsnotify v1.5.1 // indirect
-	github.com/golang-jwt/jwt/v4 v4.4.3 // indirect
+	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/google/uuid v1.3.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
-	github.com/klauspost/compress v1.15.9 // indirect
+	github.com/klauspost/compress v1.15.12 // indirect
 	github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
 	github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
 	github.com/leodido/go-urn v1.2.1 // indirect
-	github.com/magiconair/properties v1.8.5 // indirect
+	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.17 // indirect
 	github.com/mattn/go-runewidth v0.0.14 // indirect
-	github.com/mitchellh/mapstructure v1.4.3 // indirect
-	github.com/pelletier/go-toml v1.9.4 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.6 // indirect
 	github.com/philhofer/fwd v1.1.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
-	github.com/rivo/uniseg v0.2.0 // indirect
+	github.com/rivo/uniseg v0.4.2 // indirect
 	github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 // indirect
 	github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d // indirect
-	github.com/spf13/afero v1.6.0 // indirect
-	github.com/spf13/cast v1.4.1 // indirect
+	github.com/spf13/afero v1.9.3 // indirect
+	github.com/spf13/cast v1.5.0 // indirect
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
-	github.com/subosito/gotenv v1.2.0 // indirect
+	github.com/subosito/gotenv v1.4.2 // indirect
 	github.com/tinylib/msgp v1.1.6 // indirect
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/valyala/fasthttp v1.44.0 // indirect
 	github.com/valyala/tcplisten v1.0.0 // indirect
-	golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
-	golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2 // indirect
-	golang.org/x/text v0.3.7 // indirect
-	gopkg.in/ini.v1 v1.66.2 // indirect
-	gopkg.in/yaml.v2 v2.4.0 // indirect
-	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
+	golang.org/x/sys v0.3.0 // indirect
+	golang.org/x/text v0.5.0 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
 )

+ 55 - 18
go.sum

@@ -3,6 +3,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
 cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
 cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
 cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
@@ -15,6 +16,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY
 cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
 cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
 cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
 cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
 cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
 cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
@@ -45,7 +47,10 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
 cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+git.dmitriygnatenko.ru/dima/homethings v0.0.0-20230210150300-7ce544042cb5 h1:1739BZCRE6hT5XnKz8lSaKrdtwqpmn/ZVGzVAui3ALs=
+git.dmitriygnatenko.ru/dima/homethings v0.0.0-20230210150300-7ce544042cb5/go.mod h1:qxXrmhSuBUJfRukHn2TYE06Rc0adwf7diNfcQUFnUg0=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno=
@@ -120,8 +125,10 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=
-github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
+github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -200,6 +207,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -214,6 +222,7 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf
 github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
@@ -227,6 +236,7 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
 github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
+github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
 github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
@@ -275,8 +285,9 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
 github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
+github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
+github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
@@ -298,8 +309,9 @@ github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ic
 github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
 github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
-github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
 github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
@@ -328,8 +340,9 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk
 github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
 github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
@@ -340,8 +353,9 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
 github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
 github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
+github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
 github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
 github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
@@ -349,6 +363,7 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
+github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
@@ -365,8 +380,9 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8=
+github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
@@ -384,28 +400,37 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
-github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
+github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk=
+github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
 github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
+github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
 github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.10.0 h1:mXH0UwHS4D2HwWZa75im4xIQynLfblmWV7qcWpfv0yk=
 github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
+github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU=
+github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
+github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
 github.com/tinylib/msgp v1.1.6 h1:i+SbKraHhnrf9M5MYmvQhFnbLhAXSDWF8WWsuyRdocw=
 github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw=
 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
@@ -447,10 +472,13 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
 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.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
 golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
+golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -523,6 +551,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
 golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
@@ -606,6 +635,7 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -613,6 +643,7 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -632,8 +663,9 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2 h1:wM1k/lXfpc5HdkJJyW9GELpd8ERGdnh8sMGL6Gzq3Ho=
-golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -644,8 +676,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
+golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -699,6 +732,7 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f
 golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
@@ -784,7 +818,9 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D
 google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
@@ -861,19 +897,20 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
 gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/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.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 11 - 11
internal/fiber/fiber.go

@@ -4,12 +4,11 @@ import (
 	"html/template"
 	"log"
 	"strconv"
-	"strings"
 	"time"
 
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/services/handler"
-	adminHandler "github.com/dmitriygnatenko/internal/services/handler/admin"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/handler"
+	adminHandler "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/handler/admin"
 	"github.com/gofiber/fiber/v2"
 	"github.com/gofiber/fiber/v2/middleware/basicauth"
 	"github.com/gofiber/fiber/v2/middleware/cors"
@@ -38,8 +37,8 @@ func Init(sp interfaces.ServiceProvider) (*fiber.App, error) {
 	// Configure recover middleware
 	fiberApp.Use(recover.New())
 
-	// Configure JWT middleware
-	fiberApp.Use(jwt.New(getJWTConfig(sp)))
+	// Configure JWT auth
+	jwtAuth := jwt.New(getJWTConfig(sp))
 
 	// Configure Basic auth
 	basicAuth := basicauth.New(basicauth.Config{
@@ -57,8 +56,9 @@ func Init(sp interfaces.ServiceProvider) (*fiber.App, error) {
 	fiberApp.Get("/article/:article", handler.ArticleHandler(sp))
 
 	// Protected handlers
-	admin := fiberApp.Group("/admin", basicAuth)
+	admin := fiberApp.Group("/admin", jwtAuth)
 	admin.Get("/", adminHandler.ArticleHandler(sp))
+	admin.Get("/login", adminHandler.LoginHandler(sp))
 	admin.All("/article/add", adminHandler.AddArticleHandler(sp))
 	admin.All("/article/edit/:id<int>", adminHandler.EditArticleHandler(sp))
 	admin.All("/article/delete/:id<int>", adminHandler.DeleteArticleHandler(sp))
@@ -84,7 +84,7 @@ func getJWTConfig(sp interfaces.ServiceProvider) jwt.Config {
 	return jwt.Config{
 		SigningKey: []byte(sp.GetEnvService().GetJWTSecretKey()),
 		ErrorHandler: func(fctx *fiber.Ctx, err error) error {
-			return fiber.NewError(fiber.StatusForbidden, err.Error())
+			return fctx.Redirect("/admin/login")
 		},
 		Filter: func(fctx *fiber.Ctx) bool {
 			method := fctx.Method()
@@ -95,11 +95,11 @@ func getJWTConfig(sp interfaces.ServiceProvider) jwt.Config {
 				return true
 			}
 
-			if strings.HasPrefix(path, "/api/") && path != "/api/v1/auth/login" {
-				return false
+			if path == "/admin/login" {
+				return true
 			}
 
-			return true
+			return false
 		},
 	}
 }

+ 3 - 13
internal/helpers/datetime.go

@@ -3,25 +3,15 @@ package helpers
 import "time"
 
 const (
-	dateTimeFormat = "2006-01-02 15:04:05"
-	yearFormat     = "2006"
-	monthFormat    = "01"
-	dateFormat     = "02"
-	dayFormat      = "2"
+	yearFormat  = "2006"
+	monthFormat = "01"
+	dayFormat   = "2"
 )
 
-func ParseDateTime(dateTime string) (time.Time, error) {
-	return time.Parse(dateTimeFormat, dateTime)
-}
-
 func FormatDateStr(date time.Time) string {
 	return date.Format(dayFormat) + " " + getMonthStr(date.Format(monthFormat)) + " " + date.Format(yearFormat)
 }
 
-func FormatDateForm(date time.Time) string {
-	return date.Format(yearFormat) + "-" + date.Format(monthFormat) + "-" + date.Format(dateFormat)
-}
-
 func getMonthStr(month string) string {
 	switch month {
 	case "01":

+ 14 - 0
internal/interfaces/auth.go

@@ -0,0 +1,14 @@
+package interfaces
+
+import (
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
+	"github.com/gofiber/fiber/v2"
+	"github.com/golang-jwt/jwt/v4"
+)
+
+type Auth interface {
+	GeneratePasswordHash(password string) (string, error)
+	IsCorrectPassword(password string, hash string) bool
+	GenerateToken(user models.User) (string, error)
+	GetClaims(fctx *fiber.Ctx) jwt.MapClaims
+}

+ 1 - 1
internal/interfaces/repository.go

@@ -3,7 +3,7 @@ package interfaces
 import (
 	"context"
 
-	"github.com/dmitriygnatenko/internal/models"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 )
 
 type ArticleRepository interface {

+ 3 - 3
internal/mapper/article.go

@@ -3,9 +3,9 @@ package mapper
 import (
 	"database/sql"
 
-	"github.com/dmitriygnatenko/internal/dto"
-	"github.com/dmitriygnatenko/internal/helpers"
-	"github.com/dmitriygnatenko/internal/models"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/dto"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helpers"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 )
 
 func ConvertArticleModelsToDTO(m []models.Article) []dto.ArticleDTO {

+ 2 - 2
internal/mapper/tag.go

@@ -1,8 +1,8 @@
 package mapper
 
 import (
-	"github.com/dmitriygnatenko/internal/dto"
-	"github.com/dmitriygnatenko/internal/models"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/dto"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 )
 
 func ConvertTagModelsToDTO(m []models.Tag) []dto.TagDTO {

+ 3 - 3
internal/repositories/article.go

@@ -2,15 +2,15 @@ package repositories
 
 //go:generate mkdir -p mocks
 //go:generate rm -rf ./mocks/*_minimock.go
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.ArticleRepository -o ./mocks/ -s "_minimock.go"
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.ArticleRepository -o ./mocks/ -s "_minimock.go"
 
 import (
 	"context"
 	"database/sql"
 
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 	sq "github.com/Masterminds/squirrel"
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/models"
 )
 
 const articleTableName = "article"

+ 2 - 2
internal/repositories/article_tag.go

@@ -2,14 +2,14 @@ package repositories
 
 //go:generate mkdir -p mocks
 //go:generate rm -rf ./mocks/*_minimock.go
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.ArticleTagRepository -o ./mocks/ -s "_minimock.go"
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.ArticleTagRepository -o ./mocks/ -s "_minimock.go"
 
 import (
 	"context"
 	"database/sql"
 
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
 	sq "github.com/Masterminds/squirrel"
-	"github.com/dmitriygnatenko/internal/interfaces"
 )
 
 const articleTagTableName = "article_tag"

+ 2 - 2
internal/repositories/mocks/article_repository_minimock.go

@@ -2,7 +2,7 @@ package mocks
 
 // Code generated by http://github.com/gojuno/minimock (dev). DO NOT EDIT.
 
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.ArticleRepository -o ./mocks/article_repository_minimock.go -n ArticleRepositoryMock
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.ArticleRepository -o ./mocks/article_repository_minimock.go -n ArticleRepositoryMock
 
 import (
 	"context"
@@ -10,7 +10,7 @@ import (
 	mm_atomic "sync/atomic"
 	mm_time "time"
 
-	"github.com/dmitriygnatenko/internal/models"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 	"github.com/gojuno/minimock/v3"
 )
 

+ 1 - 1
internal/repositories/mocks/article_tag_repository_minimock.go

@@ -2,7 +2,7 @@ package mocks
 
 // Code generated by http://github.com/gojuno/minimock (dev). DO NOT EDIT.
 
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.ArticleTagRepository -o ./mocks/article_tag_repository_minimock.go -n ArticleTagRepositoryMock
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.ArticleTagRepository -o ./mocks/article_tag_repository_minimock.go -n ArticleTagRepositoryMock
 
 import (
 	"context"

+ 2 - 2
internal/repositories/mocks/tag_repository_minimock.go

@@ -2,7 +2,7 @@ package mocks
 
 // Code generated by http://github.com/gojuno/minimock (dev). DO NOT EDIT.
 
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.TagRepository -o ./mocks/tag_repository_minimock.go -n TagRepositoryMock
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.TagRepository -o ./mocks/tag_repository_minimock.go -n TagRepositoryMock
 
 import (
 	"context"
@@ -10,7 +10,7 @@ import (
 	mm_atomic "sync/atomic"
 	mm_time "time"
 
-	"github.com/dmitriygnatenko/internal/models"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 	"github.com/gojuno/minimock/v3"
 )
 

+ 3 - 3
internal/repositories/tag.go

@@ -2,15 +2,15 @@ package repositories
 
 //go:generate mkdir -p mocks
 //go:generate rm -rf ./mocks/*_minimock.go
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.TagRepository -o ./mocks/ -s "_minimock.go"
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.TagRepository -o ./mocks/ -s "_minimock.go"
 
 import (
 	"context"
 	"database/sql"
 
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 	sq "github.com/Masterminds/squirrel"
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/models"
 )
 
 const tagTableName = "tag"

+ 6 - 6
internal/service_provider/sp.go

@@ -1,12 +1,12 @@
 package sp
 
 import (
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/repositories"
-	cacheService "github.com/dmitriygnatenko/internal/services/cache"
-	dbService "github.com/dmitriygnatenko/internal/services/db"
-	envService "github.com/dmitriygnatenko/internal/services/env"
-	mailService "github.com/dmitriygnatenko/internal/services/mailer"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/repositories"
+	cacheService "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/cache"
+	dbService "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/db"
+	envService "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/env"
+	mailService "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/mailer"
 )
 
 type ServiceProvider struct {

+ 59 - 0
internal/services/auth/auth.go

@@ -0,0 +1,59 @@
+package auth
+
+//go:generate mkdir -p mocks
+//go:generate rm -rf ./mocks/*_minimock.go
+//go:generate minimock -i ../../interfaces.Auth -o ./mocks/ -s "_minimock.go"
+
+import (
+	"time"
+
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
+	"github.com/gofiber/fiber/v2"
+	"github.com/golang-jwt/jwt/v4"
+	"golang.org/x/crypto/bcrypt"
+)
+
+const (
+	defaultCost    = bcrypt.DefaultCost
+	defaultUserKey = "user"
+)
+
+type auth struct {
+	env interfaces.Env
+}
+
+func Init(env interfaces.Env) (interfaces.Auth, error) {
+	return auth{env: env}, nil
+}
+
+func (a auth) GeneratePasswordHash(password string) (string, error) {
+	res, err := bcrypt.GenerateFromPassword([]byte(password), defaultCost)
+	if err != nil {
+		return "", err
+	}
+
+	return string(res), nil
+}
+
+func (a auth) IsCorrectPassword(password string, hash string) bool {
+	return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) == nil
+}
+
+func (a auth) GetClaims(fctx *fiber.Ctx) jwt.MapClaims {
+	jwtUser := fctx.Locals(defaultUserKey).(*jwt.Token)
+	claims := jwtUser.Claims.(jwt.MapClaims)
+
+	return claims
+}
+
+func (a auth) GenerateToken(user models.User) (string, error) {
+	claims := jwt.MapClaims{
+		"name": user.Username,
+		"exp":  time.Now().Add(time.Duration(a.env.GetJWTLifetime()) * time.Second).Unix(),
+	}
+
+	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
+
+	return token.SignedString([]byte(a.env.GetJWTSecretKey()))
+}

+ 969 - 0
internal/services/auth/mocks/auth_minimock.go

@@ -0,0 +1,969 @@
+package mocks
+
+// Code generated by http://github.com/gojuno/minimock (dev). DO NOT EDIT.
+
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.Auth -o ./mocks/auth_minimock.go -n AuthMock
+
+import (
+	"sync"
+	mm_atomic "sync/atomic"
+	mm_time "time"
+
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
+	"github.com/gofiber/fiber/v2"
+	"github.com/gojuno/minimock/v3"
+	"github.com/golang-jwt/jwt/v4"
+)
+
+// AuthMock implements interfaces.Auth
+type AuthMock struct {
+	t minimock.Tester
+
+	funcGeneratePasswordHash          func(password string) (s1 string, err error)
+	inspectFuncGeneratePasswordHash   func(password string)
+	afterGeneratePasswordHashCounter  uint64
+	beforeGeneratePasswordHashCounter uint64
+	GeneratePasswordHashMock          mAuthMockGeneratePasswordHash
+
+	funcGenerateToken          func(user models.User) (s1 string, err error)
+	inspectFuncGenerateToken   func(user models.User)
+	afterGenerateTokenCounter  uint64
+	beforeGenerateTokenCounter uint64
+	GenerateTokenMock          mAuthMockGenerateToken
+
+	funcGetClaims          func(fctx *fiber.Ctx) (m1 jwt.MapClaims)
+	inspectFuncGetClaims   func(fctx *fiber.Ctx)
+	afterGetClaimsCounter  uint64
+	beforeGetClaimsCounter uint64
+	GetClaimsMock          mAuthMockGetClaims
+
+	funcIsCorrectPassword          func(password string, hash string) (b1 bool)
+	inspectFuncIsCorrectPassword   func(password string, hash string)
+	afterIsCorrectPasswordCounter  uint64
+	beforeIsCorrectPasswordCounter uint64
+	IsCorrectPasswordMock          mAuthMockIsCorrectPassword
+}
+
+// NewAuthMock returns a mock for interfaces.Auth
+func NewAuthMock(t minimock.Tester) *AuthMock {
+	m := &AuthMock{t: t}
+	if controller, ok := t.(minimock.MockController); ok {
+		controller.RegisterMocker(m)
+	}
+
+	m.GeneratePasswordHashMock = mAuthMockGeneratePasswordHash{mock: m}
+	m.GeneratePasswordHashMock.callArgs = []*AuthMockGeneratePasswordHashParams{}
+
+	m.GenerateTokenMock = mAuthMockGenerateToken{mock: m}
+	m.GenerateTokenMock.callArgs = []*AuthMockGenerateTokenParams{}
+
+	m.GetClaimsMock = mAuthMockGetClaims{mock: m}
+	m.GetClaimsMock.callArgs = []*AuthMockGetClaimsParams{}
+
+	m.IsCorrectPasswordMock = mAuthMockIsCorrectPassword{mock: m}
+	m.IsCorrectPasswordMock.callArgs = []*AuthMockIsCorrectPasswordParams{}
+
+	return m
+}
+
+type mAuthMockGeneratePasswordHash struct {
+	mock               *AuthMock
+	defaultExpectation *AuthMockGeneratePasswordHashExpectation
+	expectations       []*AuthMockGeneratePasswordHashExpectation
+
+	callArgs []*AuthMockGeneratePasswordHashParams
+	mutex    sync.RWMutex
+}
+
+// AuthMockGeneratePasswordHashExpectation specifies expectation struct of the Auth.GeneratePasswordHash
+type AuthMockGeneratePasswordHashExpectation struct {
+	mock    *AuthMock
+	params  *AuthMockGeneratePasswordHashParams
+	results *AuthMockGeneratePasswordHashResults
+	Counter uint64
+}
+
+// AuthMockGeneratePasswordHashParams contains parameters of the Auth.GeneratePasswordHash
+type AuthMockGeneratePasswordHashParams struct {
+	password string
+}
+
+// AuthMockGeneratePasswordHashResults contains results of the Auth.GeneratePasswordHash
+type AuthMockGeneratePasswordHashResults struct {
+	s1  string
+	err error
+}
+
+// Expect sets up expected params for Auth.GeneratePasswordHash
+func (mmGeneratePasswordHash *mAuthMockGeneratePasswordHash) Expect(password string) *mAuthMockGeneratePasswordHash {
+	if mmGeneratePasswordHash.mock.funcGeneratePasswordHash != nil {
+		mmGeneratePasswordHash.mock.t.Fatalf("AuthMock.GeneratePasswordHash mock is already set by Set")
+	}
+
+	if mmGeneratePasswordHash.defaultExpectation == nil {
+		mmGeneratePasswordHash.defaultExpectation = &AuthMockGeneratePasswordHashExpectation{}
+	}
+
+	mmGeneratePasswordHash.defaultExpectation.params = &AuthMockGeneratePasswordHashParams{password}
+	for _, e := range mmGeneratePasswordHash.expectations {
+		if minimock.Equal(e.params, mmGeneratePasswordHash.defaultExpectation.params) {
+			mmGeneratePasswordHash.mock.t.Fatalf("Expectation set by When has same params: %#v", *mmGeneratePasswordHash.defaultExpectation.params)
+		}
+	}
+
+	return mmGeneratePasswordHash
+}
+
+// Inspect accepts an inspector function that has same arguments as the Auth.GeneratePasswordHash
+func (mmGeneratePasswordHash *mAuthMockGeneratePasswordHash) Inspect(f func(password string)) *mAuthMockGeneratePasswordHash {
+	if mmGeneratePasswordHash.mock.inspectFuncGeneratePasswordHash != nil {
+		mmGeneratePasswordHash.mock.t.Fatalf("Inspect function is already set for AuthMock.GeneratePasswordHash")
+	}
+
+	mmGeneratePasswordHash.mock.inspectFuncGeneratePasswordHash = f
+
+	return mmGeneratePasswordHash
+}
+
+// Return sets up results that will be returned by Auth.GeneratePasswordHash
+func (mmGeneratePasswordHash *mAuthMockGeneratePasswordHash) Return(s1 string, err error) *AuthMock {
+	if mmGeneratePasswordHash.mock.funcGeneratePasswordHash != nil {
+		mmGeneratePasswordHash.mock.t.Fatalf("AuthMock.GeneratePasswordHash mock is already set by Set")
+	}
+
+	if mmGeneratePasswordHash.defaultExpectation == nil {
+		mmGeneratePasswordHash.defaultExpectation = &AuthMockGeneratePasswordHashExpectation{mock: mmGeneratePasswordHash.mock}
+	}
+	mmGeneratePasswordHash.defaultExpectation.results = &AuthMockGeneratePasswordHashResults{s1, err}
+	return mmGeneratePasswordHash.mock
+}
+
+// Set uses given function f to mock the Auth.GeneratePasswordHash method
+func (mmGeneratePasswordHash *mAuthMockGeneratePasswordHash) Set(f func(password string) (s1 string, err error)) *AuthMock {
+	if mmGeneratePasswordHash.defaultExpectation != nil {
+		mmGeneratePasswordHash.mock.t.Fatalf("Default expectation is already set for the Auth.GeneratePasswordHash method")
+	}
+
+	if len(mmGeneratePasswordHash.expectations) > 0 {
+		mmGeneratePasswordHash.mock.t.Fatalf("Some expectations are already set for the Auth.GeneratePasswordHash method")
+	}
+
+	mmGeneratePasswordHash.mock.funcGeneratePasswordHash = f
+	return mmGeneratePasswordHash.mock
+}
+
+// When sets expectation for the Auth.GeneratePasswordHash which will trigger the result defined by the following
+// Then helper
+func (mmGeneratePasswordHash *mAuthMockGeneratePasswordHash) When(password string) *AuthMockGeneratePasswordHashExpectation {
+	if mmGeneratePasswordHash.mock.funcGeneratePasswordHash != nil {
+		mmGeneratePasswordHash.mock.t.Fatalf("AuthMock.GeneratePasswordHash mock is already set by Set")
+	}
+
+	expectation := &AuthMockGeneratePasswordHashExpectation{
+		mock:   mmGeneratePasswordHash.mock,
+		params: &AuthMockGeneratePasswordHashParams{password},
+	}
+	mmGeneratePasswordHash.expectations = append(mmGeneratePasswordHash.expectations, expectation)
+	return expectation
+}
+
+// Then sets up Auth.GeneratePasswordHash return parameters for the expectation previously defined by the When method
+func (e *AuthMockGeneratePasswordHashExpectation) Then(s1 string, err error) *AuthMock {
+	e.results = &AuthMockGeneratePasswordHashResults{s1, err}
+	return e.mock
+}
+
+// GeneratePasswordHash implements interfaces.Auth
+func (mmGeneratePasswordHash *AuthMock) GeneratePasswordHash(password string) (s1 string, err error) {
+	mm_atomic.AddUint64(&mmGeneratePasswordHash.beforeGeneratePasswordHashCounter, 1)
+	defer mm_atomic.AddUint64(&mmGeneratePasswordHash.afterGeneratePasswordHashCounter, 1)
+
+	if mmGeneratePasswordHash.inspectFuncGeneratePasswordHash != nil {
+		mmGeneratePasswordHash.inspectFuncGeneratePasswordHash(password)
+	}
+
+	mm_params := &AuthMockGeneratePasswordHashParams{password}
+
+	// Record call args
+	mmGeneratePasswordHash.GeneratePasswordHashMock.mutex.Lock()
+	mmGeneratePasswordHash.GeneratePasswordHashMock.callArgs = append(mmGeneratePasswordHash.GeneratePasswordHashMock.callArgs, mm_params)
+	mmGeneratePasswordHash.GeneratePasswordHashMock.mutex.Unlock()
+
+	for _, e := range mmGeneratePasswordHash.GeneratePasswordHashMock.expectations {
+		if minimock.Equal(e.params, mm_params) {
+			mm_atomic.AddUint64(&e.Counter, 1)
+			return e.results.s1, e.results.err
+		}
+	}
+
+	if mmGeneratePasswordHash.GeneratePasswordHashMock.defaultExpectation != nil {
+		mm_atomic.AddUint64(&mmGeneratePasswordHash.GeneratePasswordHashMock.defaultExpectation.Counter, 1)
+		mm_want := mmGeneratePasswordHash.GeneratePasswordHashMock.defaultExpectation.params
+		mm_got := AuthMockGeneratePasswordHashParams{password}
+		if mm_want != nil && !minimock.Equal(*mm_want, mm_got) {
+			mmGeneratePasswordHash.t.Errorf("AuthMock.GeneratePasswordHash got unexpected parameters, want: %#v, got: %#v%s\n", *mm_want, mm_got, minimock.Diff(*mm_want, mm_got))
+		}
+
+		mm_results := mmGeneratePasswordHash.GeneratePasswordHashMock.defaultExpectation.results
+		if mm_results == nil {
+			mmGeneratePasswordHash.t.Fatal("No results are set for the AuthMock.GeneratePasswordHash")
+		}
+		return (*mm_results).s1, (*mm_results).err
+	}
+	if mmGeneratePasswordHash.funcGeneratePasswordHash != nil {
+		return mmGeneratePasswordHash.funcGeneratePasswordHash(password)
+	}
+	mmGeneratePasswordHash.t.Fatalf("Unexpected call to AuthMock.GeneratePasswordHash. %v", password)
+	return
+}
+
+// GeneratePasswordHashAfterCounter returns a count of finished AuthMock.GeneratePasswordHash invocations
+func (mmGeneratePasswordHash *AuthMock) GeneratePasswordHashAfterCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmGeneratePasswordHash.afterGeneratePasswordHashCounter)
+}
+
+// GeneratePasswordHashBeforeCounter returns a count of AuthMock.GeneratePasswordHash invocations
+func (mmGeneratePasswordHash *AuthMock) GeneratePasswordHashBeforeCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmGeneratePasswordHash.beforeGeneratePasswordHashCounter)
+}
+
+// Calls returns a list of arguments used in each call to AuthMock.GeneratePasswordHash.
+// The list is in the same order as the calls were made (i.e. recent calls have a higher index)
+func (mmGeneratePasswordHash *mAuthMockGeneratePasswordHash) Calls() []*AuthMockGeneratePasswordHashParams {
+	mmGeneratePasswordHash.mutex.RLock()
+
+	argCopy := make([]*AuthMockGeneratePasswordHashParams, len(mmGeneratePasswordHash.callArgs))
+	copy(argCopy, mmGeneratePasswordHash.callArgs)
+
+	mmGeneratePasswordHash.mutex.RUnlock()
+
+	return argCopy
+}
+
+// MinimockGeneratePasswordHashDone returns true if the count of the GeneratePasswordHash invocations corresponds
+// the number of defined expectations
+func (m *AuthMock) MinimockGeneratePasswordHashDone() bool {
+	for _, e := range m.GeneratePasswordHashMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			return false
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.GeneratePasswordHashMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterGeneratePasswordHashCounter) < 1 {
+		return false
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcGeneratePasswordHash != nil && mm_atomic.LoadUint64(&m.afterGeneratePasswordHashCounter) < 1 {
+		return false
+	}
+	return true
+}
+
+// MinimockGeneratePasswordHashInspect logs each unmet expectation
+func (m *AuthMock) MinimockGeneratePasswordHashInspect() {
+	for _, e := range m.GeneratePasswordHashMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			m.t.Errorf("Expected call to AuthMock.GeneratePasswordHash with params: %#v", *e.params)
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.GeneratePasswordHashMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterGeneratePasswordHashCounter) < 1 {
+		if m.GeneratePasswordHashMock.defaultExpectation.params == nil {
+			m.t.Error("Expected call to AuthMock.GeneratePasswordHash")
+		} else {
+			m.t.Errorf("Expected call to AuthMock.GeneratePasswordHash with params: %#v", *m.GeneratePasswordHashMock.defaultExpectation.params)
+		}
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcGeneratePasswordHash != nil && mm_atomic.LoadUint64(&m.afterGeneratePasswordHashCounter) < 1 {
+		m.t.Error("Expected call to AuthMock.GeneratePasswordHash")
+	}
+}
+
+type mAuthMockGenerateToken struct {
+	mock               *AuthMock
+	defaultExpectation *AuthMockGenerateTokenExpectation
+	expectations       []*AuthMockGenerateTokenExpectation
+
+	callArgs []*AuthMockGenerateTokenParams
+	mutex    sync.RWMutex
+}
+
+// AuthMockGenerateTokenExpectation specifies expectation struct of the Auth.GenerateToken
+type AuthMockGenerateTokenExpectation struct {
+	mock    *AuthMock
+	params  *AuthMockGenerateTokenParams
+	results *AuthMockGenerateTokenResults
+	Counter uint64
+}
+
+// AuthMockGenerateTokenParams contains parameters of the Auth.GenerateToken
+type AuthMockGenerateTokenParams struct {
+	user models.User
+}
+
+// AuthMockGenerateTokenResults contains results of the Auth.GenerateToken
+type AuthMockGenerateTokenResults struct {
+	s1  string
+	err error
+}
+
+// Expect sets up expected params for Auth.GenerateToken
+func (mmGenerateToken *mAuthMockGenerateToken) Expect(user models.User) *mAuthMockGenerateToken {
+	if mmGenerateToken.mock.funcGenerateToken != nil {
+		mmGenerateToken.mock.t.Fatalf("AuthMock.GenerateToken mock is already set by Set")
+	}
+
+	if mmGenerateToken.defaultExpectation == nil {
+		mmGenerateToken.defaultExpectation = &AuthMockGenerateTokenExpectation{}
+	}
+
+	mmGenerateToken.defaultExpectation.params = &AuthMockGenerateTokenParams{user}
+	for _, e := range mmGenerateToken.expectations {
+		if minimock.Equal(e.params, mmGenerateToken.defaultExpectation.params) {
+			mmGenerateToken.mock.t.Fatalf("Expectation set by When has same params: %#v", *mmGenerateToken.defaultExpectation.params)
+		}
+	}
+
+	return mmGenerateToken
+}
+
+// Inspect accepts an inspector function that has same arguments as the Auth.GenerateToken
+func (mmGenerateToken *mAuthMockGenerateToken) Inspect(f func(user models.User)) *mAuthMockGenerateToken {
+	if mmGenerateToken.mock.inspectFuncGenerateToken != nil {
+		mmGenerateToken.mock.t.Fatalf("Inspect function is already set for AuthMock.GenerateToken")
+	}
+
+	mmGenerateToken.mock.inspectFuncGenerateToken = f
+
+	return mmGenerateToken
+}
+
+// Return sets up results that will be returned by Auth.GenerateToken
+func (mmGenerateToken *mAuthMockGenerateToken) Return(s1 string, err error) *AuthMock {
+	if mmGenerateToken.mock.funcGenerateToken != nil {
+		mmGenerateToken.mock.t.Fatalf("AuthMock.GenerateToken mock is already set by Set")
+	}
+
+	if mmGenerateToken.defaultExpectation == nil {
+		mmGenerateToken.defaultExpectation = &AuthMockGenerateTokenExpectation{mock: mmGenerateToken.mock}
+	}
+	mmGenerateToken.defaultExpectation.results = &AuthMockGenerateTokenResults{s1, err}
+	return mmGenerateToken.mock
+}
+
+// Set uses given function f to mock the Auth.GenerateToken method
+func (mmGenerateToken *mAuthMockGenerateToken) Set(f func(user models.User) (s1 string, err error)) *AuthMock {
+	if mmGenerateToken.defaultExpectation != nil {
+		mmGenerateToken.mock.t.Fatalf("Default expectation is already set for the Auth.GenerateToken method")
+	}
+
+	if len(mmGenerateToken.expectations) > 0 {
+		mmGenerateToken.mock.t.Fatalf("Some expectations are already set for the Auth.GenerateToken method")
+	}
+
+	mmGenerateToken.mock.funcGenerateToken = f
+	return mmGenerateToken.mock
+}
+
+// When sets expectation for the Auth.GenerateToken which will trigger the result defined by the following
+// Then helper
+func (mmGenerateToken *mAuthMockGenerateToken) When(user models.User) *AuthMockGenerateTokenExpectation {
+	if mmGenerateToken.mock.funcGenerateToken != nil {
+		mmGenerateToken.mock.t.Fatalf("AuthMock.GenerateToken mock is already set by Set")
+	}
+
+	expectation := &AuthMockGenerateTokenExpectation{
+		mock:   mmGenerateToken.mock,
+		params: &AuthMockGenerateTokenParams{user},
+	}
+	mmGenerateToken.expectations = append(mmGenerateToken.expectations, expectation)
+	return expectation
+}
+
+// Then sets up Auth.GenerateToken return parameters for the expectation previously defined by the When method
+func (e *AuthMockGenerateTokenExpectation) Then(s1 string, err error) *AuthMock {
+	e.results = &AuthMockGenerateTokenResults{s1, err}
+	return e.mock
+}
+
+// GenerateToken implements interfaces.Auth
+func (mmGenerateToken *AuthMock) GenerateToken(user models.User) (s1 string, err error) {
+	mm_atomic.AddUint64(&mmGenerateToken.beforeGenerateTokenCounter, 1)
+	defer mm_atomic.AddUint64(&mmGenerateToken.afterGenerateTokenCounter, 1)
+
+	if mmGenerateToken.inspectFuncGenerateToken != nil {
+		mmGenerateToken.inspectFuncGenerateToken(user)
+	}
+
+	mm_params := &AuthMockGenerateTokenParams{user}
+
+	// Record call args
+	mmGenerateToken.GenerateTokenMock.mutex.Lock()
+	mmGenerateToken.GenerateTokenMock.callArgs = append(mmGenerateToken.GenerateTokenMock.callArgs, mm_params)
+	mmGenerateToken.GenerateTokenMock.mutex.Unlock()
+
+	for _, e := range mmGenerateToken.GenerateTokenMock.expectations {
+		if minimock.Equal(e.params, mm_params) {
+			mm_atomic.AddUint64(&e.Counter, 1)
+			return e.results.s1, e.results.err
+		}
+	}
+
+	if mmGenerateToken.GenerateTokenMock.defaultExpectation != nil {
+		mm_atomic.AddUint64(&mmGenerateToken.GenerateTokenMock.defaultExpectation.Counter, 1)
+		mm_want := mmGenerateToken.GenerateTokenMock.defaultExpectation.params
+		mm_got := AuthMockGenerateTokenParams{user}
+		if mm_want != nil && !minimock.Equal(*mm_want, mm_got) {
+			mmGenerateToken.t.Errorf("AuthMock.GenerateToken got unexpected parameters, want: %#v, got: %#v%s\n", *mm_want, mm_got, minimock.Diff(*mm_want, mm_got))
+		}
+
+		mm_results := mmGenerateToken.GenerateTokenMock.defaultExpectation.results
+		if mm_results == nil {
+			mmGenerateToken.t.Fatal("No results are set for the AuthMock.GenerateToken")
+		}
+		return (*mm_results).s1, (*mm_results).err
+	}
+	if mmGenerateToken.funcGenerateToken != nil {
+		return mmGenerateToken.funcGenerateToken(user)
+	}
+	mmGenerateToken.t.Fatalf("Unexpected call to AuthMock.GenerateToken. %v", user)
+	return
+}
+
+// GenerateTokenAfterCounter returns a count of finished AuthMock.GenerateToken invocations
+func (mmGenerateToken *AuthMock) GenerateTokenAfterCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmGenerateToken.afterGenerateTokenCounter)
+}
+
+// GenerateTokenBeforeCounter returns a count of AuthMock.GenerateToken invocations
+func (mmGenerateToken *AuthMock) GenerateTokenBeforeCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmGenerateToken.beforeGenerateTokenCounter)
+}
+
+// Calls returns a list of arguments used in each call to AuthMock.GenerateToken.
+// The list is in the same order as the calls were made (i.e. recent calls have a higher index)
+func (mmGenerateToken *mAuthMockGenerateToken) Calls() []*AuthMockGenerateTokenParams {
+	mmGenerateToken.mutex.RLock()
+
+	argCopy := make([]*AuthMockGenerateTokenParams, len(mmGenerateToken.callArgs))
+	copy(argCopy, mmGenerateToken.callArgs)
+
+	mmGenerateToken.mutex.RUnlock()
+
+	return argCopy
+}
+
+// MinimockGenerateTokenDone returns true if the count of the GenerateToken invocations corresponds
+// the number of defined expectations
+func (m *AuthMock) MinimockGenerateTokenDone() bool {
+	for _, e := range m.GenerateTokenMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			return false
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.GenerateTokenMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterGenerateTokenCounter) < 1 {
+		return false
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcGenerateToken != nil && mm_atomic.LoadUint64(&m.afterGenerateTokenCounter) < 1 {
+		return false
+	}
+	return true
+}
+
+// MinimockGenerateTokenInspect logs each unmet expectation
+func (m *AuthMock) MinimockGenerateTokenInspect() {
+	for _, e := range m.GenerateTokenMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			m.t.Errorf("Expected call to AuthMock.GenerateToken with params: %#v", *e.params)
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.GenerateTokenMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterGenerateTokenCounter) < 1 {
+		if m.GenerateTokenMock.defaultExpectation.params == nil {
+			m.t.Error("Expected call to AuthMock.GenerateToken")
+		} else {
+			m.t.Errorf("Expected call to AuthMock.GenerateToken with params: %#v", *m.GenerateTokenMock.defaultExpectation.params)
+		}
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcGenerateToken != nil && mm_atomic.LoadUint64(&m.afterGenerateTokenCounter) < 1 {
+		m.t.Error("Expected call to AuthMock.GenerateToken")
+	}
+}
+
+type mAuthMockGetClaims struct {
+	mock               *AuthMock
+	defaultExpectation *AuthMockGetClaimsExpectation
+	expectations       []*AuthMockGetClaimsExpectation
+
+	callArgs []*AuthMockGetClaimsParams
+	mutex    sync.RWMutex
+}
+
+// AuthMockGetClaimsExpectation specifies expectation struct of the Auth.GetClaims
+type AuthMockGetClaimsExpectation struct {
+	mock    *AuthMock
+	params  *AuthMockGetClaimsParams
+	results *AuthMockGetClaimsResults
+	Counter uint64
+}
+
+// AuthMockGetClaimsParams contains parameters of the Auth.GetClaims
+type AuthMockGetClaimsParams struct {
+	fctx *fiber.Ctx
+}
+
+// AuthMockGetClaimsResults contains results of the Auth.GetClaims
+type AuthMockGetClaimsResults struct {
+	m1 jwt.MapClaims
+}
+
+// Expect sets up expected params for Auth.GetClaims
+func (mmGetClaims *mAuthMockGetClaims) Expect(fctx *fiber.Ctx) *mAuthMockGetClaims {
+	if mmGetClaims.mock.funcGetClaims != nil {
+		mmGetClaims.mock.t.Fatalf("AuthMock.GetClaims mock is already set by Set")
+	}
+
+	if mmGetClaims.defaultExpectation == nil {
+		mmGetClaims.defaultExpectation = &AuthMockGetClaimsExpectation{}
+	}
+
+	mmGetClaims.defaultExpectation.params = &AuthMockGetClaimsParams{fctx}
+	for _, e := range mmGetClaims.expectations {
+		if minimock.Equal(e.params, mmGetClaims.defaultExpectation.params) {
+			mmGetClaims.mock.t.Fatalf("Expectation set by When has same params: %#v", *mmGetClaims.defaultExpectation.params)
+		}
+	}
+
+	return mmGetClaims
+}
+
+// Inspect accepts an inspector function that has same arguments as the Auth.GetClaims
+func (mmGetClaims *mAuthMockGetClaims) Inspect(f func(fctx *fiber.Ctx)) *mAuthMockGetClaims {
+	if mmGetClaims.mock.inspectFuncGetClaims != nil {
+		mmGetClaims.mock.t.Fatalf("Inspect function is already set for AuthMock.GetClaims")
+	}
+
+	mmGetClaims.mock.inspectFuncGetClaims = f
+
+	return mmGetClaims
+}
+
+// Return sets up results that will be returned by Auth.GetClaims
+func (mmGetClaims *mAuthMockGetClaims) Return(m1 jwt.MapClaims) *AuthMock {
+	if mmGetClaims.mock.funcGetClaims != nil {
+		mmGetClaims.mock.t.Fatalf("AuthMock.GetClaims mock is already set by Set")
+	}
+
+	if mmGetClaims.defaultExpectation == nil {
+		mmGetClaims.defaultExpectation = &AuthMockGetClaimsExpectation{mock: mmGetClaims.mock}
+	}
+	mmGetClaims.defaultExpectation.results = &AuthMockGetClaimsResults{m1}
+	return mmGetClaims.mock
+}
+
+// Set uses given function f to mock the Auth.GetClaims method
+func (mmGetClaims *mAuthMockGetClaims) Set(f func(fctx *fiber.Ctx) (m1 jwt.MapClaims)) *AuthMock {
+	if mmGetClaims.defaultExpectation != nil {
+		mmGetClaims.mock.t.Fatalf("Default expectation is already set for the Auth.GetClaims method")
+	}
+
+	if len(mmGetClaims.expectations) > 0 {
+		mmGetClaims.mock.t.Fatalf("Some expectations are already set for the Auth.GetClaims method")
+	}
+
+	mmGetClaims.mock.funcGetClaims = f
+	return mmGetClaims.mock
+}
+
+// When sets expectation for the Auth.GetClaims which will trigger the result defined by the following
+// Then helper
+func (mmGetClaims *mAuthMockGetClaims) When(fctx *fiber.Ctx) *AuthMockGetClaimsExpectation {
+	if mmGetClaims.mock.funcGetClaims != nil {
+		mmGetClaims.mock.t.Fatalf("AuthMock.GetClaims mock is already set by Set")
+	}
+
+	expectation := &AuthMockGetClaimsExpectation{
+		mock:   mmGetClaims.mock,
+		params: &AuthMockGetClaimsParams{fctx},
+	}
+	mmGetClaims.expectations = append(mmGetClaims.expectations, expectation)
+	return expectation
+}
+
+// Then sets up Auth.GetClaims return parameters for the expectation previously defined by the When method
+func (e *AuthMockGetClaimsExpectation) Then(m1 jwt.MapClaims) *AuthMock {
+	e.results = &AuthMockGetClaimsResults{m1}
+	return e.mock
+}
+
+// GetClaims implements interfaces.Auth
+func (mmGetClaims *AuthMock) GetClaims(fctx *fiber.Ctx) (m1 jwt.MapClaims) {
+	mm_atomic.AddUint64(&mmGetClaims.beforeGetClaimsCounter, 1)
+	defer mm_atomic.AddUint64(&mmGetClaims.afterGetClaimsCounter, 1)
+
+	if mmGetClaims.inspectFuncGetClaims != nil {
+		mmGetClaims.inspectFuncGetClaims(fctx)
+	}
+
+	mm_params := &AuthMockGetClaimsParams{fctx}
+
+	// Record call args
+	mmGetClaims.GetClaimsMock.mutex.Lock()
+	mmGetClaims.GetClaimsMock.callArgs = append(mmGetClaims.GetClaimsMock.callArgs, mm_params)
+	mmGetClaims.GetClaimsMock.mutex.Unlock()
+
+	for _, e := range mmGetClaims.GetClaimsMock.expectations {
+		if minimock.Equal(e.params, mm_params) {
+			mm_atomic.AddUint64(&e.Counter, 1)
+			return e.results.m1
+		}
+	}
+
+	if mmGetClaims.GetClaimsMock.defaultExpectation != nil {
+		mm_atomic.AddUint64(&mmGetClaims.GetClaimsMock.defaultExpectation.Counter, 1)
+		mm_want := mmGetClaims.GetClaimsMock.defaultExpectation.params
+		mm_got := AuthMockGetClaimsParams{fctx}
+		if mm_want != nil && !minimock.Equal(*mm_want, mm_got) {
+			mmGetClaims.t.Errorf("AuthMock.GetClaims got unexpected parameters, want: %#v, got: %#v%s\n", *mm_want, mm_got, minimock.Diff(*mm_want, mm_got))
+		}
+
+		mm_results := mmGetClaims.GetClaimsMock.defaultExpectation.results
+		if mm_results == nil {
+			mmGetClaims.t.Fatal("No results are set for the AuthMock.GetClaims")
+		}
+		return (*mm_results).m1
+	}
+	if mmGetClaims.funcGetClaims != nil {
+		return mmGetClaims.funcGetClaims(fctx)
+	}
+	mmGetClaims.t.Fatalf("Unexpected call to AuthMock.GetClaims. %v", fctx)
+	return
+}
+
+// GetClaimsAfterCounter returns a count of finished AuthMock.GetClaims invocations
+func (mmGetClaims *AuthMock) GetClaimsAfterCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmGetClaims.afterGetClaimsCounter)
+}
+
+// GetClaimsBeforeCounter returns a count of AuthMock.GetClaims invocations
+func (mmGetClaims *AuthMock) GetClaimsBeforeCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmGetClaims.beforeGetClaimsCounter)
+}
+
+// Calls returns a list of arguments used in each call to AuthMock.GetClaims.
+// The list is in the same order as the calls were made (i.e. recent calls have a higher index)
+func (mmGetClaims *mAuthMockGetClaims) Calls() []*AuthMockGetClaimsParams {
+	mmGetClaims.mutex.RLock()
+
+	argCopy := make([]*AuthMockGetClaimsParams, len(mmGetClaims.callArgs))
+	copy(argCopy, mmGetClaims.callArgs)
+
+	mmGetClaims.mutex.RUnlock()
+
+	return argCopy
+}
+
+// MinimockGetClaimsDone returns true if the count of the GetClaims invocations corresponds
+// the number of defined expectations
+func (m *AuthMock) MinimockGetClaimsDone() bool {
+	for _, e := range m.GetClaimsMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			return false
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.GetClaimsMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterGetClaimsCounter) < 1 {
+		return false
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcGetClaims != nil && mm_atomic.LoadUint64(&m.afterGetClaimsCounter) < 1 {
+		return false
+	}
+	return true
+}
+
+// MinimockGetClaimsInspect logs each unmet expectation
+func (m *AuthMock) MinimockGetClaimsInspect() {
+	for _, e := range m.GetClaimsMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			m.t.Errorf("Expected call to AuthMock.GetClaims with params: %#v", *e.params)
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.GetClaimsMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterGetClaimsCounter) < 1 {
+		if m.GetClaimsMock.defaultExpectation.params == nil {
+			m.t.Error("Expected call to AuthMock.GetClaims")
+		} else {
+			m.t.Errorf("Expected call to AuthMock.GetClaims with params: %#v", *m.GetClaimsMock.defaultExpectation.params)
+		}
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcGetClaims != nil && mm_atomic.LoadUint64(&m.afterGetClaimsCounter) < 1 {
+		m.t.Error("Expected call to AuthMock.GetClaims")
+	}
+}
+
+type mAuthMockIsCorrectPassword struct {
+	mock               *AuthMock
+	defaultExpectation *AuthMockIsCorrectPasswordExpectation
+	expectations       []*AuthMockIsCorrectPasswordExpectation
+
+	callArgs []*AuthMockIsCorrectPasswordParams
+	mutex    sync.RWMutex
+}
+
+// AuthMockIsCorrectPasswordExpectation specifies expectation struct of the Auth.IsCorrectPassword
+type AuthMockIsCorrectPasswordExpectation struct {
+	mock    *AuthMock
+	params  *AuthMockIsCorrectPasswordParams
+	results *AuthMockIsCorrectPasswordResults
+	Counter uint64
+}
+
+// AuthMockIsCorrectPasswordParams contains parameters of the Auth.IsCorrectPassword
+type AuthMockIsCorrectPasswordParams struct {
+	password string
+	hash     string
+}
+
+// AuthMockIsCorrectPasswordResults contains results of the Auth.IsCorrectPassword
+type AuthMockIsCorrectPasswordResults struct {
+	b1 bool
+}
+
+// Expect sets up expected params for Auth.IsCorrectPassword
+func (mmIsCorrectPassword *mAuthMockIsCorrectPassword) Expect(password string, hash string) *mAuthMockIsCorrectPassword {
+	if mmIsCorrectPassword.mock.funcIsCorrectPassword != nil {
+		mmIsCorrectPassword.mock.t.Fatalf("AuthMock.IsCorrectPassword mock is already set by Set")
+	}
+
+	if mmIsCorrectPassword.defaultExpectation == nil {
+		mmIsCorrectPassword.defaultExpectation = &AuthMockIsCorrectPasswordExpectation{}
+	}
+
+	mmIsCorrectPassword.defaultExpectation.params = &AuthMockIsCorrectPasswordParams{password, hash}
+	for _, e := range mmIsCorrectPassword.expectations {
+		if minimock.Equal(e.params, mmIsCorrectPassword.defaultExpectation.params) {
+			mmIsCorrectPassword.mock.t.Fatalf("Expectation set by When has same params: %#v", *mmIsCorrectPassword.defaultExpectation.params)
+		}
+	}
+
+	return mmIsCorrectPassword
+}
+
+// Inspect accepts an inspector function that has same arguments as the Auth.IsCorrectPassword
+func (mmIsCorrectPassword *mAuthMockIsCorrectPassword) Inspect(f func(password string, hash string)) *mAuthMockIsCorrectPassword {
+	if mmIsCorrectPassword.mock.inspectFuncIsCorrectPassword != nil {
+		mmIsCorrectPassword.mock.t.Fatalf("Inspect function is already set for AuthMock.IsCorrectPassword")
+	}
+
+	mmIsCorrectPassword.mock.inspectFuncIsCorrectPassword = f
+
+	return mmIsCorrectPassword
+}
+
+// Return sets up results that will be returned by Auth.IsCorrectPassword
+func (mmIsCorrectPassword *mAuthMockIsCorrectPassword) Return(b1 bool) *AuthMock {
+	if mmIsCorrectPassword.mock.funcIsCorrectPassword != nil {
+		mmIsCorrectPassword.mock.t.Fatalf("AuthMock.IsCorrectPassword mock is already set by Set")
+	}
+
+	if mmIsCorrectPassword.defaultExpectation == nil {
+		mmIsCorrectPassword.defaultExpectation = &AuthMockIsCorrectPasswordExpectation{mock: mmIsCorrectPassword.mock}
+	}
+	mmIsCorrectPassword.defaultExpectation.results = &AuthMockIsCorrectPasswordResults{b1}
+	return mmIsCorrectPassword.mock
+}
+
+// Set uses given function f to mock the Auth.IsCorrectPassword method
+func (mmIsCorrectPassword *mAuthMockIsCorrectPassword) Set(f func(password string, hash string) (b1 bool)) *AuthMock {
+	if mmIsCorrectPassword.defaultExpectation != nil {
+		mmIsCorrectPassword.mock.t.Fatalf("Default expectation is already set for the Auth.IsCorrectPassword method")
+	}
+
+	if len(mmIsCorrectPassword.expectations) > 0 {
+		mmIsCorrectPassword.mock.t.Fatalf("Some expectations are already set for the Auth.IsCorrectPassword method")
+	}
+
+	mmIsCorrectPassword.mock.funcIsCorrectPassword = f
+	return mmIsCorrectPassword.mock
+}
+
+// When sets expectation for the Auth.IsCorrectPassword which will trigger the result defined by the following
+// Then helper
+func (mmIsCorrectPassword *mAuthMockIsCorrectPassword) When(password string, hash string) *AuthMockIsCorrectPasswordExpectation {
+	if mmIsCorrectPassword.mock.funcIsCorrectPassword != nil {
+		mmIsCorrectPassword.mock.t.Fatalf("AuthMock.IsCorrectPassword mock is already set by Set")
+	}
+
+	expectation := &AuthMockIsCorrectPasswordExpectation{
+		mock:   mmIsCorrectPassword.mock,
+		params: &AuthMockIsCorrectPasswordParams{password, hash},
+	}
+	mmIsCorrectPassword.expectations = append(mmIsCorrectPassword.expectations, expectation)
+	return expectation
+}
+
+// Then sets up Auth.IsCorrectPassword return parameters for the expectation previously defined by the When method
+func (e *AuthMockIsCorrectPasswordExpectation) Then(b1 bool) *AuthMock {
+	e.results = &AuthMockIsCorrectPasswordResults{b1}
+	return e.mock
+}
+
+// IsCorrectPassword implements interfaces.Auth
+func (mmIsCorrectPassword *AuthMock) IsCorrectPassword(password string, hash string) (b1 bool) {
+	mm_atomic.AddUint64(&mmIsCorrectPassword.beforeIsCorrectPasswordCounter, 1)
+	defer mm_atomic.AddUint64(&mmIsCorrectPassword.afterIsCorrectPasswordCounter, 1)
+
+	if mmIsCorrectPassword.inspectFuncIsCorrectPassword != nil {
+		mmIsCorrectPassword.inspectFuncIsCorrectPassword(password, hash)
+	}
+
+	mm_params := &AuthMockIsCorrectPasswordParams{password, hash}
+
+	// Record call args
+	mmIsCorrectPassword.IsCorrectPasswordMock.mutex.Lock()
+	mmIsCorrectPassword.IsCorrectPasswordMock.callArgs = append(mmIsCorrectPassword.IsCorrectPasswordMock.callArgs, mm_params)
+	mmIsCorrectPassword.IsCorrectPasswordMock.mutex.Unlock()
+
+	for _, e := range mmIsCorrectPassword.IsCorrectPasswordMock.expectations {
+		if minimock.Equal(e.params, mm_params) {
+			mm_atomic.AddUint64(&e.Counter, 1)
+			return e.results.b1
+		}
+	}
+
+	if mmIsCorrectPassword.IsCorrectPasswordMock.defaultExpectation != nil {
+		mm_atomic.AddUint64(&mmIsCorrectPassword.IsCorrectPasswordMock.defaultExpectation.Counter, 1)
+		mm_want := mmIsCorrectPassword.IsCorrectPasswordMock.defaultExpectation.params
+		mm_got := AuthMockIsCorrectPasswordParams{password, hash}
+		if mm_want != nil && !minimock.Equal(*mm_want, mm_got) {
+			mmIsCorrectPassword.t.Errorf("AuthMock.IsCorrectPassword got unexpected parameters, want: %#v, got: %#v%s\n", *mm_want, mm_got, minimock.Diff(*mm_want, mm_got))
+		}
+
+		mm_results := mmIsCorrectPassword.IsCorrectPasswordMock.defaultExpectation.results
+		if mm_results == nil {
+			mmIsCorrectPassword.t.Fatal("No results are set for the AuthMock.IsCorrectPassword")
+		}
+		return (*mm_results).b1
+	}
+	if mmIsCorrectPassword.funcIsCorrectPassword != nil {
+		return mmIsCorrectPassword.funcIsCorrectPassword(password, hash)
+	}
+	mmIsCorrectPassword.t.Fatalf("Unexpected call to AuthMock.IsCorrectPassword. %v %v", password, hash)
+	return
+}
+
+// IsCorrectPasswordAfterCounter returns a count of finished AuthMock.IsCorrectPassword invocations
+func (mmIsCorrectPassword *AuthMock) IsCorrectPasswordAfterCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmIsCorrectPassword.afterIsCorrectPasswordCounter)
+}
+
+// IsCorrectPasswordBeforeCounter returns a count of AuthMock.IsCorrectPassword invocations
+func (mmIsCorrectPassword *AuthMock) IsCorrectPasswordBeforeCounter() uint64 {
+	return mm_atomic.LoadUint64(&mmIsCorrectPassword.beforeIsCorrectPasswordCounter)
+}
+
+// Calls returns a list of arguments used in each call to AuthMock.IsCorrectPassword.
+// The list is in the same order as the calls were made (i.e. recent calls have a higher index)
+func (mmIsCorrectPassword *mAuthMockIsCorrectPassword) Calls() []*AuthMockIsCorrectPasswordParams {
+	mmIsCorrectPassword.mutex.RLock()
+
+	argCopy := make([]*AuthMockIsCorrectPasswordParams, len(mmIsCorrectPassword.callArgs))
+	copy(argCopy, mmIsCorrectPassword.callArgs)
+
+	mmIsCorrectPassword.mutex.RUnlock()
+
+	return argCopy
+}
+
+// MinimockIsCorrectPasswordDone returns true if the count of the IsCorrectPassword invocations corresponds
+// the number of defined expectations
+func (m *AuthMock) MinimockIsCorrectPasswordDone() bool {
+	for _, e := range m.IsCorrectPasswordMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			return false
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.IsCorrectPasswordMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterIsCorrectPasswordCounter) < 1 {
+		return false
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcIsCorrectPassword != nil && mm_atomic.LoadUint64(&m.afterIsCorrectPasswordCounter) < 1 {
+		return false
+	}
+	return true
+}
+
+// MinimockIsCorrectPasswordInspect logs each unmet expectation
+func (m *AuthMock) MinimockIsCorrectPasswordInspect() {
+	for _, e := range m.IsCorrectPasswordMock.expectations {
+		if mm_atomic.LoadUint64(&e.Counter) < 1 {
+			m.t.Errorf("Expected call to AuthMock.IsCorrectPassword with params: %#v", *e.params)
+		}
+	}
+
+	// if default expectation was set then invocations count should be greater than zero
+	if m.IsCorrectPasswordMock.defaultExpectation != nil && mm_atomic.LoadUint64(&m.afterIsCorrectPasswordCounter) < 1 {
+		if m.IsCorrectPasswordMock.defaultExpectation.params == nil {
+			m.t.Error("Expected call to AuthMock.IsCorrectPassword")
+		} else {
+			m.t.Errorf("Expected call to AuthMock.IsCorrectPassword with params: %#v", *m.IsCorrectPasswordMock.defaultExpectation.params)
+		}
+	}
+	// if func was set then invocations count should be greater than zero
+	if m.funcIsCorrectPassword != nil && mm_atomic.LoadUint64(&m.afterIsCorrectPasswordCounter) < 1 {
+		m.t.Error("Expected call to AuthMock.IsCorrectPassword")
+	}
+}
+
+// MinimockFinish checks that all mocked methods have been called the expected number of times
+func (m *AuthMock) MinimockFinish() {
+	if !m.minimockDone() {
+		m.MinimockGeneratePasswordHashInspect()
+
+		m.MinimockGenerateTokenInspect()
+
+		m.MinimockGetClaimsInspect()
+
+		m.MinimockIsCorrectPasswordInspect()
+		m.t.FailNow()
+	}
+}
+
+// MinimockWait waits for all mocked methods to be called the expected number of times
+func (m *AuthMock) MinimockWait(timeout mm_time.Duration) {
+	timeoutCh := mm_time.After(timeout)
+	for {
+		if m.minimockDone() {
+			return
+		}
+		select {
+		case <-timeoutCh:
+			m.MinimockFinish()
+			return
+		case <-mm_time.After(10 * mm_time.Millisecond):
+		}
+	}
+}
+
+func (m *AuthMock) minimockDone() bool {
+	done := true
+	return done &&
+		m.MinimockGeneratePasswordHashDone() &&
+		m.MinimockGenerateTokenDone() &&
+		m.MinimockGetClaimsDone() &&
+		m.MinimockIsCorrectPasswordDone()
+}

+ 1 - 1
internal/services/cache/cache.go

@@ -7,7 +7,7 @@ package cache
 import (
 	"sync"
 
-	"github.com/dmitriygnatenko/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
 )
 
 type cache struct {

+ 1 - 1
internal/services/cache/mocks/cache_minimock.go

@@ -2,7 +2,7 @@ package mocks
 
 // Code generated by http://github.com/gojuno/minimock (dev). DO NOT EDIT.
 
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.Cache -o ./mocks/cache_minimock.go -n CacheMock
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.Cache -o ./mocks/cache_minimock.go -n CacheMock
 
 import (
 	"sync"

+ 1 - 1
internal/services/db/db.go

@@ -4,7 +4,7 @@ import (
 	"database/sql"
 	"time"
 
-	"github.com/dmitriygnatenko/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
 )
 
 func Init(env interfaces.Env) (*sql.DB, error) {

+ 1 - 1
internal/services/env/env.go

@@ -3,7 +3,7 @@ package env
 import (
 	"flag"
 
-	"github.com/dmitriygnatenko/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
 	"github.com/spf13/viper"
 )
 

+ 4 - 4
internal/services/handler/admin/article.go

@@ -3,10 +3,10 @@ package admin
 import (
 	"strconv"
 
-	"github.com/dmitriygnatenko/internal/helpers"
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/mapper"
-	"github.com/dmitriygnatenko/internal/models"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helpers"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 	"github.com/go-playground/validator/v10"
 	"github.com/gofiber/fiber/v2"
 )

+ 4 - 4
internal/services/handler/admin/tag.go

@@ -3,10 +3,10 @@ package admin
 import (
 	"strconv"
 
-	"github.com/dmitriygnatenko/internal/helpers"
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/mapper"
-	"github.com/dmitriygnatenko/internal/models"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helpers"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
 	"github.com/go-playground/validator/v10"
 	"github.com/gofiber/fiber/v2"
 )

+ 2 - 2
internal/services/handler/article.go

@@ -3,8 +3,8 @@ package handler
 import (
 	"database/sql"
 
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/mapper"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
 	"github.com/gofiber/fiber/v2"
 )
 

+ 6 - 6
internal/services/handler/article_test.go

@@ -8,13 +8,13 @@ import (
 	"strconv"
 	"testing"
 
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helpers"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
+	repositoryMocks "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/repositories/mocks"
+	sp "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/service_provider"
+	cacheMocks "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/cache/mocks"
 	"github.com/brianvoe/gofakeit/v6"
-	"github.com/dmitriygnatenko/internal/helpers"
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/models"
-	repositoryMocks "github.com/dmitriygnatenko/internal/repositories/mocks"
-	sp "github.com/dmitriygnatenko/internal/service_provider"
-	cacheMocks "github.com/dmitriygnatenko/internal/services/cache/mocks"
 	"github.com/gofiber/fiber/v2"
 	"github.com/gojuno/minimock/v3"
 	"github.com/stretchr/testify/assert"

+ 2 - 2
internal/services/handler/main_page.go

@@ -1,8 +1,8 @@
 package handler
 
 import (
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/mapper"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
 	"github.com/gofiber/fiber/v2"
 )
 

+ 6 - 6
internal/services/handler/main_page_test.go

@@ -6,13 +6,13 @@ import (
 	"net/http/httptest"
 	"testing"
 
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helpers"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
+	repositoryMocks "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/repositories/mocks"
+	sp "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/service_provider"
+	cacheMocks "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/cache/mocks"
 	"github.com/brianvoe/gofakeit/v6"
-	"github.com/dmitriygnatenko/internal/helpers"
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/models"
-	repositoryMocks "github.com/dmitriygnatenko/internal/repositories/mocks"
-	sp "github.com/dmitriygnatenko/internal/service_provider"
-	cacheMocks "github.com/dmitriygnatenko/internal/services/cache/mocks"
 	"github.com/gofiber/fiber/v2"
 	"github.com/gojuno/minimock/v3"
 	"github.com/stretchr/testify/assert"

+ 2 - 2
internal/services/handler/tag.go

@@ -3,8 +3,8 @@ package handler
 import (
 	"database/sql"
 
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/mapper"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
 	"github.com/gofiber/fiber/v2"
 )
 

+ 6 - 6
internal/services/handler/tag_test.go

@@ -8,13 +8,13 @@ import (
 	"strconv"
 	"testing"
 
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helpers"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
+	repositoryMocks "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/repositories/mocks"
+	sp "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/service_provider"
+	cacheMocks "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/cache/mocks"
 	"github.com/brianvoe/gofakeit/v6"
-	"github.com/dmitriygnatenko/internal/helpers"
-	"github.com/dmitriygnatenko/internal/interfaces"
-	"github.com/dmitriygnatenko/internal/models"
-	repositoryMocks "github.com/dmitriygnatenko/internal/repositories/mocks"
-	sp "github.com/dmitriygnatenko/internal/service_provider"
-	cacheMocks "github.com/dmitriygnatenko/internal/services/cache/mocks"
 	"github.com/gofiber/fiber/v2"
 	"github.com/gojuno/minimock/v3"
 	"github.com/stretchr/testify/assert"

+ 2 - 2
internal/services/mailer/mailer.go

@@ -2,14 +2,14 @@ package mailer
 
 //go:generate mkdir -p mocks
 //go:generate rm -rf ./mocks/*_minimock.go
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.Mailer -o ./mocks/ -s "_minimock.go"
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.Mailer -o ./mocks/ -s "_minimock.go"
 
 import (
 	"fmt"
 	"net/smtp"
 	"strings"
 
-	"github.com/dmitriygnatenko/internal/interfaces"
+	"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces"
 )
 
 type mailer struct {

+ 1 - 1
internal/services/mailer/mocks/mailer_minimock.go

@@ -2,7 +2,7 @@ package mocks
 
 // Code generated by http://github.com/gojuno/minimock (dev). DO NOT EDIT.
 
-//go:generate minimock -i github.com/dmitriygnatenko/internal/interfaces.Mailer -o ./mocks/mailer_minimock.go -n MailerMock
+//go:generate minimock -i git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/interfaces.Mailer -o ./mocks/mailer_minimock.go -n MailerMock
 
 import (
 	"sync"