From f95bf233464b7dcce60859951cd866af27f0339e Mon Sep 17 00:00:00 2001 From: Dusan Malusev Date: Fri, 10 Nov 2023 22:48:38 +0100 Subject: [PATCH 1/4] Update deps Signed-off-by: Dusan Malusev --- go.mod | 19 +++++++++---------- go.sum | 40 +++++++++++++++++++--------------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index c50d9e4..4ddd462 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,16 @@ module github.com/BrosSquad/GoFiber-Boilerplate go 1.21 require ( - github.com/goccy/go-json v0.10.2 github.com/gofiber/fiber/v2 v2.50.0 github.com/invopop/validation v0.3.0 - github.com/nano-interactive/go-utils v1.5.3 + github.com/nano-interactive/go-utils v1.5.8 github.com/rs/zerolog v1.31.0 github.com/samber/lo v1.38.1 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.17.0 github.com/stretchr/testify v1.8.4 github.com/valyala/fasthttp v1.50.0 - go.mongodb.org/mongo-driver v1.12.1 + go.mongodb.org/mongo-driver v1.13.0 ) require ( @@ -22,7 +21,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gocql/gocql v1.6.0 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -53,11 +52,11 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/inf.v0 v0.9.1 // 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 0b0ba14..1a434ab 100644 --- a/go.sum +++ b/go.sum @@ -59,7 +59,7 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -79,8 +79,6 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -143,8 +141,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -189,8 +187,8 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/nano-interactive/go-utils v1.5.3 h1:gmi0bkj9d2zxrVsk0h0cfQ+HjFF9xvxP2+Fl687sIuM= -github.com/nano-interactive/go-utils v1.5.3/go.mod h1:z+wk/heUyiXGMKcR+ZjMcZnXST8e61nsL9mKgDj9Emw= +github.com/nano-interactive/go-utils v1.5.8 h1:TvUhYxhHjbF0BawXGWo4q/+p32ft9ZpKaq/Y+uuk4pc= +github.com/nano-interactive/go-utils v1.5.8/go.mod h1:z+wk/heUyiXGMKcR+ZjMcZnXST8e61nsL9mKgDj9Emw= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -226,8 +224,8 @@ github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 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.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= @@ -272,8 +270,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= -go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= +go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -292,8 +290,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= 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= @@ -304,8 +302,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -386,8 +384,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -430,8 +428,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -444,8 +442,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/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= From 71aee209f02708eb956092f6ff230ec09cdfb261 Mon Sep 17 00:00:00 2001 From: Dusan Malusev Date: Sat, 11 Nov 2023 02:45:47 +0100 Subject: [PATCH 2/4] Uber FX instead of home grown DI Container Signed-off-by: Dusan Malusev --- app/commands/serve.go | 27 +++++---- app/http/handlers.go | 11 ++-- app/http/helloworld/handler.go | 5 +- app/http/http.go | 14 ----- app/testutils/testing.go | 79 ++++++++++++------------- core/cmd/cmd.go | 10 ++-- core/container/container.go | 15 +++++ core/http/context.go | 6 +- core/http/context_test.go | 3 +- core/http/http.go | 7 +-- core/http/httpfx/httpfx.go | 103 +++++++++++++++++++++++++++++++++ go.mod | 4 ++ go.sum | 12 ++++ 13 files changed, 205 insertions(+), 91 deletions(-) delete mode 100644 app/http/http.go create mode 100644 core/container/container.go create mode 100644 core/http/httpfx/httpfx.go diff --git a/app/commands/serve.go b/app/commands/serve.go index d295d67..672b95b 100644 --- a/app/commands/serve.go +++ b/app/commands/serve.go @@ -1,29 +1,32 @@ package commands import ( - "time" - "github.com/spf13/cobra" - "github.com/BrosSquad/GoFiber-Boilerplate/app/container" "github.com/BrosSquad/GoFiber-Boilerplate/app/http" - "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" - corehttp "github.com/BrosSquad/GoFiber-Boilerplate/core/http" + "github.com/BrosSquad/GoFiber-Boilerplate/core/container" + "github.com/BrosSquad/GoFiber-Boilerplate/core/http/httpfx" ) func Serve() *cobra.Command { return &cobra.Command{ Use: "serve", RunE: func(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - di := ctx.Value(constants.ContainerContextKey).(*container.Container) - app := http.CreateApplication(ctx, di, true) + // ctx := cmd.Context() + app := container.New( + httpfx.Module("0.0.0.0:8000", "Test", true, http.Handlers()), + ) + app.Run() + + // di := ctx.Value(constants.ContainerContextKey).(*container.Container) + // app := http.CreateApplication(ctx, di, true) - cfg := di.GetConfig().HTTP - go corehttp.RunServer(cfg.Addr, cfg.Port, app) + // cfg := di.GetConfig().HTTP + // go corehttp.RunServer(cfg.Addr, cfg.Port, app) - <-ctx.Done() - return app.ShutdownWithTimeout(10 * time.Second) + // <-ctx.Done() + return nil + // return app.ShutdownWithTimeout(10 * time.Second) }, } } diff --git a/app/http/handlers.go b/app/http/handlers.go index 68fd54f..6eb4ba5 100644 --- a/app/http/handlers.go +++ b/app/http/handlers.go @@ -1,12 +1,15 @@ package http import ( - "github.com/gofiber/fiber/v2" + "go.uber.org/fx" - "github.com/BrosSquad/GoFiber-Boilerplate/app/container" "github.com/BrosSquad/GoFiber-Boilerplate/app/http/helloworld" + "github.com/BrosSquad/GoFiber-Boilerplate/core/http/httpfx" ) -func routes(app fiber.Router, c *container.Container) { - app.Get("/", helloworld.HelloWorld(c.GetLogger())) +func Handlers() fx.Option { + return httpfx.Routes( + "/", + httpfx.Get("/", helloworld.HelloWorld), + ) } diff --git a/app/http/helloworld/handler.go b/app/http/helloworld/handler.go index 3c8abaa..5b5418f 100644 --- a/app/http/helloworld/handler.go +++ b/app/http/helloworld/handler.go @@ -2,12 +2,11 @@ package helloworld import ( "github.com/gofiber/fiber/v2" - "github.com/rs/zerolog" ) -func HelloWorld(logger zerolog.Logger) fiber.Handler { +func HelloWorld() fiber.Handler { return func(c *fiber.Ctx) error { - logger.Info().Msg("Hello World!") + // logger.Info().Msg("Hello World!") return c.SendString("Hello, World!") } } diff --git a/app/http/http.go b/app/http/http.go deleted file mode 100644 index 8618fc2..0000000 --- a/app/http/http.go +++ /dev/null @@ -1,14 +0,0 @@ -package http - -import ( - "context" - - "github.com/BrosSquad/GoFiber-Boilerplate/app/constants" - "github.com/BrosSquad/GoFiber-Boilerplate/app/container" - corehttp "github.com/BrosSquad/GoFiber-Boilerplate/core/http" - "github.com/gofiber/fiber/v2" -) - -func CreateApplication(ctx context.Context, c *container.Container, displayInfo bool) *fiber.App { - return corehttp.CreateApplication(ctx, constants.AppName, c, displayInfo, routes) -} diff --git a/app/testutils/testing.go b/app/testutils/testing.go index f71fb93..a56c3b7 100644 --- a/app/testutils/testing.go +++ b/app/testutils/testing.go @@ -1,19 +1,12 @@ package testutils import ( - "context" "testing" - "time" - "github.com/gofiber/fiber/v2" nanotesting "github.com/nano-interactive/go-utils/testing" - nanofibertesting "github.com/nano-interactive/go-utils/testing/fiber" - "github.com/samber/lo" "github.com/spf13/viper" "github.com/BrosSquad/GoFiber-Boilerplate/app/config" - "github.com/BrosSquad/GoFiber-Boilerplate/app/container" - "github.com/BrosSquad/GoFiber-Boilerplate/app/http" ) func GetConfig(tb testing.TB) config.Config { @@ -30,49 +23,49 @@ func GetConfig(tb testing.TB) config.Config { }) } -func AppTester[T any](tb testing.TB, items ...any) *nanofibertesting.GoFiberSender[T] { - tb.Helper() - sender, _, _ := App[T](tb, false, items...) - return sender -} +// func AppTester[T any](tb testing.TB, items ...any) *nanofibertesting.GoFiberSender[T] { +// tb.Helper() +// sender, _, _ := App[T](tb, false, items...) +// return sender +// } -func App[T any](tb testing.TB, followRedirects bool, items ...any) (*nanofibertesting.GoFiberSender[T], *container.Container, *fiber.App) { - tb.Helper() +// func App[T any](tb testing.TB, followRedirects bool, items ...any) (*nanofibertesting.GoFiberSender[T], *container.Container, *fiber.App) { +// tb.Helper() - creator := nanotesting.AppCreaterFunc[*fiber.App, *container.Container](func(ctx context.Context, v *viper.Viper) (*fiber.App, *container.Container) { - conf, found := lo.Find(items, func(l any) bool { - _, ok := l.(config.Config) +// creator := nanotesting.AppCreaterFunc[*fiber.App, *container.Container](func(ctx context.Context, v *viper.Viper) (*fiber.App, *container.Container) { +// conf, found := lo.Find(items, func(l any) bool { +// _, ok := l.(config.Config) - return ok - }) +// return ok +// }) - cfg, err := config.NewWithViper(v) - if err != nil { - tb.Errorf("Failed to parse config file: %v", v) - tb.FailNow() - } +// cfg, err := config.NewWithViper(v) +// if err != nil { +// tb.Errorf("Failed to parse config file: %v", v) +// tb.FailNow() +// } - if found { - cfg = conf.(config.Config) - } - di := container.New(ctx, cfg) - app := http.CreateApplication(ctx, di, false) +// if found { +// cfg = conf.(config.Config) +// } +// di := container.New(ctx, cfg) +// app := http.CreateApplication(ctx, di, false) - tb.Cleanup(func() { - if err := app.ShutdownWithTimeout(10 * time.Second); err != nil { - tb.Errorf("Failed to close APP Server: %v", err) - } +// tb.Cleanup(func() { +// if err := app.ShutdownWithTimeout(10 * time.Second); err != nil { +// tb.Errorf("Failed to close APP Server: %v", err) +// } - if err := di.Close(); err != nil { - tb.Errorf("Failed to close DI Container: %v", err) - } - }) +// if err := di.Close(); err != nil { +// tb.Errorf("Failed to close DI Container: %v", err) +// } +// }) - return nil, nil - }) +// return nil, nil +// }) - app, di := nanotesting.CreateApplication[*fiber.App, *container.Container](tb, creator) - sender := nanofibertesting.New[T](tb, app, followRedirects) +// app, di := nanotesting.CreateApplication[*fiber.App, *container.Container](tb, creator) +// sender := nanofibertesting.New[T](tb, app, followRedirects) - return sender, di, app -} +// return sender, di, app +// } diff --git a/core/cmd/cmd.go b/core/cmd/cmd.go index f1f7c5e..f286d2f 100644 --- a/core/cmd/cmd.go +++ b/core/cmd/cmd.go @@ -14,7 +14,6 @@ import ( appLogger "github.com/nano-interactive/go-utils/logging" "github.com/BrosSquad/GoFiber-Boilerplate/app/config" - "github.com/BrosSquad/GoFiber-Boilerplate/app/container" "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" ) @@ -35,8 +34,8 @@ func Execute(version string, cmds []*cobra.Command, use, short, long string) { //nolint:all zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack - cnt := container.New(ctx, cfg) - ctx = context.WithValue(ctx, constants.ContainerContextKey, cnt) + // cnt := container.New(ctx, cfg) + // ctx = context.WithValue(ctx, constants.ContainerContextKey, cnt) ctx, cancel := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM) ctx = context.WithValue(ctx, constants.CancelContextKey, cancel) @@ -46,9 +45,10 @@ func Execute(version string, cmds []*cobra.Command, use, short, long string) { PersistentPostRunE: func(cmd *cobra.Command, _ []string) error { ctx := cmd.Context() cancel := ctx.Value(constants.CancelContextKey).(context.CancelFunc) - cnt := ctx.Value(constants.ContainerContextKey).(*container.Container) + // cnt := ctx.Value(constants.ContainerContextKey).(*container.Container) cancel() - return cnt.Close() + return nil + // return cnt.Close() }, } diff --git a/core/container/container.go b/core/container/container.go new file mode 100644 index 0000000..6c19f61 --- /dev/null +++ b/core/container/container.go @@ -0,0 +1,15 @@ +package container + +import ( + "go.uber.org/fx" +) + +func New(opts ...fx.Option) *fx.App { + o := make([]fx.Option, 1, len(opts)+1) + o[0] = Logger() + return fx.New(append(o, opts...)...) +} + +func Logger() fx.Option { + return fx.Provide() +} diff --git a/core/http/context.go b/core/http/context.go index 6c07975..6ac1098 100644 --- a/core/http/context.go +++ b/core/http/context.go @@ -8,9 +8,9 @@ import ( "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" ) -func Context(base context.Context) fiber.Handler { +func Context() fiber.Handler { return func(ctx *fiber.Ctx) error { - c, cancel := context.WithCancel(base) + c, cancel := context.WithCancel(context.Background()) ctx.Locals(constants.CancelFuncContextKey, cancel) ctx.SetUserContext(c) @@ -20,7 +20,7 @@ func Context(base context.Context) fiber.Handler { cancelFnWillBeCalled := ctx.Locals(constants.CancelWillBeCalledContextKey) if cancelFnWillBeCalled == nil { - defer cancel() + cancel() } return err diff --git a/core/http/context_test.go b/core/http/context_test.go index 393cb61..ced1179 100644 --- a/core/http/context_test.go +++ b/core/http/context_test.go @@ -1,7 +1,6 @@ package http_test import ( - "context" "testing" "github.com/gofiber/fiber/v2" @@ -18,7 +17,7 @@ func TestContextMiddleware(t *testing.T) { assert := require.New(t) app := fiber.New() - app.Use(http.Context(context.Background())) + app.Use(http.Context()) app.Get("/", func(ctx *fiber.Ctx) error { return ctx.SendStatus(fiber.StatusOK) }) diff --git a/core/http/http.go b/core/http/http.go index 3be7066..15e4638 100644 --- a/core/http/http.go +++ b/core/http/http.go @@ -1,7 +1,6 @@ package http import ( - "context" "encoding/json" "fmt" "net" @@ -40,7 +39,7 @@ func RunServer(ip string, port int, app *fiber.App) { } } -func CreateApplication(ctx context.Context, appName string, c *container.Container, displayInfo bool, routes Routes) *fiber.App { +func CreateApplication(appName string, displayInfo bool) *fiber.App { var ( jsonEncoder fiberutils.JSONMarshal = json.Marshal jsonDecoder fiberutils.JSONUnmarshal = json.Unmarshal @@ -63,7 +62,7 @@ func CreateApplication(ctx context.Context, appName string, c *container.Contain app := fiber.New(staticConfig) app.Use(recover.New()) - app.Use(Context(ctx)) + app.Use(Context()) app.Use(requestid.New(requestid.Config{ Generator: func() string { return utils.RandomString(32) @@ -71,7 +70,5 @@ func CreateApplication(ctx context.Context, appName string, c *container.Contain ContextKey: constants.RequestIDContextKey, })) - routes(app, c) - return app } diff --git a/core/http/httpfx/httpfx.go b/core/http/httpfx/httpfx.go new file mode 100644 index 0000000..79173c1 --- /dev/null +++ b/core/http/httpfx/httpfx.go @@ -0,0 +1,103 @@ +package httpfx + +import ( + "context" + "fmt" + "net/http" + "time" + + corehttp "github.com/BrosSquad/GoFiber-Boilerplate/core/http" + + "github.com/gofiber/fiber/v2" + "github.com/samber/lo" + "go.uber.org/fx" +) + +func Module(addr, appName string, displayInfo bool, routes ...fx.Option) fx.Option { + return fx.Module("fiber-app", + append(routes, + fx.Provide(func(lc fx.Lifecycle) *fiber.App { + app := corehttp.CreateApplication(appName, displayInfo) + lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + go func() { + _ = app.Listen(addr) + }() + + return nil + }, + OnStop: func(ctx context.Context) error { + newCtx, cancel := context.WithTimeout(ctx, 1*time.Second) + defer cancel() + return app.ShutdownWithContext(newCtx) + }, + }) + + return app + }), + )..., + ) +} + +func Get(path string, handlers ...any) func(string) fx.Option { + return Route(http.MethodGet, path, handlers...) +} + +func Post(path string, handlers ...any) func(string) fx.Option { + return Route(http.MethodPost, path, handlers...) +} + +func Put(path string, handlers ...any) func(string) fx.Option { + return Route(http.MethodPut, path, handlers...) +} + +func Patch(path string, handlers ...any) func(string) fx.Option { + return Route(http.MethodPatch, path, handlers...) +} + +func Delete(path string, handlers ...any) func(string) fx.Option { + return Route(http.MethodDelete, path, handlers...) +} + +func Route(method, path string, handlers ...any) func(string) fx.Option { + return func(prefix string) fx.Option { + return fx.Module(fmt.Sprintf("route-%s-%s%s", method, prefix, path), append( + lo.Map(handlers, func(a any, _ int) fx.Option { + return fx.Provide(fx.Annotate( + a, + fx.ResultTags(fmt.Sprintf(`group:"handlers-%s-%s%s"`, method, prefix, path)), + )) + }), + fx.Invoke( + fx.Annotate( + func(router fiber.Router, handlers []fiber.Handler) { + router.Add(method, path, handlers...) + }, + fx.ParamTags( + fmt.Sprintf(`name:"router-%s"`, prefix), + fmt.Sprintf(`group:"handlers-%s-%s%s"`, method, prefix, path), + ), + ), + ), + )...) + } +} + +func Routes(prefix string, routes ...func(string) fx.Option) fx.Option { + return fx.Module( + fmt.Sprintf("routes-%s", prefix), + append( + lo.Map(routes, func(fn func(string) fx.Option, _ int) fx.Option { + return fn(prefix) + }), + fx.Provide( + fx.Annotate( + func(app *fiber.App) fiber.Router { + return app.Group(prefix) + }, + fx.ResultTags(fmt.Sprintf(`name:"router-%s"`, prefix)), + ), + ), + )..., + ) +} diff --git a/go.mod b/go.mod index 4ddd462..ea2a60e 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/valyala/fasthttp v1.50.0 go.mongodb.org/mongo-driver v1.13.0 + go.uber.org/fx v1.20.1 ) require ( @@ -51,7 +52,10 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/dig v1.17.1 // indirect go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect golang.org/x/crypto v0.15.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect golang.org/x/sync v0.5.0 // indirect diff --git a/go.sum b/go.sum index 1a434ab..262e658 100644 --- a/go.sum +++ b/go.sum @@ -45,6 +45,8 @@ github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= @@ -278,8 +280,18 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= +go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= +go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= From 13c9ab9aff48f020c4870f505d0a75bd30966b02 Mon Sep 17 00:00:00 2001 From: Dusan Malusev Date: Sun, 19 Nov 2023 01:40:06 +0100 Subject: [PATCH 3/4] Initial working impl for Uber FX Signed-off-by: Dusan Malusev --- Makefile | 10 - app/commands/serve.go | 43 ++-- app/config/config.go | 46 +---- app/config/http.go | 10 + app/container/container.go | 27 --- app/container/logger.go | 25 --- app/handlers/handlers.go | 14 ++ app/{http => handlers}/helloworld/handler.go | 5 +- app/http/handlers.go | 15 -- app/http/helloworld/handler_test.go | 15 -- app/testutils/testing.go | 71 ------- config.example.yml | 13 +- core/cmd/cmd.go | 39 +--- core/configfx/configfx.go | 44 ++++ core/container/container.go | 15 -- core/{http => fiber}/context.go | 8 +- core/{http => fiber}/context_test.go | 14 +- core/{http => fiber}/error.go | 20 +- core/{http => fiber}/error_test.go | 2 +- core/fiber/fiberfx/fiberfx.go | 202 +++++++++++++++++++ core/{http => fiber}/http.go | 26 +-- core/fiber/notfound.go | 22 ++ core/{http => fiber}/notfound_test.go | 2 +- core/http/httpfx/httpfx.go | 103 ---------- core/http/notfound.go | 22 -- core/loggerfx/loggerfx.go | 118 +++++++++++ go.mod | 21 +- go.sum | 66 +----- main.go | 10 +- 29 files changed, 507 insertions(+), 521 deletions(-) delete mode 100644 Makefile create mode 100644 app/config/http.go delete mode 100644 app/container/container.go delete mode 100644 app/container/logger.go create mode 100644 app/handlers/handlers.go rename app/{http => handlers}/helloworld/handler.go (55%) delete mode 100644 app/http/handlers.go delete mode 100644 app/http/helloworld/handler_test.go delete mode 100644 app/testutils/testing.go create mode 100644 core/configfx/configfx.go delete mode 100644 core/container/container.go rename core/{http => fiber}/context.go (75%) rename core/{http => fiber}/context_test.go (59%) rename core/{http => fiber}/error.go (58%) rename core/{http => fiber}/error_test.go (99%) create mode 100644 core/fiber/fiberfx/fiberfx.go rename core/{http => fiber}/http.go (61%) create mode 100644 core/fiber/notfound.go rename core/{http => fiber}/notfound_test.go (97%) delete mode 100644 core/http/httpfx/httpfx.go delete mode 100644 core/http/notfound.go create mode 100644 core/loggerfx/loggerfx.go diff --git a/Makefile b/Makefile deleted file mode 100644 index f02ffc5..0000000 --- a/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -.PHONY: build -build: -ifeq ($(ENV),production) - @CGO_ENABLED=0 CXX=g++ CC=gcc go build -ldflags="-s -w -X 'main.Version=${VERSION}'" -o ./bin/$(APP_NAME) ./main.go -else ifeq ($(ENV),development) - @CXX=g++ CC=gcc go build -o ./bin/$(APP_NAME) -gcflags "all=-N -l" ./main.go -else - @echo "Target ${ENV} is not supported" -endif - @cp ./config.example.yml bin/config.yml diff --git a/app/commands/serve.go b/app/commands/serve.go index 672b95b..46c0d2a 100644 --- a/app/commands/serve.go +++ b/app/commands/serve.go @@ -2,31 +2,42 @@ package commands import ( "github.com/spf13/cobra" + "go.uber.org/fx" - "github.com/BrosSquad/GoFiber-Boilerplate/app/http" - "github.com/BrosSquad/GoFiber-Boilerplate/core/container" - "github.com/BrosSquad/GoFiber-Boilerplate/core/http/httpfx" + "github.com/BrosSquad/GoFiber-Boilerplate/app/config" + "github.com/BrosSquad/GoFiber-Boilerplate/app/constants" + "github.com/BrosSquad/GoFiber-Boilerplate/app/handlers" + "github.com/BrosSquad/GoFiber-Boilerplate/core/configfx" + "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber/fiberfx" + "github.com/BrosSquad/GoFiber-Boilerplate/core/loggerfx" ) +func loggerSink(cfg *config.Logging) loggerfx.Sink { + return loggerfx.Sink{ + Level: cfg.Level, + Type: loggerfx.Stdout, + PrettyPrint: cfg.PrettyPrint, + } +} + func Serve() *cobra.Command { return &cobra.Command{ Use: "serve", - RunE: func(cmd *cobra.Command, args []string) error { - // ctx := cmd.Context() - app := container.New( - httpfx.Module("0.0.0.0:8000", "Test", true, http.Handlers()), - ) - app.Run() - - // di := ctx.Value(constants.ContainerContextKey).(*container.Container) - // app := http.CreateApplication(ctx, di, true) + RunE: func(_ *cobra.Command, _ []string) error { + cfg, err := configfx.New[config.Config](constants.AppName) + if err != nil { + return err + } - // cfg := di.GetConfig().HTTP - // go corehttp.RunServer(cfg.Addr, cfg.Port, app) + app := fx.New( + configfx.Module(cfg), + loggerfx.Module(loggerSink(&cfg.Logging)), + fiberfx.App(constants.AppName, cfg.App.FiberInfo, handlers.Handlers()), + fiberfx.RunApp(cfg.HTTP.Addr, constants.AppName, cfg.HTTP.ShutdownTimeout), + ) - // <-ctx.Done() + app.Run() return nil - // return app.ShutdownWithTimeout(10 * time.Second) }, } } diff --git a/app/config/config.go b/app/config/config.go index eb36a96..cebe2af 100644 --- a/app/config/config.go +++ b/app/config/config.go @@ -1,55 +1,17 @@ package config -import ( - "github.com/spf13/viper" - - "github.com/BrosSquad/GoFiber-Boilerplate/app/constants" - utilsconfig "github.com/nano-interactive/go-utils/config" -) - type ( + App struct { + FiberInfo bool `mapstructure:"fiber_info" json:"fiber_info" yaml:"fiber_info"` + } Logging struct { Level string `mapstructure:"level" json:"level" yaml:"level"` PrettyPrint bool `mapstructure:"pretty_print" json:"pretty_print" yaml:"pretty_print"` } - HTTP struct { - Addr string `mapstructure:"addr" json:"addr" yaml:"addr"` - Port int `mapstructure:"port" json:"port" yaml:"port"` - } - Config struct { Logging Logging `mapstructure:"logging" json:"logging" yaml:"logging"` HTTP HTTP `mapstructure:"http" json:"http" yaml:"http"` + App App `mapstructure:"app" json:"app" yaml:"app"` } ) - -func New() (Config, error) { - cfg := utilsconfig.Config{ - ProjectName: constants.AppName, - Name: "config", - Type: "yaml", - Paths: []string{ - "$XDG_CONFIG_HOME/" + constants.AppName, - "/etc/" + constants.AppName, - ".", - }, - } - - v, err := utilsconfig.NewWithModifier(cfg) - if err != nil { - return Config{}, err - } - - return NewWithViper(v) -} - -func NewWithViper(v *viper.Viper) (Config, error) { - c := Config{} - - if err := v.Unmarshal(&c); err != nil { - return Config{}, err - } - - return c, nil -} diff --git a/app/config/http.go b/app/config/http.go new file mode 100644 index 0000000..ee8159f --- /dev/null +++ b/app/config/http.go @@ -0,0 +1,10 @@ +package config + +import ( + "time" +) + +type HTTP struct { + Addr string `mapstructure:"addr" json:"addr" yaml:"addr"` + ShutdownTimeout time.Duration `mapstructure:"shutdown_timeout" json:"shutdown_timeout" yaml:"shutdown_timeout"` +} diff --git a/app/container/container.go b/app/container/container.go deleted file mode 100644 index 1720c6b..0000000 --- a/app/container/container.go +++ /dev/null @@ -1,27 +0,0 @@ -package container - -import ( - "context" - - "github.com/BrosSquad/GoFiber-Boilerplate/app/config" -) - -type Container struct { - config *config.Config - ctx context.Context -} - -func New(ctx context.Context, config config.Config) *Container { - return &Container{ - ctx: ctx, - config: &config, - } -} - -func (c *Container) GetConfig() config.Config { - return *c.config -} - -func (c *Container) Close() error { - return nil -} diff --git a/app/container/logger.go b/app/container/logger.go deleted file mode 100644 index ba7ac1f..0000000 --- a/app/container/logger.go +++ /dev/null @@ -1,25 +0,0 @@ -package container - -import ( - "io" - "os" - - appLogger "github.com/nano-interactive/go-utils/logging" - "github.com/rs/zerolog" -) - -func (c *Container) GetLogger() zerolog.Logger { - var stdout io.Writer = os.Stdout - - if c.config.Logging.PrettyPrint { - stdout = zerolog.NewConsoleWriter() - } - - writer := stdout - - return appLogger.New(c.config.Logging.Level, c.config.Logging.PrettyPrint). - Output(writer). - With(). - Stack(). - Logger() -} diff --git a/app/handlers/handlers.go b/app/handlers/handlers.go new file mode 100644 index 0000000..31924d5 --- /dev/null +++ b/app/handlers/handlers.go @@ -0,0 +1,14 @@ +package handlers + +import ( + "github.com/BrosSquad/GoFiber-Boilerplate/app/handlers/helloworld" + "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber/fiberfx" +) + +func Handlers() fiberfx.RoutesFx { + return fiberfx.Routes( + "/", + nil, + fiberfx.Get("/", helloworld.HelloWorld), + ) +} diff --git a/app/http/helloworld/handler.go b/app/handlers/helloworld/handler.go similarity index 55% rename from app/http/helloworld/handler.go rename to app/handlers/helloworld/handler.go index 5b5418f..3c8abaa 100644 --- a/app/http/helloworld/handler.go +++ b/app/handlers/helloworld/handler.go @@ -2,11 +2,12 @@ package helloworld import ( "github.com/gofiber/fiber/v2" + "github.com/rs/zerolog" ) -func HelloWorld() fiber.Handler { +func HelloWorld(logger zerolog.Logger) fiber.Handler { return func(c *fiber.Ctx) error { - // logger.Info().Msg("Hello World!") + logger.Info().Msg("Hello World!") return c.SendString("Hello, World!") } } diff --git a/app/http/handlers.go b/app/http/handlers.go deleted file mode 100644 index 6eb4ba5..0000000 --- a/app/http/handlers.go +++ /dev/null @@ -1,15 +0,0 @@ -package http - -import ( - "go.uber.org/fx" - - "github.com/BrosSquad/GoFiber-Boilerplate/app/http/helloworld" - "github.com/BrosSquad/GoFiber-Boilerplate/core/http/httpfx" -) - -func Handlers() fx.Option { - return httpfx.Routes( - "/", - httpfx.Get("/", helloworld.HelloWorld), - ) -} diff --git a/app/http/helloworld/handler_test.go b/app/http/helloworld/handler_test.go deleted file mode 100644 index c034452..0000000 --- a/app/http/helloworld/handler_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package helloworld_test - -// func TestHelloWorldHandler(t *testing.T) { -// t.Parallel() -// assert := require.New(t) - -// app, _ := testing_utils.CreateApplication() -// _, loggerAssert := testing_utils.NewTestLogger(t, zerolog.InfoLevel) - -// app.Get("/", hello_world.HelloWorld(loggerAssert.Logger())) - -// res := testing_utils.Get(app, "/") - -// assert.Equal(http.StatusOK, res.StatusCode) -// } diff --git a/app/testutils/testing.go b/app/testutils/testing.go deleted file mode 100644 index a56c3b7..0000000 --- a/app/testutils/testing.go +++ /dev/null @@ -1,71 +0,0 @@ -package testutils - -import ( - "testing" - - nanotesting "github.com/nano-interactive/go-utils/testing" - "github.com/spf13/viper" - - "github.com/BrosSquad/GoFiber-Boilerplate/app/config" -) - -func GetConfig(tb testing.TB) config.Config { - tb.Helper() - return nanotesting.GetConfig[config.Config](tb, func(v *viper.Viper) (config.Config, error) { - cfg, err := config.NewWithViper(v) - if err != nil { - return config.Config{}, err - } - - cfg.Logging.PrettyPrint = true - - return cfg, nil - }) -} - -// func AppTester[T any](tb testing.TB, items ...any) *nanofibertesting.GoFiberSender[T] { -// tb.Helper() -// sender, _, _ := App[T](tb, false, items...) -// return sender -// } - -// func App[T any](tb testing.TB, followRedirects bool, items ...any) (*nanofibertesting.GoFiberSender[T], *container.Container, *fiber.App) { -// tb.Helper() - -// creator := nanotesting.AppCreaterFunc[*fiber.App, *container.Container](func(ctx context.Context, v *viper.Viper) (*fiber.App, *container.Container) { -// conf, found := lo.Find(items, func(l any) bool { -// _, ok := l.(config.Config) - -// return ok -// }) - -// cfg, err := config.NewWithViper(v) -// if err != nil { -// tb.Errorf("Failed to parse config file: %v", v) -// tb.FailNow() -// } - -// if found { -// cfg = conf.(config.Config) -// } -// di := container.New(ctx, cfg) -// app := http.CreateApplication(ctx, di, false) - -// tb.Cleanup(func() { -// if err := app.ShutdownWithTimeout(10 * time.Second); err != nil { -// tb.Errorf("Failed to close APP Server: %v", err) -// } - -// if err := di.Close(); err != nil { -// tb.Errorf("Failed to close DI Container: %v", err) -// } -// }) - -// return nil, nil -// }) - -// app, di := nanotesting.CreateApplication[*fiber.App, *container.Container](tb, creator) -// sender := nanofibertesting.New[T](tb, app, followRedirects) - -// return sender, di, app -// } diff --git a/config.example.yml b/config.example.yml index f33f87c..75892ae 100644 --- a/config.example.yml +++ b/config.example.yml @@ -1,3 +1,12 @@ +app: + fiber_info: true + http: - addr: '0.0.0.0' - port: 8080 + addr: '0.0.0.0:8080' + shutdown_timeout: 1s + profiler_addr: '0.0.0.0:5000' + + +logging: + level: debug + pretty_print: true \ No newline at end of file diff --git a/core/cmd/cmd.go b/core/cmd/cmd.go index f286d2f..aff8cfb 100644 --- a/core/cmd/cmd.go +++ b/core/cmd/cmd.go @@ -2,54 +2,17 @@ package cmd import ( "context" - "os" - "os/signal" - "syscall" - "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "github.com/rs/zerolog/pkgerrors" "github.com/spf13/cobra" - - appLogger "github.com/nano-interactive/go-utils/logging" - - "github.com/BrosSquad/GoFiber-Boilerplate/app/config" - "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" ) -func Execute(version string, cmds []*cobra.Command, use, short, long string) { +func Execute(version string, use, short, long string, cmds ...*cobra.Command) { rootCmd := &cobra.Command{ Use: use, Short: short, Long: long, Version: version, - PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { - ctx := context.Background() - cfg, err := config.New() - if err != nil { - return err - } - - appLogger.ConfigureDefaultLogger(cfg.Logging.Level, cfg.Logging.PrettyPrint) - //nolint:all - zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack - - // cnt := container.New(ctx, cfg) - // ctx = context.WithValue(ctx, constants.ContainerContextKey, cnt) - ctx, cancel := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM) - ctx = context.WithValue(ctx, constants.CancelContextKey, cancel) - - cmd.SetContext(ctx) - return nil - }, - PersistentPostRunE: func(cmd *cobra.Command, _ []string) error { - ctx := cmd.Context() - cancel := ctx.Value(constants.CancelContextKey).(context.CancelFunc) - // cnt := ctx.Value(constants.ContainerContextKey).(*container.Container) - cancel() - return nil - // return cnt.Close() - }, } rootCmd.AddCommand(cmds...) diff --git a/core/configfx/configfx.go b/core/configfx/configfx.go new file mode 100644 index 0000000..66f4820 --- /dev/null +++ b/core/configfx/configfx.go @@ -0,0 +1,44 @@ +package configfx + +import ( + utilsconfig "github.com/nano-interactive/go-utils/config" + + "github.com/spf13/viper" + "go.uber.org/fx" +) + +func New[T any](appName string) (T, error) { + v, err := utilsconfig.NewWithModifier(utilsconfig.Config{ + ProjectName: appName, + Name: "config", + Type: "yaml", + Paths: []string{ + "$XDG_CONFIG_HOME/" + appName, + "/etc/" + appName, + ".", + }, + }) + if err != nil { + var t T + return t, err + } + + return NewWithViper[T](v) +} + +func NewWithViper[T any](v *viper.Viper) (T, error) { + var c T + + if err := v.Unmarshal(&c); err != nil { + return c, err + } + + return c, nil +} + +func Module[T any](cfg T) fx.Option { + return fx.Module( + "config", + fx.Supply(cfg), + ) +} diff --git a/core/container/container.go b/core/container/container.go deleted file mode 100644 index 6c19f61..0000000 --- a/core/container/container.go +++ /dev/null @@ -1,15 +0,0 @@ -package container - -import ( - "go.uber.org/fx" -) - -func New(opts ...fx.Option) *fx.App { - o := make([]fx.Option, 1, len(opts)+1) - o[0] = Logger() - return fx.New(append(o, opts...)...) -} - -func Logger() fx.Option { - return fx.Provide() -} diff --git a/core/http/context.go b/core/fiber/context.go similarity index 75% rename from core/http/context.go rename to core/fiber/context.go index 6ac1098..6ebfaca 100644 --- a/core/http/context.go +++ b/core/fiber/context.go @@ -1,15 +1,15 @@ -package http +package fiber import ( "context" - "github.com/gofiber/fiber/v2" + gofiber "github.com/gofiber/fiber/v2" "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" ) -func Context() fiber.Handler { - return func(ctx *fiber.Ctx) error { +func Context() gofiber.Handler { + return func(ctx *gofiber.Ctx) error { c, cancel := context.WithCancel(context.Background()) ctx.Locals(constants.CancelFuncContextKey, cancel) diff --git a/core/http/context_test.go b/core/fiber/context_test.go similarity index 59% rename from core/http/context_test.go rename to core/fiber/context_test.go index ced1179..05470d6 100644 --- a/core/http/context_test.go +++ b/core/fiber/context_test.go @@ -1,25 +1,25 @@ -package http_test +package fiber_test import ( "testing" - "github.com/gofiber/fiber/v2" + gofiber "github.com/gofiber/fiber/v2" "github.com/valyala/fasthttp" "github.com/stretchr/testify/require" "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" - "github.com/BrosSquad/GoFiber-Boilerplate/core/http" + "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber" ) func TestContextMiddleware(t *testing.T) { t.Parallel() assert := require.New(t) - app := fiber.New() - app.Use(http.Context()) - app.Get("/", func(ctx *fiber.Ctx) error { - return ctx.SendStatus(fiber.StatusOK) + app := gofiber.New() + app.Use(fiber.Context()) + app.Get("/", func(ctx *gofiber.Ctx) error { + return ctx.SendStatus(gofiber.StatusOK) }) h := app.Handler() diff --git a/core/http/error.go b/core/fiber/error.go similarity index 58% rename from core/http/error.go rename to core/fiber/error.go index 0243d44..c2140e1 100644 --- a/core/http/error.go +++ b/core/fiber/error.go @@ -1,9 +1,9 @@ -package http +package fiber import ( "errors" - "github.com/gofiber/fiber/v2" + gofiber "github.com/gofiber/fiber/v2" "github.com/invopop/validation" "github.com/rs/zerolog" "go.mongodb.org/mongo-driver/bson/primitive" @@ -13,17 +13,17 @@ type ErrorResponse struct { Message any `json:"message,omitempty"` } -func Error(logger zerolog.Logger) fiber.ErrorHandler { - return func(c *fiber.Ctx, err error) error { - c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8) +func Error(logger zerolog.Logger) gofiber.ErrorHandler { + return func(c *gofiber.Ctx, err error) error { + c.Set(gofiber.HeaderContentType, gofiber.MIMEApplicationJSONCharsetUTF8) if errors.Is(err, primitive.ErrInvalidHex) { - return c.Status(fiber.StatusBadRequest).JSON(ErrorResponse{ + return c.Status(gofiber.StatusBadRequest).JSON(ErrorResponse{ Message: "Invalid JSON Payload, check your input", }) } - var fiberErr *fiber.Error + var fiberErr *gofiber.Error if errors.As(err, &fiberErr) { return c.Status(fiberErr.Code).JSON(ErrorResponse{ @@ -34,9 +34,7 @@ func Error(logger zerolog.Logger) fiber.ErrorHandler { { var validationErr validation.Errors if errors.As(err, &validationErr) { - return c.Status(fiber.StatusUnprocessableEntity).JSON(fiber.Map{ - "errors": validationErr, - }) + return c.Status(gofiber.StatusUnprocessableEntity).JSON(validationErr) } } @@ -44,7 +42,7 @@ func Error(logger zerolog.Logger) fiber.ErrorHandler { Str("path", c.Route().Path). Msg("Failed to process request") - return c.Status(fiber.StatusInternalServerError).JSON(ErrorResponse{ + return c.Status(gofiber.StatusInternalServerError).JSON(ErrorResponse{ Message: "An error has occurred!", }) } diff --git a/core/http/error_test.go b/core/fiber/error_test.go similarity index 99% rename from core/http/error_test.go rename to core/fiber/error_test.go index f70cee1..61de298 100644 --- a/core/http/error_test.go +++ b/core/fiber/error_test.go @@ -1,4 +1,4 @@ -package http_test +package fiber_test // func setupErrorHandlerApp(t *testing.T) (*fiber.App, *zltest.Tester) { // // v, translations := testing_utils.GetValidator() diff --git a/core/fiber/fiberfx/fiberfx.go b/core/fiber/fiberfx/fiberfx.go new file mode 100644 index 0000000..066e880 --- /dev/null +++ b/core/fiber/fiberfx/fiberfx.go @@ -0,0 +1,202 @@ +package fiberfx + +import ( + "context" + "fmt" + "net" + "net/http" + "time" + + corehttp "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber" + "github.com/rs/zerolog" + + "github.com/gofiber/fiber/v2" + "github.com/samber/lo" + "go.uber.org/fx" +) + +type ( + RoutesFx func(appName string) fx.Option + RouteFx func(appName, prefix string) fx.Option + + routerCallbacks map[string]func(fiber.Router) +) + +func routerCallbacksName(appName string) string { + return fmt.Sprintf(`name:"fiber-%s-router-callbacks"`, appName) +} + +func RunApp(addr, appName string, shutdownTimeout time.Duration) fx.Option { + return fx.Invoke(fx.Annotate(func(app *fiber.App, logger zerolog.Logger, lc fx.Lifecycle) error { + listener, err := net.Listen("tcp", addr) + if err != nil { + return err + } + + lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + logger.Info().Str("app", appName).Msg("Starting Fiber Application") + go func() { _ = app.Listener(listener) }() + return nil + }, + OnStop: func(ctx context.Context) error { + newCtx, cancel := context.WithTimeout(ctx, shutdownTimeout) + defer cancel() + logger.Info().Str("app", appName).Msg("Stopping Fiber Application") + return app.ShutdownWithContext(newCtx) + }, + }) + + return nil + }, fx.ParamTags( + GetFiberApp(appName), + `optional:"true"`, + ))) +} + +func App(appName string, displayInfo bool, routes RoutesFx) fx.Option { + return fx.Module(fmt.Sprintf("fiber-%s", appName), + fx.Provide(fx.Annotate( + func() routerCallbacks { + return make(routerCallbacks) + }, + fx.ResultTags(routerCallbacksName(appName)), + )), + routes(appName), + + fx.Provide(fx.Annotate( + func(logger zerolog.Logger, handlers []route, cb routerCallbacks, lc fx.Lifecycle) *fiber.App { + app := corehttp.CreateApplication(appName, displayInfo, logger) + + for _, r := range handlers { + router := app.Group(r.Prefix) + + cb, exists := cb[r.Prefix] + if exists { + cb(router) + } + + route := router.Add(r.Method, r.Path, r.Handler) + if r.CallBack != nil { + r.CallBack(route) + } + } + + return app + }, + fx.ParamTags( + `optional:"true"`, + fiberHandlerRoutes(appName), + routerCallbacksName(appName), + ), + fx.ResultTags(GetFiberApp(appName)), + )), + ) +} + +func Get(path string, handler any) RouteFx { + return Route(http.MethodGet, path, handler) +} + +func GetWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { + return RouteWithRouterCallback(http.MethodGet, path, cb, handler) +} + +func Post(path string, handler any) RouteFx { + return Route(http.MethodPost, path, handler) +} + +func PostWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { + return RouteWithRouterCallback(http.MethodPost, path, cb, handler) +} + +func Put(path string, handler any) RouteFx { + return Route(http.MethodPut, path, handler) +} + +func PutWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { + return RouteWithRouterCallback(http.MethodPut, path, cb, handler) +} + +func Patch(path string, handler any) RouteFx { + return Route(http.MethodPatch, path, handler) +} + +func PatchWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { + return RouteWithRouterCallback(http.MethodPatch, path, cb, handler) +} + +func Delete(path string, handler any) RouteFx { + return Route(http.MethodDelete, path, handler) +} + +func DeleteWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { + return RouteWithRouterCallback(http.MethodDelete, path, cb, handler) +} + +func Route(method, path string, handler any) RouteFx { + return RouteWithRouterCallback(method, path, nil, handler) +} + +type route struct { + Handler fiber.Handler + CallBack func(fiber.Router) + Prefix string + Method string + Path string +} + +func RouteWithRouterCallback(method, path string, cb func(fiber.Router), handler any) RouteFx { + return func(appName, prefix string) fx.Option { + return fx.Provide( + fx.Annotate( + handler, + fx.ResultTags(fiberHandlers(appName, method, prefix, path)), + ), + fx.Annotate( + func(handler fiber.Handler) route { + return route{ + Prefix: prefix, + Method: method, + Path: path, + Handler: handler, + CallBack: cb, + } + }, + fx.ParamTags(fiberHandlers(appName, method, prefix, path)), + fx.ResultTags(fiberHandlerRoutes(appName)), + ), + ) + } +} + +func fiberHandlers(appName, method, prefix, path string) string { + return fmt.Sprintf(`name:"fiber-handler-%s-%s-%s-%s"`, appName, method, prefix, path) +} + +func fiberHandlerRoutes(appName string) string { + return fmt.Sprintf(`group:"fiber-handlers-%s"`, appName) +} + +func GetFiberApp(appName string) string { + return fmt.Sprintf(`name:"fiber-%s"`, appName) +} + +func Routes(prefix string, cb func(fiber.Router), routes ...RouteFx) RoutesFx { + return func(appName string) fx.Option { + options := lo.Map(routes, func(fn RouteFx, _ int) fx.Option { + return fn(appName, prefix) + }) + + if cb == nil { + return fx.Options(options...) + } + + return fx.Options(append(options, fx.Invoke(fx.Annotate( + func(callbacks routerCallbacks) { + callbacks[prefix] = cb + }, + fx.ParamTags(routerCallbacksName(appName)), + )))...) + } +} diff --git a/core/http/http.go b/core/fiber/http.go similarity index 61% rename from core/http/http.go rename to core/fiber/http.go index 15e4638..a860507 100644 --- a/core/http/http.go +++ b/core/fiber/http.go @@ -1,24 +1,18 @@ -package http +package fiber import ( "encoding/json" "fmt" "net" - "github.com/BrosSquad/GoFiber-Boilerplate/app/container" - "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" - "github.com/gofiber/fiber/v2" + gofiber "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/recover" - "github.com/gofiber/fiber/v2/middleware/requestid" fiberutils "github.com/gofiber/fiber/v2/utils" - "github.com/nano-interactive/go-utils" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) -type Routes func(fiber.Router, *container.Container) - -func RunServer(ip string, port int, app *fiber.App) { +func RunServer(ip string, port int, app *gofiber.App) { addr := fmt.Sprintf("%s:%d", ip, port) listener, err := net.Listen("tcp", addr) @@ -39,13 +33,13 @@ func RunServer(ip string, port int, app *fiber.App) { } } -func CreateApplication(appName string, displayInfo bool) *fiber.App { +func CreateApplication(appName string, displayInfo bool, logger zerolog.Logger) *gofiber.App { var ( jsonEncoder fiberutils.JSONMarshal = json.Marshal jsonDecoder fiberutils.JSONUnmarshal = json.Unmarshal ) - staticConfig := fiber.Config{ + staticConfig := gofiber.Config{ StrictRouting: true, EnablePrintRoutes: false, Prefork: false, @@ -54,21 +48,15 @@ func CreateApplication(appName string, displayInfo bool) *fiber.App { DisableHeaderNormalizing: false, DisablePreParseMultipartForm: true, AppName: appName, - ErrorHandler: Error(zerolog.Nop()), + ErrorHandler: Error(logger), JSONEncoder: jsonEncoder, JSONDecoder: jsonDecoder, } - app := fiber.New(staticConfig) + app := gofiber.New(staticConfig) app.Use(recover.New()) app.Use(Context()) - app.Use(requestid.New(requestid.Config{ - Generator: func() string { - return utils.RandomString(32) - }, - ContextKey: constants.RequestIDContextKey, - })) return app } diff --git a/core/fiber/notfound.go b/core/fiber/notfound.go new file mode 100644 index 0000000..bafe461 --- /dev/null +++ b/core/fiber/notfound.go @@ -0,0 +1,22 @@ +package fiber + +import ( + gofiber "github.com/gofiber/fiber/v2" +) + +const pageNotFoundMessage = "Page is not found" + +func NotFound() gofiber.Handler { + return func(ctx *gofiber.Ctx) error { + accept := ctx.Get(gofiber.HeaderAccept, gofiber.MIMEApplicationJSONCharsetUTF8) + + switch accept { + case gofiber.MIMEApplicationJSONCharsetUTF8, gofiber.MIMEApplicationJSON: + return ctx. + Status(gofiber.StatusNotFound). + JSON(ErrorResponse{Message: pageNotFoundMessage}) + } + + return ctx.SendString(pageNotFoundMessage) + } +} diff --git a/core/http/notfound_test.go b/core/fiber/notfound_test.go similarity index 97% rename from core/http/notfound_test.go rename to core/fiber/notfound_test.go index 9f9052b..6fbdaa1 100644 --- a/core/http/notfound_test.go +++ b/core/fiber/notfound_test.go @@ -1,4 +1,4 @@ -package http_test +package fiber_test // func setupNotFoundApplication() *fiber.App { // app := fiber.New() diff --git a/core/http/httpfx/httpfx.go b/core/http/httpfx/httpfx.go deleted file mode 100644 index 79173c1..0000000 --- a/core/http/httpfx/httpfx.go +++ /dev/null @@ -1,103 +0,0 @@ -package httpfx - -import ( - "context" - "fmt" - "net/http" - "time" - - corehttp "github.com/BrosSquad/GoFiber-Boilerplate/core/http" - - "github.com/gofiber/fiber/v2" - "github.com/samber/lo" - "go.uber.org/fx" -) - -func Module(addr, appName string, displayInfo bool, routes ...fx.Option) fx.Option { - return fx.Module("fiber-app", - append(routes, - fx.Provide(func(lc fx.Lifecycle) *fiber.App { - app := corehttp.CreateApplication(appName, displayInfo) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - go func() { - _ = app.Listen(addr) - }() - - return nil - }, - OnStop: func(ctx context.Context) error { - newCtx, cancel := context.WithTimeout(ctx, 1*time.Second) - defer cancel() - return app.ShutdownWithContext(newCtx) - }, - }) - - return app - }), - )..., - ) -} - -func Get(path string, handlers ...any) func(string) fx.Option { - return Route(http.MethodGet, path, handlers...) -} - -func Post(path string, handlers ...any) func(string) fx.Option { - return Route(http.MethodPost, path, handlers...) -} - -func Put(path string, handlers ...any) func(string) fx.Option { - return Route(http.MethodPut, path, handlers...) -} - -func Patch(path string, handlers ...any) func(string) fx.Option { - return Route(http.MethodPatch, path, handlers...) -} - -func Delete(path string, handlers ...any) func(string) fx.Option { - return Route(http.MethodDelete, path, handlers...) -} - -func Route(method, path string, handlers ...any) func(string) fx.Option { - return func(prefix string) fx.Option { - return fx.Module(fmt.Sprintf("route-%s-%s%s", method, prefix, path), append( - lo.Map(handlers, func(a any, _ int) fx.Option { - return fx.Provide(fx.Annotate( - a, - fx.ResultTags(fmt.Sprintf(`group:"handlers-%s-%s%s"`, method, prefix, path)), - )) - }), - fx.Invoke( - fx.Annotate( - func(router fiber.Router, handlers []fiber.Handler) { - router.Add(method, path, handlers...) - }, - fx.ParamTags( - fmt.Sprintf(`name:"router-%s"`, prefix), - fmt.Sprintf(`group:"handlers-%s-%s%s"`, method, prefix, path), - ), - ), - ), - )...) - } -} - -func Routes(prefix string, routes ...func(string) fx.Option) fx.Option { - return fx.Module( - fmt.Sprintf("routes-%s", prefix), - append( - lo.Map(routes, func(fn func(string) fx.Option, _ int) fx.Option { - return fn(prefix) - }), - fx.Provide( - fx.Annotate( - func(app *fiber.App) fiber.Router { - return app.Group(prefix) - }, - fx.ResultTags(fmt.Sprintf(`name:"router-%s"`, prefix)), - ), - ), - )..., - ) -} diff --git a/core/http/notfound.go b/core/http/notfound.go deleted file mode 100644 index 87d0b8b..0000000 --- a/core/http/notfound.go +++ /dev/null @@ -1,22 +0,0 @@ -package http - -import ( - "github.com/gofiber/fiber/v2" -) - -const pageNotFoundMessage = "Page is not found" - -func NotFound() fiber.Handler { - return func(ctx *fiber.Ctx) error { - accept := ctx.Get(fiber.HeaderAccept, fiber.MIMEApplicationJSONCharsetUTF8) - - switch accept { - case fiber.MIMEApplicationJSONCharsetUTF8, fiber.MIMEApplicationJSON: - return ctx. - Status(fiber.StatusNotFound). - JSON(ErrorResponse{Message: pageNotFoundMessage}) - } - - return ctx.SendString(pageNotFoundMessage) - } -} diff --git a/core/loggerfx/loggerfx.go b/core/loggerfx/loggerfx.go new file mode 100644 index 0000000..657e567 --- /dev/null +++ b/core/loggerfx/loggerfx.go @@ -0,0 +1,118 @@ +package loggerfx + +import ( + "errors" + "fmt" + "io" + "os" + + "github.com/nano-interactive/go-utils" + appLogger "github.com/nano-interactive/go-utils/logging" + "github.com/rs/zerolog" + "github.com/rs/zerolog/pkgerrors" + "go.uber.org/fx" +) + +type ( + SinkType int + Sink struct { + Level string + Args []any + Type SinkType + PrettyPrint bool + } +) + +const ( + Stdout SinkType = iota + Stderr + File +) + +var ( + ErrArgForFileNotProvided = errors.New("output file path must be provided for SINK FILE") + ErrUnexpectedArgForFileType = errors.New("invalid type for the sink FILE => expected string or fmt.Stringer") + ErrInvalidSinkType = errors.New("invalid sink type") +) + +func Module(sink Sink) fx.Option { + return fx.Module("ZerologLogger", fx.Provide( + func(lc fx.Lifecycle) (zerolog.Logger, error) { + w, closer, err := getWriter(sink) + if err != nil { + return zerolog.Logger{}, err + } + + if closer != nil { + lc.Append(fx.StopHook(closer)) + } + + return appLogger.New(sink.Level, sink.PrettyPrint). + Output(w). + With(). + Stack(). + Logger(), nil + }), + fx.Invoke(func(lc fx.Lifecycle) error { + w, closer, err := getWriter(sink) + if err != nil { + return err + } + + if closer != nil { + lc.Append(fx.StopHook(closer)) + } + + //nolint:all + zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack + appLogger.ConfigureDefaultLogger(sink.Level, sink.PrettyPrint, w) + + return nil + }), + ) +} + +func getWriter(sink Sink) (io.Writer, func() error, error) { + switch sink.Type { + case Stdout: + if sink.PrettyPrint { + return zerolog.NewConsoleWriter(), nil, nil + } + + return os.Stdout, nil, nil + case Stderr: + if sink.PrettyPrint { + return zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) { + w.Out = os.Stderr + }), nil, nil + } + + return os.Stderr, nil, nil + case File: + if len(sink.Args) == 0 { + return nil, nil, ErrArgForFileNotProvided + } + + var path string + + switch val := sink.Args[0].(type) { + case string: + path = val + case fmt.Stringer: + path = val.String() + default: + return nil, nil, ErrUnexpectedArgForFileType + } + + f, err := utils.CreateLogFile(path) + if err != nil { + return nil, nil, err + } + + return f, func() error { + return f.Close() + }, nil + default: + return nil, nil, ErrInvalidSinkType + } +} diff --git a/go.mod b/go.mod index ea2a60e..2e96f73 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/BrosSquad/GoFiber-Boilerplate go 1.21 require ( - github.com/gofiber/fiber/v2 v2.50.0 + github.com/gofiber/fiber/v2 v2.51.0 github.com/invopop/validation v0.3.0 github.com/nano-interactive/go-utils v1.5.8 github.com/rs/zerolog v1.31.0 @@ -11,7 +11,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.17.0 github.com/stretchr/testify v1.8.4 - github.com/valyala/fasthttp v1.50.0 + github.com/valyala/fasthttp v1.51.0 go.mongodb.org/mongo-driver v1.13.0 go.uber.org/fx v1.20.1 ) @@ -20,24 +20,20 @@ require ( github.com/andybalholm/brotli v1.0.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gocql/gocql v1.6.0 // indirect - github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.4.0 // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.3 // 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.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/montanaflynn/stats v0.7.1 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rzajac/zltest v0.12.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/sagikazarmark/locafero v0.3.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -45,23 +41,16 @@ require ( github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/tanimutomo/sqlfile v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.15.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.14.0 // indirect golang.org/x/text v0.14.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // 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 262e658..e857a0f 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,6 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 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/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= @@ -47,10 +45,6 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -59,7 +53,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -79,13 +72,9 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT 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= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofiber/fiber/v2 v2.50.0 h1:ia0JaB+uw3GpNSCR5nvC5dsaxXjRU5OEu36aytx+zGw= -github.com/gofiber/fiber/v2 v2.50.0/go.mod h1:21eytvay9Is7S6z+OgPi7c7n4++tnClWmhpimVHMimw= +github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ= +github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -112,9 +101,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -148,8 +134,6 @@ github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -164,10 +148,11 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -187,8 +172,6 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= -github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/nano-interactive/go-utils v1.5.8 h1:TvUhYxhHjbF0BawXGWo4q/+p32ft9ZpKaq/Y+uuk4pc= github.com/nano-interactive/go-utils v1.5.8/go.mod h1:z+wk/heUyiXGMKcR+ZjMcZnXST8e61nsL9mKgDj9Emw= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= @@ -204,16 +187,12 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.25.0/go.mod h1:7KHcEGe0QZPOm2IE4Kpb5rTh6n1h2hIgS5OOnu1rUaI= github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/rzajac/zltest v0.12.0 h1:9WPX0UhhXG66iuRT9+jYSl9SAGyl+PmKsC4+UGKLJVU= -github.com/rzajac/zltest v0.12.0/go.mod h1:wZSsCw1RyFaEIfUOCUw8DiicX4U6yB1IZdOg8Uj0yDI= github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -237,10 +216,8 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= -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/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= @@ -249,28 +226,20 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tanimutomo/sqlfile v1.0.0 h1:8Nnkd1ra7vBDb7yrv4zvvEdto0vO5Yuegv87C6Tcyp8= -github.com/tanimutomo/sqlfile v1.0.0/go.mod h1:vdHiTAUB+JJn9lSFzv4iLGm54ghBOo444TthhTSvP4E= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e9M= -github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= -github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= @@ -296,14 +265,11 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= 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= @@ -339,7 +305,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -372,7 +337,6 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY 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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -394,10 +358,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -430,10 +391,8 @@ 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-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -506,7 +465,6 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/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.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -602,11 +560,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/main.go b/main.go index 34c1fca..b6cb803 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,6 @@ package main import ( - "github.com/spf13/cobra" - "github.com/BrosSquad/GoFiber-Boilerplate/app/commands" "github.com/BrosSquad/GoFiber-Boilerplate/app/constants" "github.com/BrosSquad/GoFiber-Boilerplate/core/cmd" @@ -11,7 +9,11 @@ import ( const Version = "0.0.1" func main() { - cmd.Execute(Version, []*cobra.Command{ + cmd.Execute( + Version, + constants.AppName, + constants.AppName, + constants.AppDescription, commands.Serve(), - }, constants.AppName, constants.AppName, constants.AppDescription) + ) } From b5cc55903f0597211fbb7616c30067cf54898f63 Mon Sep 17 00:00:00 2001 From: Dusan Malusev Date: Mon, 15 Jan 2024 18:50:48 +0100 Subject: [PATCH 4/4] feat: extract core module into separate github repository Signed-off-by: Dusan Malusev --- Dockerfile | 9 +- app/commands/serve.go | 13 +- app/handlers/handlers.go | 9 +- core/cmd/cmd.go | 25 -- core/configfx/configfx.go | 44 ---- core/constants/context.go | 11 - core/fiber/context.go | 28 -- core/fiber/context_test.go | 30 --- core/fiber/error.go | 49 ---- core/fiber/error_test.go | 96 ------- core/fiber/fiberfx/fiberfx.go | 202 --------------- core/fiber/http.go | 62 ----- core/fiber/notfound.go | 22 -- core/fiber/notfound_test.go | 30 --- core/loggerfx/loggerfx.go | 118 --------- go.mod | 41 ++- go.sum | 472 +++------------------------------- main.go | 7 +- 18 files changed, 71 insertions(+), 1197 deletions(-) delete mode 100644 core/cmd/cmd.go delete mode 100644 core/configfx/configfx.go delete mode 100644 core/constants/context.go delete mode 100644 core/fiber/context.go delete mode 100644 core/fiber/context_test.go delete mode 100644 core/fiber/error.go delete mode 100644 core/fiber/error_test.go delete mode 100644 core/fiber/fiberfx/fiberfx.go delete mode 100644 core/fiber/http.go delete mode 100644 core/fiber/notfound.go delete mode 100644 core/fiber/notfound_test.go delete mode 100644 core/loggerfx/loggerfx.go diff --git a/Dockerfile b/Dockerfile index 4940922..da40fd9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,7 @@ -FROM golang:1.20 as develop +ARG BASE_IMAGE="golang:1.21" +ARG PRODUCTION_IMAGE="alpine:3" + +FROM $BASE_IMAGE as develop RUN apt update && \ apt upgrade -y && \ @@ -24,7 +27,7 @@ EXPOSE 80 EXPOSE 5000 EXPOSE 3000 -FROM golang:1.20 as build +FROM $BASE_IMAGE as build ARG VERSION ARG APP_NAME @@ -37,7 +40,7 @@ RUN apt update && \ apt install make -y && \ make build VERSION=${VERSION} ENV=production APP_NAME=${APP_NAME} -FROM alpine:3 as production +FROM $PRODUCTION_IMAGE as production ARG APP_NAME diff --git a/app/commands/serve.go b/app/commands/serve.go index 46c0d2a..27d92ca 100644 --- a/app/commands/serve.go +++ b/app/commands/serve.go @@ -4,12 +4,13 @@ import ( "github.com/spf13/cobra" "go.uber.org/fx" - "github.com/BrosSquad/GoFiber-Boilerplate/app/config" - "github.com/BrosSquad/GoFiber-Boilerplate/app/constants" - "github.com/BrosSquad/GoFiber-Boilerplate/app/handlers" - "github.com/BrosSquad/GoFiber-Boilerplate/core/configfx" - "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber/fiberfx" - "github.com/BrosSquad/GoFiber-Boilerplate/core/loggerfx" + "github.com/dmalusev/uberfx-common/configfx" + "github.com/dmalusev/uberfx-common/fiber/fiberfx" + "github.com/dmalusev/uberfx-common/loggerfx" + + "github.com/dmalusev/GoFiber-Boilerplate/app/config" + "github.com/dmalusev/GoFiber-Boilerplate/app/constants" + "github.com/dmalusev/GoFiber-Boilerplate/app/handlers" ) func loggerSink(cfg *config.Logging) loggerfx.Sink { diff --git a/app/handlers/handlers.go b/app/handlers/handlers.go index 31924d5..2593302 100644 --- a/app/handlers/handlers.go +++ b/app/handlers/handlers.go @@ -1,14 +1,13 @@ package handlers import ( - "github.com/BrosSquad/GoFiber-Boilerplate/app/handlers/helloworld" - "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber/fiberfx" + "github.com/dmalusev/GoFiber-Boilerplate/app/handlers/helloworld" + "github.com/dmalusev/uberfx-common/fiber/fiberfx" ) func Handlers() fiberfx.RoutesFx { return fiberfx.Routes( - "/", - nil, - fiberfx.Get("/", helloworld.HelloWorld), + fiberfx.WithRoutes(fiberfx.Get("/", helloworld.HelloWorld)), + fiberfx.WithPrefix("/"), ) } diff --git a/core/cmd/cmd.go b/core/cmd/cmd.go deleted file mode 100644 index aff8cfb..0000000 --- a/core/cmd/cmd.go +++ /dev/null @@ -1,25 +0,0 @@ -package cmd - -import ( - "context" - - "github.com/rs/zerolog/log" - "github.com/spf13/cobra" -) - -func Execute(version string, use, short, long string, cmds ...*cobra.Command) { - rootCmd := &cobra.Command{ - Use: use, - Short: short, - Long: long, - Version: version, - } - - rootCmd.AddCommand(cmds...) - - if err := rootCmd.ExecuteContext(context.Background()); err != nil { - log.Fatal(). - Err(err). - Msg("Error while running command") - } -} diff --git a/core/configfx/configfx.go b/core/configfx/configfx.go deleted file mode 100644 index 66f4820..0000000 --- a/core/configfx/configfx.go +++ /dev/null @@ -1,44 +0,0 @@ -package configfx - -import ( - utilsconfig "github.com/nano-interactive/go-utils/config" - - "github.com/spf13/viper" - "go.uber.org/fx" -) - -func New[T any](appName string) (T, error) { - v, err := utilsconfig.NewWithModifier(utilsconfig.Config{ - ProjectName: appName, - Name: "config", - Type: "yaml", - Paths: []string{ - "$XDG_CONFIG_HOME/" + appName, - "/etc/" + appName, - ".", - }, - }) - if err != nil { - var t T - return t, err - } - - return NewWithViper[T](v) -} - -func NewWithViper[T any](v *viper.Viper) (T, error) { - var c T - - if err := v.Unmarshal(&c); err != nil { - return c, err - } - - return c, nil -} - -func Module[T any](cfg T) fx.Option { - return fx.Module( - "config", - fx.Supply(cfg), - ) -} diff --git a/core/constants/context.go b/core/constants/context.go deleted file mode 100644 index bfce0cb..0000000 --- a/core/constants/context.go +++ /dev/null @@ -1,11 +0,0 @@ -package constants - -type ContextKey string - -const ( - RequestIDContextKey ContextKey = "request_id" - CancelFuncContextKey ContextKey = "cancel" - CancelWillBeCalledContextKey ContextKey = "cancelFnWillBeCalled" - ContainerContextKey ContextKey = "container" - CancelContextKey ContextKey = "cancel" -) diff --git a/core/fiber/context.go b/core/fiber/context.go deleted file mode 100644 index 6ebfaca..0000000 --- a/core/fiber/context.go +++ /dev/null @@ -1,28 +0,0 @@ -package fiber - -import ( - "context" - - gofiber "github.com/gofiber/fiber/v2" - - "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" -) - -func Context() gofiber.Handler { - return func(ctx *gofiber.Ctx) error { - c, cancel := context.WithCancel(context.Background()) - - ctx.Locals(constants.CancelFuncContextKey, cancel) - ctx.SetUserContext(c) - - err := ctx.Next() - - cancelFnWillBeCalled := ctx.Locals(constants.CancelWillBeCalledContextKey) - - if cancelFnWillBeCalled == nil { - cancel() - } - - return err - } -} diff --git a/core/fiber/context_test.go b/core/fiber/context_test.go deleted file mode 100644 index 05470d6..0000000 --- a/core/fiber/context_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package fiber_test - -import ( - "testing" - - gofiber "github.com/gofiber/fiber/v2" - "github.com/valyala/fasthttp" - - "github.com/stretchr/testify/require" - - "github.com/BrosSquad/GoFiber-Boilerplate/core/constants" - "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber" -) - -func TestContextMiddleware(t *testing.T) { - t.Parallel() - - assert := require.New(t) - app := gofiber.New() - app.Use(fiber.Context()) - app.Get("/", func(ctx *gofiber.Ctx) error { - return ctx.SendStatus(gofiber.StatusOK) - }) - - h := app.Handler() - ctx := &fasthttp.RequestCtx{} - h(ctx) - - assert.NotNil(ctx.UserValue(constants.CancelFuncContextKey)) -} diff --git a/core/fiber/error.go b/core/fiber/error.go deleted file mode 100644 index c2140e1..0000000 --- a/core/fiber/error.go +++ /dev/null @@ -1,49 +0,0 @@ -package fiber - -import ( - "errors" - - gofiber "github.com/gofiber/fiber/v2" - "github.com/invopop/validation" - "github.com/rs/zerolog" - "go.mongodb.org/mongo-driver/bson/primitive" -) - -type ErrorResponse struct { - Message any `json:"message,omitempty"` -} - -func Error(logger zerolog.Logger) gofiber.ErrorHandler { - return func(c *gofiber.Ctx, err error) error { - c.Set(gofiber.HeaderContentType, gofiber.MIMEApplicationJSONCharsetUTF8) - - if errors.Is(err, primitive.ErrInvalidHex) { - return c.Status(gofiber.StatusBadRequest).JSON(ErrorResponse{ - Message: "Invalid JSON Payload, check your input", - }) - } - - var fiberErr *gofiber.Error - - if errors.As(err, &fiberErr) { - return c.Status(fiberErr.Code).JSON(ErrorResponse{ - Message: fiberErr.Message, - }) - } - - { - var validationErr validation.Errors - if errors.As(err, &validationErr) { - return c.Status(gofiber.StatusUnprocessableEntity).JSON(validationErr) - } - } - - logger.Error().Err(err). - Str("path", c.Route().Path). - Msg("Failed to process request") - - return c.Status(gofiber.StatusInternalServerError).JSON(ErrorResponse{ - Message: "An error has occurred!", - }) - } -} diff --git a/core/fiber/error_test.go b/core/fiber/error_test.go deleted file mode 100644 index 61de298..0000000 --- a/core/fiber/error_test.go +++ /dev/null @@ -1,96 +0,0 @@ -package fiber_test - -// func setupErrorHandlerApp(t *testing.T) (*fiber.App, *zltest.Tester) { -// // v, translations := testing_utils.GetValidator() - -// logger, loggerTest := nanotesting.NewAppTestLogger(t, zerolog.InfoLevel) - -// app := fiber.New(fiber.Config{ -// ErrorHandler: handlers.Error(logger, nil), -// }) - -// return app, v, loggerTest -// } - -// func TestErrorHandler_ReturnFiberError(t *testing.T) { -// t.Parallel() -// assert := require.New(t) - -// app, _, _ := setupErrorHandlerApp(t) - -// app.Get("/", func(ctx *fiber.Ctx) error { -// return fiber.ErrBadGateway -// }) - -// m := struct { -// Message string `json:"message"` -// }{} -// res := testing_utils.Get(app, "/") - -// assert.EqualValues(fiber.StatusBadGateway, res.StatusCode) -// assert.EqualValues(fiber.MIMEApplicationJSON, res.Header.Get(fiber.HeaderContentType)) -// assert.Nil(json.NewDecoder(res.Body).Decode(&m)) -// assert.NotEmpty(m.Message) -// } - -// func TestErrorHandler_InvalidPayloadError(t *testing.T) { -// t.Parallel() -// assert := require.New(t) - -// app, _, _ := setupErrorHandlerApp(t) -// app.Get("/", func(ctx *fiber.Ctx) error { -// return handlers.ErrInvalidPayload -// }) - -// res := testing_utils.Get(app, "/") - -// m := struct { -// Message string `json:"message"` -// }{} - -// assert.EqualValues(fiber.StatusBadRequest, res.StatusCode) -// assert.EqualValues(fiber.MIMEApplicationJSON, res.Header.Get(fiber.HeaderContentType)) -// assert.Nil(json.NewDecoder(res.Body).Decode(&m)) -// assert.NotEmpty(m.Message) -// assert.Equal(handlers.ErrInvalidPayload.Error(), m.Message) -// } - -// func TestErrorHandler_ValidationError(t *testing.T) { -// t.Parallel() -// assert := require.New(t) -// app, _, _ := setupErrorHandlerApp(t) -// app.Get("/", func(ctx *fiber.Ctx) error { -// return validator.ValidationErrors{} -// }) -// res, err := app.Test(httptest.NewRequest(http.MethodGet, "/", nil)) -// assert.Nil(err) -// assert.EqualValues(fiber.StatusUnprocessableEntity, res.StatusCode) -// assert.EqualValues(fiber.MIMEApplicationJSON, res.Header.Get(fiber.HeaderContentType)) -// } - -// func TestErrorHandler_InvalidValidationError(t *testing.T) { -// t.Parallel() -// assert := require.New(t) - -// app, _, _ := setupErrorHandlerApp(t) -// app.Get("/", func(ctx *fiber.Ctx) error { -// return &validator.InvalidValidationError{} -// }) -// res, err := app.Test(httptest.NewRequest(http.MethodGet, "/", nil)) -// assert.Nil(err) -// assert.EqualValues(fiber.StatusUnprocessableEntity, res.StatusCode) -// assert.EqualValues(fiber.MIMEApplicationJSON, res.Header.Get(fiber.HeaderContentType)) -// } - -// func TestErrorHandler_AnyError(t *testing.T) { -// t.Parallel() -// assert := require.New(t) -// app, _, _ := setupErrorHandlerApp(t) -// app.Get("/", func(ctx *fiber.Ctx) error { -// return errors.New("any other error") -// }) -// res, err := app.Test(httptest.NewRequest(http.MethodGet, "/", nil)) -// assert.Nil(err) -// assert.EqualValues(fiber.StatusInternalServerError, res.StatusCode) -// assert.EqualValues(fiber.MIMEApplicationJSON, res.Header.Get(fiber.HeaderContentType)) -// } diff --git a/core/fiber/fiberfx/fiberfx.go b/core/fiber/fiberfx/fiberfx.go deleted file mode 100644 index 066e880..0000000 --- a/core/fiber/fiberfx/fiberfx.go +++ /dev/null @@ -1,202 +0,0 @@ -package fiberfx - -import ( - "context" - "fmt" - "net" - "net/http" - "time" - - corehttp "github.com/BrosSquad/GoFiber-Boilerplate/core/fiber" - "github.com/rs/zerolog" - - "github.com/gofiber/fiber/v2" - "github.com/samber/lo" - "go.uber.org/fx" -) - -type ( - RoutesFx func(appName string) fx.Option - RouteFx func(appName, prefix string) fx.Option - - routerCallbacks map[string]func(fiber.Router) -) - -func routerCallbacksName(appName string) string { - return fmt.Sprintf(`name:"fiber-%s-router-callbacks"`, appName) -} - -func RunApp(addr, appName string, shutdownTimeout time.Duration) fx.Option { - return fx.Invoke(fx.Annotate(func(app *fiber.App, logger zerolog.Logger, lc fx.Lifecycle) error { - listener, err := net.Listen("tcp", addr) - if err != nil { - return err - } - - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - logger.Info().Str("app", appName).Msg("Starting Fiber Application") - go func() { _ = app.Listener(listener) }() - return nil - }, - OnStop: func(ctx context.Context) error { - newCtx, cancel := context.WithTimeout(ctx, shutdownTimeout) - defer cancel() - logger.Info().Str("app", appName).Msg("Stopping Fiber Application") - return app.ShutdownWithContext(newCtx) - }, - }) - - return nil - }, fx.ParamTags( - GetFiberApp(appName), - `optional:"true"`, - ))) -} - -func App(appName string, displayInfo bool, routes RoutesFx) fx.Option { - return fx.Module(fmt.Sprintf("fiber-%s", appName), - fx.Provide(fx.Annotate( - func() routerCallbacks { - return make(routerCallbacks) - }, - fx.ResultTags(routerCallbacksName(appName)), - )), - routes(appName), - - fx.Provide(fx.Annotate( - func(logger zerolog.Logger, handlers []route, cb routerCallbacks, lc fx.Lifecycle) *fiber.App { - app := corehttp.CreateApplication(appName, displayInfo, logger) - - for _, r := range handlers { - router := app.Group(r.Prefix) - - cb, exists := cb[r.Prefix] - if exists { - cb(router) - } - - route := router.Add(r.Method, r.Path, r.Handler) - if r.CallBack != nil { - r.CallBack(route) - } - } - - return app - }, - fx.ParamTags( - `optional:"true"`, - fiberHandlerRoutes(appName), - routerCallbacksName(appName), - ), - fx.ResultTags(GetFiberApp(appName)), - )), - ) -} - -func Get(path string, handler any) RouteFx { - return Route(http.MethodGet, path, handler) -} - -func GetWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { - return RouteWithRouterCallback(http.MethodGet, path, cb, handler) -} - -func Post(path string, handler any) RouteFx { - return Route(http.MethodPost, path, handler) -} - -func PostWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { - return RouteWithRouterCallback(http.MethodPost, path, cb, handler) -} - -func Put(path string, handler any) RouteFx { - return Route(http.MethodPut, path, handler) -} - -func PutWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { - return RouteWithRouterCallback(http.MethodPut, path, cb, handler) -} - -func Patch(path string, handler any) RouteFx { - return Route(http.MethodPatch, path, handler) -} - -func PatchWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { - return RouteWithRouterCallback(http.MethodPatch, path, cb, handler) -} - -func Delete(path string, handler any) RouteFx { - return Route(http.MethodDelete, path, handler) -} - -func DeleteWithRouterCallback(path string, cb func(fiber.Router), handler any) RouteFx { - return RouteWithRouterCallback(http.MethodDelete, path, cb, handler) -} - -func Route(method, path string, handler any) RouteFx { - return RouteWithRouterCallback(method, path, nil, handler) -} - -type route struct { - Handler fiber.Handler - CallBack func(fiber.Router) - Prefix string - Method string - Path string -} - -func RouteWithRouterCallback(method, path string, cb func(fiber.Router), handler any) RouteFx { - return func(appName, prefix string) fx.Option { - return fx.Provide( - fx.Annotate( - handler, - fx.ResultTags(fiberHandlers(appName, method, prefix, path)), - ), - fx.Annotate( - func(handler fiber.Handler) route { - return route{ - Prefix: prefix, - Method: method, - Path: path, - Handler: handler, - CallBack: cb, - } - }, - fx.ParamTags(fiberHandlers(appName, method, prefix, path)), - fx.ResultTags(fiberHandlerRoutes(appName)), - ), - ) - } -} - -func fiberHandlers(appName, method, prefix, path string) string { - return fmt.Sprintf(`name:"fiber-handler-%s-%s-%s-%s"`, appName, method, prefix, path) -} - -func fiberHandlerRoutes(appName string) string { - return fmt.Sprintf(`group:"fiber-handlers-%s"`, appName) -} - -func GetFiberApp(appName string) string { - return fmt.Sprintf(`name:"fiber-%s"`, appName) -} - -func Routes(prefix string, cb func(fiber.Router), routes ...RouteFx) RoutesFx { - return func(appName string) fx.Option { - options := lo.Map(routes, func(fn RouteFx, _ int) fx.Option { - return fn(appName, prefix) - }) - - if cb == nil { - return fx.Options(options...) - } - - return fx.Options(append(options, fx.Invoke(fx.Annotate( - func(callbacks routerCallbacks) { - callbacks[prefix] = cb - }, - fx.ParamTags(routerCallbacksName(appName)), - )))...) - } -} diff --git a/core/fiber/http.go b/core/fiber/http.go deleted file mode 100644 index a860507..0000000 --- a/core/fiber/http.go +++ /dev/null @@ -1,62 +0,0 @@ -package fiber - -import ( - "encoding/json" - "fmt" - "net" - - gofiber "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/recover" - fiberutils "github.com/gofiber/fiber/v2/utils" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" -) - -func RunServer(ip string, port int, app *gofiber.App) { - addr := fmt.Sprintf("%s:%d", ip, port) - - listener, err := net.Listen("tcp", addr) - if err != nil { - log. - Fatal(). - Err(err). - Msg("Error while creating net.Listener for HTTP Server") - } - - err = app.Listener(listener) - - if err != nil { - log. - Fatal(). - Err(err). - Msg("Cannot start Fiber HTTP Server") - } -} - -func CreateApplication(appName string, displayInfo bool, logger zerolog.Logger) *gofiber.App { - var ( - jsonEncoder fiberutils.JSONMarshal = json.Marshal - jsonDecoder fiberutils.JSONUnmarshal = json.Unmarshal - ) - - staticConfig := gofiber.Config{ - StrictRouting: true, - EnablePrintRoutes: false, - Prefork: false, - DisableStartupMessage: !displayInfo, - DisableDefaultDate: true, - DisableHeaderNormalizing: false, - DisablePreParseMultipartForm: true, - AppName: appName, - ErrorHandler: Error(logger), - JSONEncoder: jsonEncoder, - JSONDecoder: jsonDecoder, - } - - app := gofiber.New(staticConfig) - - app.Use(recover.New()) - app.Use(Context()) - - return app -} diff --git a/core/fiber/notfound.go b/core/fiber/notfound.go deleted file mode 100644 index bafe461..0000000 --- a/core/fiber/notfound.go +++ /dev/null @@ -1,22 +0,0 @@ -package fiber - -import ( - gofiber "github.com/gofiber/fiber/v2" -) - -const pageNotFoundMessage = "Page is not found" - -func NotFound() gofiber.Handler { - return func(ctx *gofiber.Ctx) error { - accept := ctx.Get(gofiber.HeaderAccept, gofiber.MIMEApplicationJSONCharsetUTF8) - - switch accept { - case gofiber.MIMEApplicationJSONCharsetUTF8, gofiber.MIMEApplicationJSON: - return ctx. - Status(gofiber.StatusNotFound). - JSON(ErrorResponse{Message: pageNotFoundMessage}) - } - - return ctx.SendString(pageNotFoundMessage) - } -} diff --git a/core/fiber/notfound_test.go b/core/fiber/notfound_test.go deleted file mode 100644 index 6fbdaa1..0000000 --- a/core/fiber/notfound_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package fiber_test - -// func setupNotFoundApplication() *fiber.App { -// app := fiber.New() - -// app.Use(handlers.NotFound()) - -// return app -// } - -// func TestNotFound_JsonResponse(t *testing.T) { -// t.Parallel() -// assert := require.New(t) - -// app := setupNotFoundApplication() - -// res := testing_utils.Get(app, "/", testing_utils.WithHeaders(http.Header{ -// fiber.HeaderAccept: []string{fiber.MIMEApplicationJSONCharsetUTF8}, -// })) - -// assert.Equal(http.StatusNotFound, res.StatusCode) -// assert.Equal(fiber.MIMEApplicationJSON, res.Header.Get(fiber.HeaderContentType)) - -// var errRes handlers.ErrorResponse -// _ = json.NewDecoder(res.Body).Decode(&errRes) - -// assert.EqualValues(handlers.ErrorResponse{ -// Message: "Page is not found", -// }, errRes) -// } diff --git a/core/loggerfx/loggerfx.go b/core/loggerfx/loggerfx.go deleted file mode 100644 index 657e567..0000000 --- a/core/loggerfx/loggerfx.go +++ /dev/null @@ -1,118 +0,0 @@ -package loggerfx - -import ( - "errors" - "fmt" - "io" - "os" - - "github.com/nano-interactive/go-utils" - appLogger "github.com/nano-interactive/go-utils/logging" - "github.com/rs/zerolog" - "github.com/rs/zerolog/pkgerrors" - "go.uber.org/fx" -) - -type ( - SinkType int - Sink struct { - Level string - Args []any - Type SinkType - PrettyPrint bool - } -) - -const ( - Stdout SinkType = iota - Stderr - File -) - -var ( - ErrArgForFileNotProvided = errors.New("output file path must be provided for SINK FILE") - ErrUnexpectedArgForFileType = errors.New("invalid type for the sink FILE => expected string or fmt.Stringer") - ErrInvalidSinkType = errors.New("invalid sink type") -) - -func Module(sink Sink) fx.Option { - return fx.Module("ZerologLogger", fx.Provide( - func(lc fx.Lifecycle) (zerolog.Logger, error) { - w, closer, err := getWriter(sink) - if err != nil { - return zerolog.Logger{}, err - } - - if closer != nil { - lc.Append(fx.StopHook(closer)) - } - - return appLogger.New(sink.Level, sink.PrettyPrint). - Output(w). - With(). - Stack(). - Logger(), nil - }), - fx.Invoke(func(lc fx.Lifecycle) error { - w, closer, err := getWriter(sink) - if err != nil { - return err - } - - if closer != nil { - lc.Append(fx.StopHook(closer)) - } - - //nolint:all - zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack - appLogger.ConfigureDefaultLogger(sink.Level, sink.PrettyPrint, w) - - return nil - }), - ) -} - -func getWriter(sink Sink) (io.Writer, func() error, error) { - switch sink.Type { - case Stdout: - if sink.PrettyPrint { - return zerolog.NewConsoleWriter(), nil, nil - } - - return os.Stdout, nil, nil - case Stderr: - if sink.PrettyPrint { - return zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) { - w.Out = os.Stderr - }), nil, nil - } - - return os.Stderr, nil, nil - case File: - if len(sink.Args) == 0 { - return nil, nil, ErrArgForFileNotProvided - } - - var path string - - switch val := sink.Args[0].(type) { - case string: - path = val - case fmt.Stringer: - path = val.String() - default: - return nil, nil, ErrUnexpectedArgForFileType - } - - f, err := utils.CreateLogFile(path) - if err != nil { - return nil, nil, err - } - - return f, func() error { - return f.Close() - }, nil - default: - return nil, nil, ErrInvalidSinkType - } -} diff --git a/go.mod b/go.mod index 2e96f73..f9c4e79 100644 --- a/go.mod +++ b/go.mod @@ -1,56 +1,51 @@ -module github.com/BrosSquad/GoFiber-Boilerplate +module github.com/dmalusev/GoFiber-Boilerplate go 1.21 require ( - github.com/gofiber/fiber/v2 v2.51.0 - github.com/invopop/validation v0.3.0 - github.com/nano-interactive/go-utils v1.5.8 + github.com/dmalusev/uberfx-common v1.0.0 + github.com/gofiber/fiber/v2 v2.52.0 github.com/rs/zerolog v1.31.0 - github.com/samber/lo v1.38.1 github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.17.0 - github.com/stretchr/testify v1.8.4 - github.com/valyala/fasthttp v1.51.0 - go.mongodb.org/mongo-driver v1.13.0 go.uber.org/fx v1.20.1 ) require ( - github.com/andybalholm/brotli v1.0.6 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/andybalholm/brotli v1.1.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.5.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/klauspost/compress v1.17.3 // indirect + github.com/invopop/validation v0.3.0 // indirect + github.com/klauspost/compress v1.17.4 // 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.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/nano-interactive/go-utils v1.8.0 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect - github.com/sagikazarmark/locafero v0.3.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/samber/lo v1.39.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.18.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - go.uber.org/atomic v1.11.0 // indirect + go.mongodb.org/mongo-driver v1.13.1 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/sys v0.14.0 // indirect + golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // 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 e857a0f..0285b40 100644 --- a/go.sum +++ b/go.sum @@ -1,162 +1,42 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -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= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -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/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -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= -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/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= -github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/dmalusev/uberfx-common v1.0.0 h1:A4IUV7AJv/dvpmU46R8NokjFaXkkzO1Km/Eu+fFVXBM= +github.com/dmalusev/uberfx-common v1.0.0/go.mod h1:e9uDcUqj0xpy2k9kONSq4aUbBtf7VlVRlZ91ELCEvoo= +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.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -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= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ= -github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/gofiber/fiber/v2 v2.52.0 h1:S+qXi7y+/Pgvqq4DrSmREGiFwtB7Bu6+QFLuIHYw/UE= +github.com/gofiber/fiber/v2 v2.52.0/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -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= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/validation v0.3.0 h1:o260kbjXzoBO/ypXDSSrCLL7SxEFUXBsX09YTE9AxZw= github.com/invopop/validation v0.3.0/go.mod h1:qIBG6APYLp2Wu3/96p3idYjP8ffTKVmQBfKiZbw0Hts= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= -github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -172,53 +52,47 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/nano-interactive/go-utils v1.5.8 h1:TvUhYxhHjbF0BawXGWo4q/+p32ft9ZpKaq/Y+uuk4pc= -github.com/nano-interactive/go-utils v1.5.8/go.mod h1:z+wk/heUyiXGMKcR+ZjMcZnXST8e61nsL9mKgDj9Emw= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/nano-interactive/go-utils v1.8.0 h1:CM0TKjeP8nxn/07JgzQuDfnD/CUM+hWrhZ6MYi6BmJg= +github.com/nano-interactive/go-utils v1.8.0/go.mod h1:MuPBZ6oJSRsbNpUS05Lc2/IEFj+dLEzPQ4J8Ttm8lfY= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= -github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= +github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= +github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 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.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= -github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= 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.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= -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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -236,19 +110,9 @@ github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= -go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= +go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= @@ -262,320 +126,48 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o= +golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20210225134936-a50acf3fe073/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -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= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/main.go b/main.go index b6cb803..748aa78 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,10 @@ package main import ( - "github.com/BrosSquad/GoFiber-Boilerplate/app/commands" - "github.com/BrosSquad/GoFiber-Boilerplate/app/constants" - "github.com/BrosSquad/GoFiber-Boilerplate/core/cmd" + "github.com/dmalusev/uberfx-common/cmd" + + "github.com/dmalusev/GoFiber-Boilerplate/app/commands" + "github.com/dmalusev/GoFiber-Boilerplate/app/constants" ) const Version = "0.0.1"