diff --git a/cmd/gen/main.go b/cmd/gen/main.go new file mode 100644 index 0000000..bc99703 --- /dev/null +++ b/cmd/gen/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "octopus/internal/dal/model" + + "gorm.io/gen" +) + +// generate code. +func main() { + g := gen.NewGenerator(gen.Config{ + OutPath: "internal/dal/query", + Mode: gen.WithDefaultQuery | gen.WithoutContext, + }) + g.ApplyBasic( + new(model.Doc), + new(model.DocFolder), + ) + g.Execute() +} diff --git a/cmd/octopus/main.go b/cmd/octopus/main.go index a1baeca..9b2733e 100644 --- a/cmd/octopus/main.go +++ b/cmd/octopus/main.go @@ -3,6 +3,8 @@ package main import ( "octopus/cmd/octopus/scripts" "octopus/cmd/octopus/server" + "octopus/internal/dal" + "octopus/internal/dal/query" "github.com/rs/zerolog/log" @@ -17,6 +19,7 @@ var rootCmd = &cobra.Command{ func main() { rootCmd.AddCommand(server.CmdRun) rootCmd.AddCommand(scripts.CmdScripts) + query.SetDefault(dal.GetPostgres()) if err := rootCmd.Execute(); err != nil { log.Fatal().Err(err).Msg("Failed to execute root command") } diff --git a/go.mod b/go.mod index 551a75b..2128cb6 100644 --- a/go.mod +++ b/go.mod @@ -16,19 +16,19 @@ require ( github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/tencentyun/cos-go-sdk-v5 v0.7.41 github.com/tidwall/gjson v1.14.4 github.com/tidwall/sjson v1.2.5 gorm.io/driver/postgres v1.5.0 gorm.io/driver/sqlite v1.4.4 + gorm.io/gen v0.3.21 gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11 + gorm.io/plugin/dbresolver v1.3.0 ) require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/clbanning/mxj v1.8.4 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect @@ -36,9 +36,9 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.11.2 // indirect + github.com/go-sql-driver/mysql v1.6.0 // indirect github.com/golang-jwt/jwt/v4 v4.1.0 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/schema v1.2.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -67,7 +67,6 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/mozillazg/go-httpheader v0.3.1 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/perimeterx/marshmallow v1.1.4 // indirect github.com/philhofer/fwd v1.1.1 // indirect @@ -90,13 +89,18 @@ require ( github.com/valyala/fasthttp v1.44.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect golang.org/x/crypto v0.6.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.7.0 // indirect golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect golang.org/x/sys v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect + golang.org/x/tools v0.1.12 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/datatypes v1.0.7 // indirect + gorm.io/driver/mysql v1.4.0 // indirect + gorm.io/hints v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index b4bf928..f1cf786 100644 --- a/go.sum +++ b/go.sum @@ -36,9 +36,12 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX 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/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= 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/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -59,18 +62,23 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL 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/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= 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/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/denisenkom/go-mssqldb v0.12.2 h1:1OcPn5GBIobjWNd+8yjfHNIaFX14B1pWI3F9HZy5KXw= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -112,15 +120,23 @@ github.com/go-playground/validator v9.31.0+incompatible h1:UA72EPEogEnq76ehGdEDp github.com/go-playground/validator v9.31.0+incompatible/go.mod h1:yrEkQXlcI+PugkyDjY2bRrL/UBU4f3rvrgkN3V8JEig= github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.42.0 h1:Fnp7ybWvS+sjNQsFvkhf4G8OhXswvB6Vee8hM/LyS+8= github.com/gofiber/fiber/v2 v2.42.0/go.mod h1:3+SGNjqMh5VQH5Vz2Wdi43zTIV16ktlFd3x3R6O1Zlc= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= 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= @@ -162,9 +178,6 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -180,7 +193,6 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe 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.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -201,15 +213,53 @@ github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= github.com/jackc/pgx/v5 v5.3.0 h1:/NQi8KHMpKWHInxXesC8yD4DhkXPrVhmnwYkjp9AmBA= github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -234,6 +284,7 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -242,26 +293,39 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= @@ -272,7 +336,6 @@ github.com/minio/minio-go/v7 v7.0.49 h1:dE5DfOtnXMXCjr/HWI6zN9vCrY6Sv666qhhiwUMv github.com/minio/minio-go/v7 v7.0.49/go.mod h1:UI34MvQEiob3Cf/gGExGMmzugkM/tNgbFypNDy5LMVc= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -282,11 +345,9 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= -github.com/mozillazg/go-httpheader v0.3.1 h1:IRP+HFrMX2SlwY9riuio7raffXUpzAosHtZu25BSJok= -github.com/mozillazg/go-httpheader v0.3.1/go.mod h1:PuT8h0pw6efvp8ZeUec1Rs7dwjK08bt6gKSReGMqtdA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/neo-f/soda v0.2.6 h1:F5AlSOTwNiS1te9muEHAyQc1CwWw9IV22K3TsDsL7vU= @@ -298,6 +359,7 @@ github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0V github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -337,16 +399,23 @@ github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4= github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8= github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d h1:Q+gqLBOPkFGHyCJxXMRqtUgUbTjI8/Ze8vu8GGyNFwo= github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= @@ -365,6 +434,7 @@ github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -379,10 +449,6 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.194/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.194/go.mod h1:yrBKWhChnDqNz1xuXdSbWXG56XawEq0G5j1lg4VwBD4= -github.com/tencentyun/cos-go-sdk-v5 v0.7.41 h1:iU0Li/Np78H4SBna0ECQoF3mpgi6ImLXU+doGzPFXGc= -github.com/tencentyun/cos-go-sdk-v5 v0.7.41/go.mod h1:4dCEtLHGh8QPxHEkgq+nFaky7yZxQuYwgSJM87icDaw= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -409,19 +475,37 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= 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.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= 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-20190820162420-60c769a6c586/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-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -460,6 +544,7 @@ 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.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= 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= @@ -475,6 +560,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL 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-20190813141303-74dc4d7220e7/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= @@ -495,6 +581,7 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v 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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -532,7 +619,9 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190222072716-a9d3bda3a223/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-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -540,11 +629,14 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/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= @@ -584,6 +676,7 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -607,14 +700,18 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 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-20190425163242-31fd60d6bfdc/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-20190823170909-c4a336ef6a2f/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/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= @@ -622,6 +719,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn 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-20200103221440-774c71fcf114/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= @@ -648,7 +746,10 @@ 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.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= @@ -755,25 +856,49 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/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= +gorm.io/datatypes v1.0.7 h1:8NhJN4+annFjwV1WufDhFiPjdUvV1lSGUdg1UCjQIWY= +gorm.io/datatypes v1.0.7/go.mod h1:l9qkCuy0CdzDEop9HKUdcnC9gHC2sRlaFtHkTzsZRqg= +gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= +gorm.io/driver/mysql v1.4.0 h1:P+gpa0QGyNma39khn1vZMS/eXEJxTwHz4Q26NR4C8fw= +gorm.io/driver/mysql v1.4.0/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= +gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw= gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= +gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= +gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc= gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= +gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ= +gorm.io/driver/sqlserver v1.4.0 h1:3fjbsNkr/YqocSBW5CP16Lq6+APjRrWMzu7NbkXr9QU= +gorm.io/gen v0.3.21 h1:t8329wT4tW1ZZWOm7vn4LV6OIrz8a5zCg+p78ezt+rA= +gorm.io/gen v0.3.21/go.mod h1:aWgvoKdG9f8Des4TegSa0N5a+gwhGsFo0JJMaLwokvk= +gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11 h1:9qNbmu21nNThCNnF5i2R3kw2aL27U8ZwbzccNjOmW0g= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= +gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= +gorm.io/plugin/dbresolver v1.3.0 h1:uFDX3bIuH9Lhj5LY2oyqR/bU6pqWuDgas35NAPF4X3M= +gorm.io/plugin/dbresolver v1.3.0/go.mod h1:Pr7p5+JFlgDaiM6sOrli5olekJD16YRunMyA2S7ZfKk= 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= diff --git a/internal/dal/model/docs.go b/internal/dal/model/docs.go index f36fff4..c46d20e 100644 --- a/internal/dal/model/docs.go +++ b/internal/dal/model/docs.go @@ -75,7 +75,7 @@ func (d *Doc) PresignedURL(ctx context.Context) (*url.URL, error) { } func (*Doc) TableName() string { - return TableNameDocFolder + return TableNameDoc } func (d *Doc) BeforeCreate(*gorm.DB) error { d.ID = xid.New().String() diff --git a/internal/dal/query/doc_folders.gen.go b/internal/dal/query/doc_folders.gen.go new file mode 100644 index 0000000..cc5936b --- /dev/null +++ b/internal/dal/query/doc_folders.gen.go @@ -0,0 +1,354 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + "octopus/internal/dal/model" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" +) + +func newDocFolder(db *gorm.DB, opts ...gen.DOOption) docFolder { + _docFolder := docFolder{} + + _docFolder.docFolderDo.UseDB(db, opts...) + _docFolder.docFolderDo.UseModel(&model.DocFolder{}) + + tableName := _docFolder.docFolderDo.TableName() + _docFolder.ALL = field.NewAsterisk(tableName) + _docFolder.OrgID = field.NewString(tableName, "org_id") + _docFolder.ID = field.NewString(tableName, "id") + _docFolder.CreatedAt = field.NewTime(tableName, "created_at") + _docFolder.UpdatedAt = field.NewTime(tableName, "updated_at") + _docFolder.Name = field.NewString(tableName, "name") + _docFolder.IsDeletable = field.NewBool(tableName, "is_deletable") + _docFolder.IsEditable = field.NewBool(tableName, "is_editable") + _docFolder.Path = field.NewString(tableName, "path") + _docFolder.CreatedBy = field.NewString(tableName, "created_by") + + _docFolder.fillFieldMap() + + return _docFolder +} + +type docFolder struct { + docFolderDo + + ALL field.Asterisk + OrgID field.String + ID field.String + CreatedAt field.Time + UpdatedAt field.Time + Name field.String + IsDeletable field.Bool + IsEditable field.Bool + Path field.String + CreatedBy field.String + + fieldMap map[string]field.Expr +} + +func (d docFolder) Table(newTableName string) *docFolder { + d.docFolderDo.UseTable(newTableName) + return d.updateTableName(newTableName) +} + +func (d docFolder) As(alias string) *docFolder { + d.docFolderDo.DO = *(d.docFolderDo.As(alias).(*gen.DO)) + return d.updateTableName(alias) +} + +func (d *docFolder) updateTableName(table string) *docFolder { + d.ALL = field.NewAsterisk(table) + d.OrgID = field.NewString(table, "org_id") + d.ID = field.NewString(table, "id") + d.CreatedAt = field.NewTime(table, "created_at") + d.UpdatedAt = field.NewTime(table, "updated_at") + d.Name = field.NewString(table, "name") + d.IsDeletable = field.NewBool(table, "is_deletable") + d.IsEditable = field.NewBool(table, "is_editable") + d.Path = field.NewString(table, "path") + d.CreatedBy = field.NewString(table, "created_by") + + d.fillFieldMap() + + return d +} + +func (d *docFolder) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := d.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (d *docFolder) fillFieldMap() { + d.fieldMap = make(map[string]field.Expr, 9) + d.fieldMap["org_id"] = d.OrgID + d.fieldMap["id"] = d.ID + d.fieldMap["created_at"] = d.CreatedAt + d.fieldMap["updated_at"] = d.UpdatedAt + d.fieldMap["name"] = d.Name + d.fieldMap["is_deletable"] = d.IsDeletable + d.fieldMap["is_editable"] = d.IsEditable + d.fieldMap["path"] = d.Path + d.fieldMap["created_by"] = d.CreatedBy +} + +func (d docFolder) clone(db *gorm.DB) docFolder { + d.docFolderDo.ReplaceConnPool(db.Statement.ConnPool) + return d +} + +func (d docFolder) replaceDB(db *gorm.DB) docFolder { + d.docFolderDo.ReplaceDB(db) + return d +} + +type docFolderDo struct{ gen.DO } + +func (d docFolderDo) Debug() *docFolderDo { + return d.withDO(d.DO.Debug()) +} + +func (d docFolderDo) WithContext(ctx context.Context) *docFolderDo { + return d.withDO(d.DO.WithContext(ctx)) +} + +func (d docFolderDo) ReadDB() *docFolderDo { + return d.Clauses(dbresolver.Read) +} + +func (d docFolderDo) WriteDB() *docFolderDo { + return d.Clauses(dbresolver.Write) +} + +func (d docFolderDo) Session(config *gorm.Session) *docFolderDo { + return d.withDO(d.DO.Session(config)) +} + +func (d docFolderDo) Clauses(conds ...clause.Expression) *docFolderDo { + return d.withDO(d.DO.Clauses(conds...)) +} + +func (d docFolderDo) Returning(value interface{}, columns ...string) *docFolderDo { + return d.withDO(d.DO.Returning(value, columns...)) +} + +func (d docFolderDo) Not(conds ...gen.Condition) *docFolderDo { + return d.withDO(d.DO.Not(conds...)) +} + +func (d docFolderDo) Or(conds ...gen.Condition) *docFolderDo { + return d.withDO(d.DO.Or(conds...)) +} + +func (d docFolderDo) Select(conds ...field.Expr) *docFolderDo { + return d.withDO(d.DO.Select(conds...)) +} + +func (d docFolderDo) Where(conds ...gen.Condition) *docFolderDo { + return d.withDO(d.DO.Where(conds...)) +} + +func (d docFolderDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *docFolderDo { + return d.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) +} + +func (d docFolderDo) Order(conds ...field.Expr) *docFolderDo { + return d.withDO(d.DO.Order(conds...)) +} + +func (d docFolderDo) Distinct(cols ...field.Expr) *docFolderDo { + return d.withDO(d.DO.Distinct(cols...)) +} + +func (d docFolderDo) Omit(cols ...field.Expr) *docFolderDo { + return d.withDO(d.DO.Omit(cols...)) +} + +func (d docFolderDo) Join(table schema.Tabler, on ...field.Expr) *docFolderDo { + return d.withDO(d.DO.Join(table, on...)) +} + +func (d docFolderDo) LeftJoin(table schema.Tabler, on ...field.Expr) *docFolderDo { + return d.withDO(d.DO.LeftJoin(table, on...)) +} + +func (d docFolderDo) RightJoin(table schema.Tabler, on ...field.Expr) *docFolderDo { + return d.withDO(d.DO.RightJoin(table, on...)) +} + +func (d docFolderDo) Group(cols ...field.Expr) *docFolderDo { + return d.withDO(d.DO.Group(cols...)) +} + +func (d docFolderDo) Having(conds ...gen.Condition) *docFolderDo { + return d.withDO(d.DO.Having(conds...)) +} + +func (d docFolderDo) Limit(limit int) *docFolderDo { + return d.withDO(d.DO.Limit(limit)) +} + +func (d docFolderDo) Offset(offset int) *docFolderDo { + return d.withDO(d.DO.Offset(offset)) +} + +func (d docFolderDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *docFolderDo { + return d.withDO(d.DO.Scopes(funcs...)) +} + +func (d docFolderDo) Unscoped() *docFolderDo { + return d.withDO(d.DO.Unscoped()) +} + +func (d docFolderDo) Create(values ...*model.DocFolder) error { + if len(values) == 0 { + return nil + } + return d.DO.Create(values) +} + +func (d docFolderDo) CreateInBatches(values []*model.DocFolder, batchSize int) error { + return d.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (d docFolderDo) Save(values ...*model.DocFolder) error { + if len(values) == 0 { + return nil + } + return d.DO.Save(values) +} + +func (d docFolderDo) First() (*model.DocFolder, error) { + if result, err := d.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.DocFolder), nil + } +} + +func (d docFolderDo) Take() (*model.DocFolder, error) { + if result, err := d.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.DocFolder), nil + } +} + +func (d docFolderDo) Last() (*model.DocFolder, error) { + if result, err := d.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.DocFolder), nil + } +} + +func (d docFolderDo) Find() ([]*model.DocFolder, error) { + result, err := d.DO.Find() + return result.([]*model.DocFolder), err +} + +func (d docFolderDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.DocFolder, err error) { + buf := make([]*model.DocFolder, 0, batchSize) + err = d.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (d docFolderDo) FindInBatches(result *[]*model.DocFolder, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return d.DO.FindInBatches(result, batchSize, fc) +} + +func (d docFolderDo) Attrs(attrs ...field.AssignExpr) *docFolderDo { + return d.withDO(d.DO.Attrs(attrs...)) +} + +func (d docFolderDo) Assign(attrs ...field.AssignExpr) *docFolderDo { + return d.withDO(d.DO.Assign(attrs...)) +} + +func (d docFolderDo) Joins(fields ...field.RelationField) *docFolderDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Joins(_f)) + } + return &d +} + +func (d docFolderDo) Preload(fields ...field.RelationField) *docFolderDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Preload(_f)) + } + return &d +} + +func (d docFolderDo) FirstOrInit() (*model.DocFolder, error) { + if result, err := d.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.DocFolder), nil + } +} + +func (d docFolderDo) FirstOrCreate() (*model.DocFolder, error) { + if result, err := d.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.DocFolder), nil + } +} + +func (d docFolderDo) FindByPage(offset int, limit int) (result []*model.DocFolder, count int64, err error) { + result, err = d.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = d.Offset(-1).Limit(-1).Count() + return +} + +func (d docFolderDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = d.Count() + if err != nil { + return + } + + err = d.Offset(offset).Limit(limit).Scan(result) + return +} + +func (d docFolderDo) Scan(result interface{}) (err error) { + return d.DO.Scan(result) +} + +func (d docFolderDo) Delete(models ...*model.DocFolder) (result gen.ResultInfo, err error) { + return d.DO.Delete(models) +} + +func (d *docFolderDo) withDO(do gen.Dao) *docFolderDo { + d.DO = *do.(*gen.DO) + return d +} diff --git a/internal/dal/query/docs.gen.go b/internal/dal/query/docs.gen.go new file mode 100644 index 0000000..fd29549 --- /dev/null +++ b/internal/dal/query/docs.gen.go @@ -0,0 +1,435 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + "octopus/internal/dal/model" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" +) + +func newDoc(db *gorm.DB, opts ...gen.DOOption) doc { + _doc := doc{} + + _doc.docDo.UseDB(db, opts...) + _doc.docDo.UseModel(&model.Doc{}) + + tableName := _doc.docDo.TableName() + _doc.ALL = field.NewAsterisk(tableName) + _doc.OrgID = field.NewString(tableName, "org_id") + _doc.ID = field.NewString(tableName, "id") + _doc.CreatedAt = field.NewTime(tableName, "created_at") + _doc.UpdatedAt = field.NewTime(tableName, "updated_at") + _doc.Name = field.NewString(tableName, "name") + _doc.IsDeletable = field.NewBool(tableName, "is_deletable") + _doc.IsEditable = field.NewBool(tableName, "is_editable") + _doc.FolderID = field.NewString(tableName, "folder_id") + _doc.ObjectName = field.NewString(tableName, "object_name") + _doc.UploadedAt = field.NewTime(tableName, "uploaded_at") + _doc.CreatedBy = field.NewString(tableName, "created_by") + _doc.Folder = docBelongsToFolder{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Folder", "model.DocFolder"), + } + + _doc.fillFieldMap() + + return _doc +} + +type doc struct { + docDo + + ALL field.Asterisk + OrgID field.String + ID field.String + CreatedAt field.Time + UpdatedAt field.Time + Name field.String + IsDeletable field.Bool + IsEditable field.Bool + FolderID field.String + ObjectName field.String + UploadedAt field.Time + CreatedBy field.String + Folder docBelongsToFolder + + fieldMap map[string]field.Expr +} + +func (d doc) Table(newTableName string) *doc { + d.docDo.UseTable(newTableName) + return d.updateTableName(newTableName) +} + +func (d doc) As(alias string) *doc { + d.docDo.DO = *(d.docDo.As(alias).(*gen.DO)) + return d.updateTableName(alias) +} + +func (d *doc) updateTableName(table string) *doc { + d.ALL = field.NewAsterisk(table) + d.OrgID = field.NewString(table, "org_id") + d.ID = field.NewString(table, "id") + d.CreatedAt = field.NewTime(table, "created_at") + d.UpdatedAt = field.NewTime(table, "updated_at") + d.Name = field.NewString(table, "name") + d.IsDeletable = field.NewBool(table, "is_deletable") + d.IsEditable = field.NewBool(table, "is_editable") + d.FolderID = field.NewString(table, "folder_id") + d.ObjectName = field.NewString(table, "object_name") + d.UploadedAt = field.NewTime(table, "uploaded_at") + d.CreatedBy = field.NewString(table, "created_by") + + d.fillFieldMap() + + return d +} + +func (d *doc) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := d.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (d *doc) fillFieldMap() { + d.fieldMap = make(map[string]field.Expr, 12) + d.fieldMap["org_id"] = d.OrgID + d.fieldMap["id"] = d.ID + d.fieldMap["created_at"] = d.CreatedAt + d.fieldMap["updated_at"] = d.UpdatedAt + d.fieldMap["name"] = d.Name + d.fieldMap["is_deletable"] = d.IsDeletable + d.fieldMap["is_editable"] = d.IsEditable + d.fieldMap["folder_id"] = d.FolderID + d.fieldMap["object_name"] = d.ObjectName + d.fieldMap["uploaded_at"] = d.UploadedAt + d.fieldMap["created_by"] = d.CreatedBy + +} + +func (d doc) clone(db *gorm.DB) doc { + d.docDo.ReplaceConnPool(db.Statement.ConnPool) + return d +} + +func (d doc) replaceDB(db *gorm.DB) doc { + d.docDo.ReplaceDB(db) + return d +} + +type docBelongsToFolder struct { + db *gorm.DB + + field.RelationField +} + +func (a docBelongsToFolder) Where(conds ...field.Expr) *docBelongsToFolder { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a docBelongsToFolder) WithContext(ctx context.Context) *docBelongsToFolder { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a docBelongsToFolder) Model(m *model.Doc) *docBelongsToFolderTx { + return &docBelongsToFolderTx{a.db.Model(m).Association(a.Name())} +} + +type docBelongsToFolderTx struct{ tx *gorm.Association } + +func (a docBelongsToFolderTx) Find() (result *model.DocFolder, err error) { + return result, a.tx.Find(&result) +} + +func (a docBelongsToFolderTx) Append(values ...*model.DocFolder) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a docBelongsToFolderTx) Replace(values ...*model.DocFolder) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a docBelongsToFolderTx) Delete(values ...*model.DocFolder) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a docBelongsToFolderTx) Clear() error { + return a.tx.Clear() +} + +func (a docBelongsToFolderTx) Count() int64 { + return a.tx.Count() +} + +type docDo struct{ gen.DO } + +func (d docDo) Debug() *docDo { + return d.withDO(d.DO.Debug()) +} + +func (d docDo) WithContext(ctx context.Context) *docDo { + return d.withDO(d.DO.WithContext(ctx)) +} + +func (d docDo) ReadDB() *docDo { + return d.Clauses(dbresolver.Read) +} + +func (d docDo) WriteDB() *docDo { + return d.Clauses(dbresolver.Write) +} + +func (d docDo) Session(config *gorm.Session) *docDo { + return d.withDO(d.DO.Session(config)) +} + +func (d docDo) Clauses(conds ...clause.Expression) *docDo { + return d.withDO(d.DO.Clauses(conds...)) +} + +func (d docDo) Returning(value interface{}, columns ...string) *docDo { + return d.withDO(d.DO.Returning(value, columns...)) +} + +func (d docDo) Not(conds ...gen.Condition) *docDo { + return d.withDO(d.DO.Not(conds...)) +} + +func (d docDo) Or(conds ...gen.Condition) *docDo { + return d.withDO(d.DO.Or(conds...)) +} + +func (d docDo) Select(conds ...field.Expr) *docDo { + return d.withDO(d.DO.Select(conds...)) +} + +func (d docDo) Where(conds ...gen.Condition) *docDo { + return d.withDO(d.DO.Where(conds...)) +} + +func (d docDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *docDo { + return d.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) +} + +func (d docDo) Order(conds ...field.Expr) *docDo { + return d.withDO(d.DO.Order(conds...)) +} + +func (d docDo) Distinct(cols ...field.Expr) *docDo { + return d.withDO(d.DO.Distinct(cols...)) +} + +func (d docDo) Omit(cols ...field.Expr) *docDo { + return d.withDO(d.DO.Omit(cols...)) +} + +func (d docDo) Join(table schema.Tabler, on ...field.Expr) *docDo { + return d.withDO(d.DO.Join(table, on...)) +} + +func (d docDo) LeftJoin(table schema.Tabler, on ...field.Expr) *docDo { + return d.withDO(d.DO.LeftJoin(table, on...)) +} + +func (d docDo) RightJoin(table schema.Tabler, on ...field.Expr) *docDo { + return d.withDO(d.DO.RightJoin(table, on...)) +} + +func (d docDo) Group(cols ...field.Expr) *docDo { + return d.withDO(d.DO.Group(cols...)) +} + +func (d docDo) Having(conds ...gen.Condition) *docDo { + return d.withDO(d.DO.Having(conds...)) +} + +func (d docDo) Limit(limit int) *docDo { + return d.withDO(d.DO.Limit(limit)) +} + +func (d docDo) Offset(offset int) *docDo { + return d.withDO(d.DO.Offset(offset)) +} + +func (d docDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *docDo { + return d.withDO(d.DO.Scopes(funcs...)) +} + +func (d docDo) Unscoped() *docDo { + return d.withDO(d.DO.Unscoped()) +} + +func (d docDo) Create(values ...*model.Doc) error { + if len(values) == 0 { + return nil + } + return d.DO.Create(values) +} + +func (d docDo) CreateInBatches(values []*model.Doc, batchSize int) error { + return d.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (d docDo) Save(values ...*model.Doc) error { + if len(values) == 0 { + return nil + } + return d.DO.Save(values) +} + +func (d docDo) First() (*model.Doc, error) { + if result, err := d.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.Doc), nil + } +} + +func (d docDo) Take() (*model.Doc, error) { + if result, err := d.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.Doc), nil + } +} + +func (d docDo) Last() (*model.Doc, error) { + if result, err := d.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.Doc), nil + } +} + +func (d docDo) Find() ([]*model.Doc, error) { + result, err := d.DO.Find() + return result.([]*model.Doc), err +} + +func (d docDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Doc, err error) { + buf := make([]*model.Doc, 0, batchSize) + err = d.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (d docDo) FindInBatches(result *[]*model.Doc, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return d.DO.FindInBatches(result, batchSize, fc) +} + +func (d docDo) Attrs(attrs ...field.AssignExpr) *docDo { + return d.withDO(d.DO.Attrs(attrs...)) +} + +func (d docDo) Assign(attrs ...field.AssignExpr) *docDo { + return d.withDO(d.DO.Assign(attrs...)) +} + +func (d docDo) Joins(fields ...field.RelationField) *docDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Joins(_f)) + } + return &d +} + +func (d docDo) Preload(fields ...field.RelationField) *docDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Preload(_f)) + } + return &d +} + +func (d docDo) FirstOrInit() (*model.Doc, error) { + if result, err := d.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.Doc), nil + } +} + +func (d docDo) FirstOrCreate() (*model.Doc, error) { + if result, err := d.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.Doc), nil + } +} + +func (d docDo) FindByPage(offset int, limit int) (result []*model.Doc, count int64, err error) { + result, err = d.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = d.Offset(-1).Limit(-1).Count() + return +} + +func (d docDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = d.Count() + if err != nil { + return + } + + err = d.Offset(offset).Limit(limit).Scan(result) + return +} + +func (d docDo) Scan(result interface{}) (err error) { + return d.DO.Scan(result) +} + +func (d docDo) Delete(models ...*model.Doc) (result gen.ResultInfo, err error) { + return d.DO.Delete(models) +} + +func (d *docDo) withDO(do gen.Dao) *docDo { + d.DO = *do.(*gen.DO) + return d +} diff --git a/internal/dal/query/gen.go b/internal/dal/query/gen.go new file mode 100644 index 0000000..2265968 --- /dev/null +++ b/internal/dal/query/gen.go @@ -0,0 +1,107 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + "database/sql" + + "gorm.io/gorm" + + "gorm.io/gen" + + "gorm.io/plugin/dbresolver" +) + +var ( + Q = new(Query) + Doc *doc + DocFolder *docFolder +) + +func SetDefault(db *gorm.DB, opts ...gen.DOOption) { + *Q = *Use(db, opts...) + Doc = &Q.Doc + DocFolder = &Q.DocFolder +} + +func Use(db *gorm.DB, opts ...gen.DOOption) *Query { + return &Query{ + db: db, + Doc: newDoc(db, opts...), + DocFolder: newDocFolder(db, opts...), + } +} + +type Query struct { + db *gorm.DB + + Doc doc + DocFolder docFolder +} + +func (q *Query) Available() bool { return q.db != nil } + +func (q *Query) clone(db *gorm.DB) *Query { + return &Query{ + db: db, + Doc: q.Doc.clone(db), + DocFolder: q.DocFolder.clone(db), + } +} + +func (q *Query) ReadDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Read)) +} + +func (q *Query) WriteDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Write)) +} + +func (q *Query) ReplaceDB(db *gorm.DB) *Query { + return &Query{ + db: db, + Doc: q.Doc.replaceDB(db), + DocFolder: q.DocFolder.replaceDB(db), + } +} + +type queryCtx struct { + Doc *docDo + DocFolder *docFolderDo +} + +func (q *Query) WithContext(ctx context.Context) *queryCtx { + return &queryCtx{ + Doc: q.Doc.WithContext(ctx), + DocFolder: q.DocFolder.WithContext(ctx), + } +} + +func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error { + return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...) +} + +func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx { + return &QueryTx{q.clone(q.db.Begin(opts...))} +} + +type QueryTx struct{ *Query } + +func (q *QueryTx) Commit() error { + return q.db.Commit().Error +} + +func (q *QueryTx) Rollback() error { + return q.db.Rollback().Error +} + +func (q *QueryTx) SavePoint(name string) error { + return q.db.SavePoint(name).Error +} + +func (q *QueryTx) RollbackTo(name string) error { + return q.db.RollbackTo(name).Error +} diff --git a/internal/dal/repo/docs.go b/internal/dal/repo/docs.go deleted file mode 100644 index 1025c7e..0000000 --- a/internal/dal/repo/docs.go +++ /dev/null @@ -1,23 +0,0 @@ -package repo - -import ( - "octopus/internal/dal/model" - - "gorm.io/gorm" -) - -type DocFolderRepo struct { - db *gorm.DB -} - -func NewDocFolderRepo(db *gorm.DB) *DocFolderRepo { - return &DocFolderRepo{db} -} - -type DocFolderRepoInterface interface { - CreateFolder(folder *model.DocFolder) error -} - -// func (r *DocFolderRepo) CreateFolder(folder *model.DocFolder) error { -// return r.db.Create(folder).Error -// } diff --git a/internal/dal/storage.go b/internal/dal/storage.go index 2104547..05711d1 100644 --- a/internal/dal/storage.go +++ b/internal/dal/storage.go @@ -11,10 +11,10 @@ import ( var ( storageOnce sync.Once - storageInstance storage.ObjectStorage + storageInstance *storage.StorageMinio ) -func GetStorage() storage.ObjectStorage { +func GetStorage() *storage.StorageMinio { storageOnce.Do(initMinio) return storageInstance } diff --git a/internal/router/base.go b/internal/router/base.go index df26b05..c2834d1 100644 --- a/internal/router/base.go +++ b/internal/router/base.go @@ -6,7 +6,7 @@ import ( "github.com/rs/zerolog/log" ) -var userClaimsKey = struct{}{} +var userKey = struct{}{} func JWTRequired(c *fiber.Ctx) error { jwt := c.Get("Authorization") @@ -18,6 +18,6 @@ func JWTRequired(c *fiber.Ctx) error { log.Ctx(c.UserContext()).Error().Err(err).Msg("Unauthorized user") return fiber.ErrUnauthorized } - c.Locals(userClaimsKey, claims) + c.Locals(userKey, claims.User) return nil } diff --git a/internal/router/doc.go b/internal/router/doc.go index 91bb55a..bf3181f 100644 --- a/internal/router/doc.go +++ b/internal/router/doc.go @@ -73,13 +73,13 @@ func registerDocs(app *soda.Soda) { SetSummary("批量-文件删除"). AddJWTSecurity(JWTRequired). SetJSONRequestBody(schema.DocsBatchDelete{}). - AddJSONResponse(200, schema.DocsBatchResults{}).OK() + AddJSONResponse(200, schema.DocBatchResults{}).OK() app.Post("/docs/batch/update", nil). AddTags("文档管理"). SetSummary("批量-文件更新"). AddJWTSecurity(JWTRequired). SetJSONRequestBody(schema.DocsBatchUpdate{}). - AddJSONResponse(200, schema.DocsBatchResults{}).OK() + AddJSONResponse(200, schema.DocBatchResults{}).OK() // get presigned url for tmp file upload app.Get("/docs/upload-url", nil). AddTags("文档管理"). @@ -90,7 +90,7 @@ func registerDocs(app *soda.Soda) { } func ListDocs(c *fiber.Ctx) error { - auth := c.Locals(userClaimsKey).(*casdoorsdk.Claims) + auth := c.Locals(userKey).(*casdoorsdk.User) params := c.Locals(soda.KeyParameter).(*schema.ListDocQuery) docs, total, err := service.ListDocs(c.UserContext(), auth, params) if err != nil { @@ -104,7 +104,7 @@ func ListDocs(c *fiber.Ctx) error { } func CreateDoc(c *fiber.Ctx) error { - auth := c.Locals(userClaimsKey).(*casdoorsdk.Claims) + auth := c.Locals(userKey).(*casdoorsdk.User) body := c.Locals(soda.KeyRequestBody).(*schema.CreateDoc) doc, err := service.CreateDoc(c.UserContext(), auth, body) @@ -115,7 +115,7 @@ func CreateDoc(c *fiber.Ctx) error { } func UpdateDoc(c *fiber.Ctx) error { - auth := c.Locals(userClaimsKey).(*casdoorsdk.Claims) + auth := c.Locals(userKey).(*casdoorsdk.User) params := c.Locals(soda.KeyParameter).(*schema.DocID) body := c.Locals(soda.KeyRequestBody).(*schema.UpdateDoc) @@ -127,7 +127,7 @@ func UpdateDoc(c *fiber.Ctx) error { return c.JSON(doc.ToSchema(ctx)) } func DeleteDoc(c *fiber.Ctx) error { - auth := c.Locals(userClaimsKey).(*casdoorsdk.Claims) + auth := c.Locals(userKey).(*casdoorsdk.User) params := c.Locals(soda.KeyParameter).(*schema.DocID) ctx := c.UserContext() @@ -138,31 +138,25 @@ func DeleteDoc(c *fiber.Ctx) error { } func DeleteDocBatch(c *fiber.Ctx) error { - auth := c.Locals(userClaimsKey).(*casdoorsdk.Claims) + auth := c.Locals(userKey).(*casdoorsdk.User) body := c.Locals(soda.KeyRequestBody).(*schema.DocsBatchDelete) ctx := c.UserContext() - resp, err := service.DeleteDocBatch(ctx, auth, body) - if err != nil { - return err - } + resp := service.DeleteDocBatch(ctx, auth, body) return c.JSON(resp) } func UpdateDocBatch(c *fiber.Ctx) error { - auth := c.Locals(userClaimsKey).(*casdoorsdk.Claims) + auth := c.Locals(userKey).(*casdoorsdk.User) body := c.Locals(soda.KeyRequestBody).(*schema.DocsBatchUpdate) ctx := c.UserContext() - resp, err := service.UpdateDocBatch(ctx, auth, body) - if err != nil { - return err - } + resp := service.UpdateDocBatch(ctx, auth, body) return c.JSON(resp) } func CreateUploadURL(c *fiber.Ctx) error { - auth := c.Locals(userClaimsKey).(*casdoorsdk.Claims) + auth := c.Locals(userKey).(*casdoorsdk.User) params := c.Locals(soda.KeyParameter).(*schema.CreateUploadURL) ctx := c.UserContext() diff --git a/internal/schema/base.go b/internal/schema/base.go index 9237709..fa7d0bf 100644 --- a/internal/schema/base.go +++ b/internal/schema/base.go @@ -1,5 +1,9 @@ package schema +import ( + "gorm.io/gen/field" +) + const ( maxPageSize = 1000 defaultPageSize = 10 @@ -35,22 +39,33 @@ type SortableQuery struct { SortBy *[]string `query:"sort_by" oai:"description=排序字段, 如: +id,-created_at,test 表示依次按照id正序,created_at倒序,test正序"` } -func (s *SortableQuery) GetOrderField() []SortField { +type canOrder interface { + GetFieldByName(fieldName string) (field.OrderExpr, bool) +} + +func (s *SortableQuery) GetOrderByFields(table canOrder) []field.Expr { if s.SortBy == nil { return nil } - fields := make([]SortField, 0, len(*s.SortBy)) + fields := make([]field.Expr, 0, len(*s.SortBy)) + // query.Doc for _, v := range *s.SortBy { if v == "" { continue } switch v[0] { case '+': - fields = append(fields, SortField{Field: v[1:], Asc: true}) + if field, ok := table.GetFieldByName(v[1:]); ok { + fields = append(fields, field) + } case '-': - fields = append(fields, SortField{Field: v[1:], Asc: false}) + if field, ok := table.GetFieldByName(v[1:]); ok { + fields = append(fields, field.Desc()) + } default: - fields = append(fields, SortField{Field: v, Asc: true}) + if field, ok := table.GetFieldByName(v); ok { + fields = append(fields, field) + } } } diff --git a/internal/schema/docs.go b/internal/schema/docs.go index fe47761..3dbc7f9 100644 --- a/internal/schema/docs.go +++ b/internal/schema/docs.go @@ -2,10 +2,7 @@ package schema import ( "net/url" - "octopus/pkg/tools" "time" - - "github.com/gofiber/fiber/v2" ) type DocFolder struct { @@ -89,23 +86,13 @@ type DocsBatchUpdate struct { FolderID string `json:"folder_id" validate:"required" oai:"description=更新归属文件夹ID"` } -type DocActionResult struct { - ID string `json:"id" oai:"description=文档ID"` - Success bool `json:"success" oai:"description=操作是否成功"` - Message *string `json:"message,omitempty" oai:"description=操作失败信息"` +type DocBatchResult struct { + ID string `json:"id" oai:"description=文档ID"` + Success bool `json:"success" oai:"description=操作是否成功"` + Error string `json:"message,omitempty" oai:"description=操作失败信息"` } -type DocsBatchResults []DocActionResult - -func (q *ListDocQuery) Validate() error { - sortable := tools.NewSet("uploaded_at") - for _, s := range q.GetOrderField() { - if !sortable.Has(s.Field) { - return fiber.NewError(fiber.StatusBadRequest, "unsupported order field") - } - } - return nil -} +type DocBatchResults []DocBatchResult type CreateUploadURL struct { FileName string `query:"file_name" validate:"required" oai:"description=上传文件名"` diff --git a/internal/service/base.go b/internal/service/base.go new file mode 100644 index 0000000..6d43c33 --- /dev/null +++ b/internal/service/base.go @@ -0,0 +1 @@ +package service diff --git a/internal/service/doc.go b/internal/service/doc.go index f779434..3ca680d 100644 --- a/internal/service/doc.go +++ b/internal/service/doc.go @@ -2,37 +2,174 @@ package service import ( "context" + "errors" + "fmt" "net/url" + "octopus/internal/dal" "octopus/internal/dal/model" + "octopus/internal/dal/query" "octopus/internal/schema" + "time" "github.com/casdoor/casdoor-go-sdk/casdoorsdk" + "github.com/rs/xid" + "gorm.io/gen/field" + "gorm.io/gorm" ) -func ListDocs(ctx context.Context, auth *casdoorsdk.Claims, query *schema.ListDocQuery) ([]*model.Doc, int64, error) { - panic("implement me") +func ListDocs(ctx context.Context, auth *casdoorsdk.User, param *schema.ListDocQuery) ([]*model.Doc, int64, error) { + base := query.Doc.Where(query.Doc.OrgID.Eq(auth.Owner)) + if param.FolderIDs != nil { + base = base.Where(query.Doc.FolderID.In(*param.FolderIDs...)) + } + if orders := param.GetOrderByFields(query.Doc); len(orders) != 0 { + base = base.Order(orders...) + } + return base.FindByPage(param.GetOffset(), param.GetLimit()) } -func CreateDoc(ctx context.Context, auth *casdoorsdk.Claims, body *schema.CreateDoc) (*model.Doc, error) { - panic("implement me") +func CreateDoc(ctx context.Context, auth *casdoorsdk.User, param *schema.CreateDoc) (*model.Doc, error) { + storage := dal.GetStorage() + // 检查oss对象 + stat, exists, err := storage.ObjectStats(ctx, param.ObjectName) + if err != nil { + return nil, fmt.Errorf("failed to get object stats: %w", err) + } + if !exists { + return nil, fmt.Errorf("object not exists") + } + + // 检查文件夹 + folder, err := GetDocFolder(ctx, auth, param.FolderID) + if err != nil { + return nil, err + } + + // 将对象从临时地址移动到新地址 + newPath := fmt.Sprintf("%s/%s/%s", auth.Owner, folder.Path, param.Name) + if err := storage.MoveObject(ctx, param.ObjectName, newPath); err != nil { + return nil, fmt.Errorf("failed to move object: %w", err) + } + + doc := model.Doc{ + Base: model.Base{OrgID: auth.Owner}, + Name: param.Name, + IsDeletable: true, + IsEditable: true, + FolderID: param.FolderID, + ObjectName: newPath, + UploadedAt: stat.LastModified, + CreatedBy: auth.Id, + } + if err := query.Doc.Create(&doc); err != nil { + return nil, fmt.Errorf("failed to create doc: %w", err) + } + return &doc, nil } -func UpdateDoc(ctx context.Context, auth *casdoorsdk.Claims, id string, body *schema.UpdateDoc) (*model.Doc, error) { - panic("implement me") - -} -func DeleteDoc(ctx context.Context, auth *casdoorsdk.Claims, id string) error { - panic("implement me") - -} -func DeleteDocBatch(ctx context.Context, auth *casdoorsdk.Claims, param *schema.DocsBatchDelete) (*schema.DocsBatchResults, error) { - panic("implement me") - -} -func UpdateDocBatch(ctx context.Context, auth *casdoorsdk.Claims, param *schema.DocsBatchUpdate) (*schema.DocsBatchResults, error) { - panic("implement me") +func GetDoc(ctx context.Context, auth *casdoorsdk.User, id string) (*model.Doc, error) { + doc, err := query.Doc.Where(query.Doc.OrgID.Eq(auth.Owner), query.Doc.ID.Eq(id)).Take() + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, fmt.Errorf("specified doc not exists") + } + if err != nil { + return nil, err + } + return doc, nil } -func CreateUploadURL(ctx context.Context, auth *casdoorsdk.Claims, param *schema.CreateUploadURL) (u *url.URL, objectName string, err error) { - panic("implement me") +func UpdateDoc(ctx context.Context, auth *casdoorsdk.User, id string, body *schema.UpdateDoc) (*model.Doc, error) { + doc, err := GetDoc(ctx, auth, id) + if err != nil { + return nil, fmt.Errorf("failed to get doc: %w", err) + } + + var updates []field.AssignExpr + if body.Name != nil { + updates = append(updates, query.Doc.Name.Value(*body.Name)) + } + + if body.FolderID != nil { + folder, err := GetDocFolder(ctx, auth, *body.FolderID) + if err != nil { + return nil, fmt.Errorf("failed to get doc folder: %w", err) + } + + // 将对象从临时地址移动到新地址 + newObjectName := fmt.Sprintf("%s/%s/%s", auth.Owner, folder.Path, doc.Name) + if err := dal.GetStorage().MoveObject(ctx, doc.ObjectName, newObjectName); err != nil { + return nil, fmt.Errorf("failed to move object: %w", err) + } + + updates = append(updates, query.Doc.ObjectName.Value(newObjectName)) + updates = append(updates, query.Doc.FolderID.Value(*body.FolderID)) + } + + if _, err := query.Doc.UpdateColumnSimple(updates...); err != nil { + return nil, fmt.Errorf("failed to update doc: %w", err) + } + return GetDoc(ctx, auth, id) +} + +func DeleteDoc(ctx context.Context, auth *casdoorsdk.User, id string) error { + doc, err := GetDoc(ctx, auth, id) + if err != nil { + return fmt.Errorf("failed to get doc: %w", err) + } + if err := dal.GetStorage().DeleteObject(ctx, doc.ObjectName); err != nil { + return fmt.Errorf("failed to delete object: %w", err) + } + _, err = query.Doc.Where(query.Doc.OrgID.Eq(auth.Owner), query.Doc.ID.Eq(id)).Delete() + if err != nil { + return fmt.Errorf("failed to delete doc: %w", err) + } + return nil +} + +func DeleteDocBatch(ctx context.Context, auth *casdoorsdk.User, param *schema.DocsBatchDelete) *schema.DocBatchResults { + results := make(schema.DocBatchResults, 0, len(param.IDs)) + // NOTE: 后面应该需要优化一下 + for _, docID := range param.IDs { + err := DeleteDoc(ctx, auth, docID) + if err != nil { + results = append(results, schema.DocBatchResult{ID: docID, Success: false, Error: err.Error()}) + } else { + results = append(results, schema.DocBatchResult{ID: docID, Success: true}) + } + } + return &results +} + +func UpdateDocBatch(ctx context.Context, auth *casdoorsdk.User, param *schema.DocsBatchUpdate) *schema.DocBatchResults { + results := make(schema.DocBatchResults, 0, len(param.IDs)) + // NOTE: 后面应该需要优化一下 + for _, docID := range param.IDs { + _, err := UpdateDoc(ctx, auth, docID, &schema.UpdateDoc{FolderID: ¶m.FolderID}) + if err != nil { + results = append(results, schema.DocBatchResult{ID: docID, Success: false, Error: err.Error()}) + } else { + results = append(results, schema.DocBatchResult{ID: docID, Success: true}) + } + } + return &results +} + +func CreateUploadURL(ctx context.Context, auth *casdoorsdk.User, param *schema.CreateUploadURL) (u *url.URL, objectName string, err error) { + tmpObjectName := fmt.Sprintf("/tmp/%s/%s-%s", auth.Owner, param.FileName, xid.New()) + u, err = dal.GetStorage().PresignedPutObject(ctx, tmpObjectName, time.Hour) + if err != nil { + return nil, "", fmt.Errorf("failed to create presigned url: %w", err) + } + return u, tmpObjectName, nil +} + +func GetDocFolder(ctx context.Context, auth *casdoorsdk.User, id string) (*model.DocFolder, error) { + folder, err := query.DocFolder.Where(query.DocFolder.OrgID.Eq(auth.Owner), query.DocFolder.ID.Eq(id)).Take() + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, fmt.Errorf("specified doc folder not exists") + } + if err != nil { + return nil, err + } + return folder, nil } diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index b95b8bf..0dd62e7 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -1,26 +1,26 @@ package storage import ( - "context" "errors" "net/url" - "time" "github.com/spf13/cast" ) -type ObjectStorage interface { - // 获取上传对象预签名URL - PresignedPutObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) - // 获取访问对象预签名URL - PresignedGetObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) - // 移动对象 - MoveObject(ctx context.Context, src, dst string) error - // 检查文件是否存在 - ObjectExists(ctx context.Context, objectName string) (bool, error) -} +// type ObjectStorage interface { +// // 获取上传对象预签名URL +// PresignedPutObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) +// // 获取访问对象预签名URL +// PresignedGetObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) +// // 移动对象 +// MoveObject(ctx context.Context, src, dst string) error +// // 检查文件是否存在 +// ObjectExists(ctx context.Context, objectName string) (bool, error) +// // 获取对象创建时间 +// GetObjectCreatedTime(ctx context.Context, objectName string) (time.Time, error) +// } -func NewObjectStorage(dsn string) (ObjectStorage, error) { +func NewObjectStorage(dsn string) (*StorageMinio, error) { u, err := url.Parse(dsn) if err != nil { return nil, err @@ -30,9 +30,9 @@ func NewObjectStorage(dsn string) (ObjectStorage, error) { pass, _ := u.User.Password() switch u.Scheme { - case "cos": - // ex: cos://examplebucket-1250000000.cos.COS_REGION.myqcloud.com - return newCosStorage(u.Host, user, pass) + // case "cos": + // ex: cos://examplebucket-1250000000.cos.COS_REGION.myqcloud.com + // return newCosStorage(u.Host, user, pass) case "minio": // ex: minio://minio-api:9001?secure=false&bucket=images secure := cast.ToBool(u.Query().Get("secure")) diff --git a/pkg/storage/storage_cos.go b/pkg/storage/storage_cos.go deleted file mode 100644 index 51f2a9e..0000000 --- a/pkg/storage/storage_cos.go +++ /dev/null @@ -1,82 +0,0 @@ -package storage - -import ( - "context" - "errors" - "fmt" - "net/http" - "net/url" - "strings" - "time" - - "github.com/tencentyun/cos-go-sdk-v5" -) - -var _ ObjectStorage = (*storageCos)(nil) - -type storageCos struct { - client *cos.Client - - host string - accessKey string - accessSecret string - bucket string -} - -func newCosStorage(host, accessKey, accessSecret string) (ObjectStorage, error) { - parts := strings.Split(host, ".") - if len(parts) != 5 { - return nil, errors.New("invalid cos host") - } - parts = strings.Split(parts[0], "-") - if len(parts) != 2 { - return nil, errors.New("invalid cos host") - } - bucketName := parts[0] - - u, err := url.Parse("https://" + host) - if err != nil { - return nil, err - } - client := cos.NewClient(&cos.BaseURL{BucketURL: u}, &http.Client{ - Transport: &cos.AuthorizationTransport{ - SecretID: accessKey, - SecretKey: accessSecret, - }, - }) - return &storageCos{ - client: client, - host: host, - accessKey: accessKey, - accessSecret: accessSecret, - bucket: bucketName, - }, nil -} - -// PresignedPutObject implements ObjectStorage -func (c *storageCos) PresignedPutObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { - return c.client.Object.GetPresignedURL(ctx, "PUT", objectName, c.accessKey, c.accessSecret, expires, nil) -} - -// PresignedGetObject implements ObjectStorage -func (c *storageCos) PresignedGetObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { - return c.client.Object.GetPresignedURL(ctx, "GET", objectName, c.accessKey, c.accessSecret, expires, nil) -} - -// MoveObject implements ObjectStorage -func (c *storageCos) MoveObject(ctx context.Context, src string, dst string) error { - srcURL := fmt.Sprintf("%s/%s", c.host, src) - - if _, _, err := c.client.Object.Copy(ctx, dst, srcURL, nil); err != nil { - return fmt.Errorf("copy object failed while move object: %w", err) - } - if _, err := c.client.Object.Delete(ctx, src, nil); err != nil { - return fmt.Errorf("delete object failed while move object: %w", err) - } - return nil -} - -// ObjectExists implements ObjectStorage -func (c *storageCos) ObjectExists(ctx context.Context, objectName string) (bool, error) { - return c.client.Object.IsExist(ctx, objectName) -} diff --git a/pkg/storage/storage_minio.go b/pkg/storage/storage_minio.go index c435a2d..346ac6a 100644 --- a/pkg/storage/storage_minio.go +++ b/pkg/storage/storage_minio.go @@ -10,9 +10,7 @@ import ( "github.com/minio/minio-go/v7/pkg/credentials" ) -var _ ObjectStorage = (*storageMinio)(nil) - -type storageMinio struct { +type StorageMinio struct { client *minio.Client endpoint string @@ -23,7 +21,7 @@ type storageMinio struct { bucket string } -func newMinioStorage(endpoint, accessKey, accessSecret string, secure bool, bucket string) (ObjectStorage, error) { +func newMinioStorage(endpoint, accessKey, accessSecret string, secure bool, bucket string) (*StorageMinio, error) { client, err := minio.New(endpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKey, accessSecret, ""), Secure: secure, @@ -31,7 +29,7 @@ func newMinioStorage(endpoint, accessKey, accessSecret string, secure bool, buck if err != nil { return nil, err } - return &storageMinio{ + return &StorageMinio{ client: client, endpoint: endpoint, accessKey: accessKey, @@ -42,39 +40,46 @@ func newMinioStorage(endpoint, accessKey, accessSecret string, secure bool, buck } // PresignedPutObject implements ObjectStorage -func (m *storageMinio) PresignedPutObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { +func (m *StorageMinio) PresignedPutObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { return m.client.PresignedPutObject(ctx, m.bucket, objectName, expires) } // PresignedGetObject implements ObjectStorage -func (m *storageMinio) PresignedGetObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { +func (m *StorageMinio) PresignedGetObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { return m.client.PresignedGetObject(ctx, m.bucket, objectName, expires, nil) } // MoveObject implements ObjectStorage -func (m *storageMinio) MoveObject(ctx context.Context, srcObject, dstObject string) (err error) { +func (m *StorageMinio) MoveObject(ctx context.Context, srcObject, dstObject string) (err error) { dst := minio.CopyDestOptions{Bucket: m.bucket, Object: dstObject} src := minio.CopySrcOptions{Bucket: m.bucket, Object: srcObject} if _, err := m.client.CopyObject(ctx, dst, src); err != nil { - return fmt.Errorf("move object failed while copy: %v", err) + return fmt.Errorf("move object failed while copy: %w", err) } if err := m.client.RemoveObject(ctx, m.bucket, srcObject, minio.RemoveObjectOptions{}); err != nil { - return fmt.Errorf("move object failed while remove: %v", err) + return fmt.Errorf("move object failed while remove: %w", err) } return nil } // ObjectExists implements ObjectStorage -func (m *storageMinio) ObjectExists(ctx context.Context, objectName string) (bool, error) { - _, err := m.client.StatObject(ctx, m.bucket, objectName, minio.StatObjectOptions{}) +func (m *StorageMinio) ObjectStats(ctx context.Context, objectName string) (stat *minio.ObjectInfo, exists bool, err error) { + obj, err := m.client.StatObject(ctx, m.bucket, objectName, minio.StatObjectOptions{}) if err != nil { - er := minio.ToErrorResponse(err) - switch er.Code { + switch minio.ToErrorResponse(err).Code { case "NoSuchKey", "NoSuchBucket": - return false, nil + return nil, false, nil default: - return false, err + return nil, false, err } } - return true, nil + return &obj, true, nil +} + +// MoveObject implements ObjectStorage +func (m *StorageMinio) DeleteObject(ctx context.Context, objectName string) (err error) { + if err := m.client.RemoveObject(ctx, m.bucket, objectName, minio.RemoveObjectOptions{}); err != nil { + return fmt.Errorf("move object failed while remove: %w", err) + } + return nil }