diff --git a/scnserver/Makefile b/scnserver/Makefile index 65020ae..b677207 100644 --- a/scnserver/Makefile +++ b/scnserver/Makefile @@ -10,12 +10,17 @@ HASH=$(shell git rev-parse HEAD) SWAGGO_VERSION=v1.8.12 SWAGGO=github.com/swaggo/swag/cmd/swag@$(SWAGGO_VERSION) -build: swagger pygmentize fmt +build: ids enums swagger pygmentize fmt mkdir -p _build rm -f ./_build/scn_backend - go generate ./... CGO_ENABLED=1 go build -v -o _build/scn_backend -tags "timetzdata sqlite_fts5 sqlite_foreign_keys" ./cmd/scnserver +enums: + go generate models/enums.go + +ids: + go generate models/ids.go + run: build mkdir -p .run-data _build/scn_backend diff --git a/scnserver/_gen/id-generate.go b/scnserver/_gen/id-generate.go new file mode 100644 index 0000000..45e40cd --- /dev/null +++ b/scnserver/_gen/id-generate.go @@ -0,0 +1,20 @@ +package main + +import ( + "gogs.mikescher.com/BlackForestBytes/goext/bfcodegen" + "os" +) + +func main() { + dest := os.Args[2] + + wd, err := os.Getwd() + if err != nil { + panic(err) + } + + err = bfcodegen.GenerateCharsetIDSpecs(wd, dest) + if err != nil { + panic(err) + } +} diff --git a/scnserver/go.mod b/scnserver/go.mod index edef6d1..4c71236 100644 --- a/scnserver/go.mod +++ b/scnserver/go.mod @@ -4,20 +4,20 @@ go 1.19 require ( github.com/gin-gonic/gin v1.9.1 - github.com/go-playground/validator/v10 v10.14.1 + github.com/go-playground/validator/v10 v10.15.5 github.com/go-sql-driver/mysql v1.7.1 github.com/jmoiron/sqlx v1.3.5 github.com/mattn/go-sqlite3 v1.14.17 - github.com/rs/zerolog v1.29.1 - gogs.mikescher.com/BlackForestBytes/goext v0.0.218 + github.com/rs/zerolog v1.31.0 + gogs.mikescher.com/BlackForestBytes/goext v0.0.291 gopkg.in/loremipsum.v1 v1.1.2 ) require ( - github.com/bytedance/sonic v1.10.0-rc3 // indirect + github.com/bytedance/sonic v1.10.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect @@ -27,18 +27,20 @@ require ( github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.9 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/rs/xid v1.5.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect - golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + go.mongodb.org/mongo-driver v1.12.1 // indirect + golang.org/x/arch v0.5.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/scnserver/go.sum b/scnserver/go.sum index f0d93d3..cd2b533 100644 --- a/scnserver/go.sum +++ b/scnserver/go.sum @@ -1,11 +1,8 @@ github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= -github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= -github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE= +github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= @@ -15,8 +12,8 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV 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/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= @@ -26,8 +23,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= -github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= +github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= @@ -35,6 +32,8 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.2/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-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -43,6 +42,7 @@ github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -51,13 +51,12 @@ github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -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.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.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= @@ -66,16 +65,16 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= -github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -85,55 +84,68 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -gogs.mikescher.com/BlackForestBytes/goext v0.0.163 h1:GYC34wLOdBM/CgAov0AyznfHGd09Km106Ijmp8cZmp4= -gogs.mikescher.com/BlackForestBytes/goext v0.0.163/go.mod h1:Tood+vqmPqS/meYRnUcGz837wqHkP8BykVpY1h8TWoI= -gogs.mikescher.com/BlackForestBytes/goext v0.0.216 h1:cr28oRYNBMNohRyjb0nHNZg0OLE/NVq82zbkVYuNS1M= -gogs.mikescher.com/BlackForestBytes/goext v0.0.216/go.mod h1:eBL+dE41RaoQw38oLVzxSxLPsFq6sGFug7o3i7Br+SY= -gogs.mikescher.com/BlackForestBytes/goext v0.0.217 h1:Z0vLwOgCzVi3nJLriPRBtFTyXhC9KjeAmk2DqvT7gPM= -gogs.mikescher.com/BlackForestBytes/goext v0.0.217/go.mod h1:eBL+dE41RaoQw38oLVzxSxLPsFq6sGFug7o3i7Br+SY= -gogs.mikescher.com/BlackForestBytes/goext v0.0.218 h1:ly69FPNGqcTc1o6Qf+P6HpHtKmOxG1/fWLj/Aqzi5Rg= -gogs.mikescher.com/BlackForestBytes/goext v0.0.218/go.mod h1:eBL+dE41RaoQw38oLVzxSxLPsFq6sGFug7o3i7Br+SY= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +gogs.mikescher.com/BlackForestBytes/goext v0.0.291 h1:yiRHw8wV9LEZUKljvQ2MBHgeSAI6ZzajDS+FJRGnzVc= +gogs.mikescher.com/BlackForestBytes/goext v0.0.291/go.mod h1:TtMY+/pv09fOldLO3noZ6Yfcy9KU9MjVQ0KQ9nraTeI= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= -golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y= +golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/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.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/scnserver/models/enums.go b/scnserver/models/enums.go new file mode 100644 index 0000000..29f2635 --- /dev/null +++ b/scnserver/models/enums.go @@ -0,0 +1,3 @@ +package models + +//go:generate go run ../_gen/enum-generate.go -- enums_gen.go diff --git a/scnserver/models/enums_gen.go b/scnserver/models/enums_gen.go index 241b07e..0652436 100644 --- a/scnserver/models/enums_gen.go +++ b/scnserver/models/enums_gen.go @@ -3,31 +3,9 @@ package models import "gogs.mikescher.com/BlackForestBytes/goext/langext" +import "gogs.mikescher.com/BlackForestBytes/goext/enums" -const ChecksumGenerator = "38908fc9adc16eb3a1266e4bca06e50ebc8613c5d3c9a4fea39314115f66544e" - -type Enum interface { - Valid() bool - ValuesAny() []any - ValuesMeta() []EnumMetaValue - VarName() string -} - -type StringEnum interface { - Enum - String() string -} - -type DescriptionEnum interface { - Enum - Description() string -} - -type EnumMetaValue struct { - VarName string `json:"varName"` - Value any `json:"value"` - Description *string `json:"description"` -} +const ChecksumEnumGenerator = "8926e4a9845e67086109bef7ca447371ab5c0a94fcfd988f14fd4ee98da9e932" // GoExtVersion: 0.0.291 // ================================ ClientType ================================ // @@ -58,7 +36,7 @@ func (e ClientType) ValuesAny() []any { return langext.ArrCastToAny(__ClientTypeValues) } -func (e ClientType) ValuesMeta() []EnumMetaValue { +func (e ClientType) ValuesMeta() []enums.EnumMetaValue { return ClientTypeValuesMeta() } @@ -73,8 +51,8 @@ func (e ClientType) VarName() string { return "" } -func (e ClientType) Meta() EnumMetaValue { - return EnumMetaValue{VarName: e.VarName(), Value: e, Description: nil} +func (e ClientType) Meta() enums.EnumMetaValue { + return enums.EnumMetaValue{VarName: e.VarName(), Value: e, Description: nil} } func ParseClientType(vv string) (ClientType, bool) { @@ -90,8 +68,8 @@ func ClientTypeValues() []ClientType { return __ClientTypeValues } -func ClientTypeValuesMeta() []EnumMetaValue { - return []EnumMetaValue{ +func ClientTypeValuesMeta() []enums.EnumMetaValue { + return []enums.EnumMetaValue{ ClientTypeAndroid.Meta(), ClientTypeIOS.Meta(), } @@ -128,7 +106,7 @@ func (e DeliveryStatus) ValuesAny() []any { return langext.ArrCastToAny(__DeliveryStatusValues) } -func (e DeliveryStatus) ValuesMeta() []EnumMetaValue { +func (e DeliveryStatus) ValuesMeta() []enums.EnumMetaValue { return DeliveryStatusValuesMeta() } @@ -143,8 +121,8 @@ func (e DeliveryStatus) VarName() string { return "" } -func (e DeliveryStatus) Meta() EnumMetaValue { - return EnumMetaValue{VarName: e.VarName(), Value: e, Description: nil} +func (e DeliveryStatus) Meta() enums.EnumMetaValue { + return enums.EnumMetaValue{VarName: e.VarName(), Value: e, Description: nil} } func ParseDeliveryStatus(vv string) (DeliveryStatus, bool) { @@ -160,8 +138,8 @@ func DeliveryStatusValues() []DeliveryStatus { return __DeliveryStatusValues } -func DeliveryStatusValuesMeta() []EnumMetaValue { - return []EnumMetaValue{ +func DeliveryStatusValuesMeta() []enums.EnumMetaValue { + return []enums.EnumMetaValue{ DeliveryStatusRetry.Meta(), DeliveryStatusSuccess.Meta(), DeliveryStatusFailed.Meta(), @@ -208,7 +186,7 @@ func (e TokenPerm) ValuesAny() []any { return langext.ArrCastToAny(__TokenPermValues) } -func (e TokenPerm) ValuesMeta() []EnumMetaValue { +func (e TokenPerm) ValuesMeta() []enums.EnumMetaValue { return TokenPermValuesMeta() } @@ -230,8 +208,8 @@ func (e TokenPerm) VarName() string { return "" } -func (e TokenPerm) Meta() EnumMetaValue { - return EnumMetaValue{VarName: e.VarName(), Value: e, Description: langext.Ptr(e.Description())} +func (e TokenPerm) Meta() enums.EnumMetaValue { + return enums.EnumMetaValue{VarName: e.VarName(), Value: e, Description: langext.Ptr(e.Description())} } func ParseTokenPerm(vv string) (TokenPerm, bool) { @@ -247,8 +225,8 @@ func TokenPermValues() []TokenPerm { return __TokenPermValues } -func TokenPermValuesMeta() []EnumMetaValue { - return []EnumMetaValue{ +func TokenPermValuesMeta() []enums.EnumMetaValue { + return []enums.EnumMetaValue{ PermAdmin.Meta(), PermChannelRead.Meta(), PermChannelSend.Meta(), diff --git a/scnserver/models/ids.go b/scnserver/models/ids.go index 8854977..f9d78e4 100644 --- a/scnserver/models/ids.go +++ b/scnserver/models/ids.go @@ -1,19 +1,11 @@ package models import ( - "crypto/rand" - "errors" - "fmt" - "github.com/go-playground/validator/v10" - "github.com/rs/zerolog/log" - "gogs.mikescher.com/BlackForestBytes/goext/langext" "gogs.mikescher.com/BlackForestBytes/goext/rext" - "math/big" - "reflect" - "regexp" - "strings" ) +//go:generate go run ../_gen/id-generate.go -- ids_gen.go + type EntityID interface { String() string Valid() error @@ -23,389 +15,11 @@ type EntityID interface { Regex() rext.Regex } -const idlen = 24 - -const checklen = 1 - -const idCharset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" -const idCharsetLen = len(idCharset) - -var charSetReverseMap = generateCharsetMap() - -const ( - prefixUserID = "USR" - prefixChannelID = "CHA" - prefixDeliveryID = "DEL" - prefixMessageID = "MSG" - prefixSubscriptionID = "SUB" - prefixClientID = "CLN" - prefixRequestID = "REQ" - prefixKeyTokenID = "TOK" -) - -var ( - regexUserID = generateRegex(prefixUserID) - regexChannelID = generateRegex(prefixChannelID) - regexDeliveryID = generateRegex(prefixDeliveryID) - regexMessageID = generateRegex(prefixMessageID) - regexSubscriptionID = generateRegex(prefixSubscriptionID) - regexClientID = generateRegex(prefixClientID) - regexRequestID = generateRegex(prefixRequestID) - regexKeyTokenID = generateRegex(prefixKeyTokenID) -) - -func generateRegex(prefix string) rext.Regex { - return rext.W(regexp.MustCompile(fmt.Sprintf("^%s[%s]{%d}[%s]{%d}$", prefix, idCharset, idlen-len(prefix)-checklen, idCharset, checklen))) -} - -func generateCharsetMap() []int { - result := make([]int, 128) - for i := 0; i < len(result); i++ { - result[i] = -1 - } - for idx, chr := range idCharset { - result[int(chr)] = idx - } - return result -} - -func generateID(prefix string) string { - k := "" - max := big.NewInt(int64(idCharsetLen)) - checksum := 0 - for i := 0; i < idlen-len(prefix)-checklen; i++ { - v, err := rand.Int(rand.Reader, max) - if err != nil { - panic(err) - } - v64 := v.Int64() - k += string(idCharset[v64]) - checksum = (checksum + int(v64)) % (idCharsetLen) - } - checkstr := string(idCharset[checksum%idCharsetLen]) - return prefix + k + checkstr -} - -func validateID(prefix string, value string) error { - if len(value) != idlen { - return errors.New("id has the wrong length") - } - - if !strings.HasPrefix(value, prefix) { - return errors.New("id is missing the correct prefix") - } - - checksum := 0 - for i := len(prefix); i < len(value)-checklen; i++ { - ichr := int(value[i]) - if ichr < 0 || ichr >= len(charSetReverseMap) || charSetReverseMap[ichr] == -1 { - return errors.New("id contains invalid characters") - } - checksum = (checksum + charSetReverseMap[ichr]) % (idCharsetLen) - } - - checkstr := string(idCharset[checksum%idCharsetLen]) - - if !strings.HasSuffix(value, checkstr) { - return errors.New("id checkstring is invalid") - } - - return nil -} - -func getRawData(prefix string, value string) string { - if len(value) != idlen { - return "" - } - return value[len(prefix) : idlen-checklen] -} - -func getCheckString(prefix string, value string) string { - if len(value) != idlen { - return "" - } - return value[idlen-checklen:] -} - -func ValidateEntityID(vfl validator.FieldLevel) bool { - if !vfl.Field().CanInterface() { - log.Error().Msgf("Failed to validate EntityID (cannot interface ?!?)") - return false - } - - ifvalue := vfl.Field().Interface() - - if value1, ok := ifvalue.(EntityID); ok { - - if vfl.Field().Type().Kind() == reflect.Pointer && langext.IsNil(value1) { - return true - } - - if err := value1.Valid(); err != nil { - log.Debug().Msgf("Failed to validate EntityID '%s' (%s)", value1.String(), err.Error()) - return false - } else { - return true - } - - } else { - log.Error().Msgf("Failed to validate EntityID (wrong type: %T)", ifvalue) - return false - } -} - -// ------------------------------------------------------------ - -type UserID string - -func NewUserID() UserID { - return UserID(generateID(prefixUserID)) -} - -func (id UserID) Valid() error { - return validateID(prefixUserID, string(id)) -} - -func (id UserID) String() string { - return string(id) -} - -func (id UserID) Prefix() string { - return prefixUserID -} - -func (id UserID) Raw() string { - return getRawData(prefixUserID, string(id)) -} - -func (id UserID) CheckString() string { - return getCheckString(prefixUserID, string(id)) -} - -func (id UserID) Regex() rext.Regex { - return regexUserID -} - -// ------------------------------------------------------------ - -type ChannelID string - -func NewChannelID() ChannelID { - return ChannelID(generateID(prefixChannelID)) -} - -func (id ChannelID) Valid() error { - return validateID(prefixChannelID, string(id)) -} - -func (id ChannelID) String() string { - return string(id) -} - -func (id ChannelID) Prefix() string { - return prefixChannelID -} - -func (id ChannelID) Raw() string { - return getRawData(prefixChannelID, string(id)) -} - -func (id ChannelID) CheckString() string { - return getCheckString(prefixChannelID, string(id)) -} - -func (id ChannelID) Regex() rext.Regex { - return regexChannelID -} - -// ------------------------------------------------------------ - -type DeliveryID string - -func NewDeliveryID() DeliveryID { - return DeliveryID(generateID(prefixDeliveryID)) -} - -func (id DeliveryID) Valid() error { - return validateID(prefixDeliveryID, string(id)) -} - -func (id DeliveryID) String() string { - return string(id) -} - -func (id DeliveryID) Prefix() string { - return prefixDeliveryID -} - -func (id DeliveryID) Raw() string { - return getRawData(prefixDeliveryID, string(id)) -} - -func (id DeliveryID) CheckString() string { - return getCheckString(prefixDeliveryID, string(id)) -} - -func (id DeliveryID) Regex() rext.Regex { - return regexDeliveryID -} - -// ------------------------------------------------------------ - -type MessageID string - -func NewMessageID() MessageID { - return MessageID(generateID(prefixMessageID)) -} - -func (id MessageID) Valid() error { - return validateID(prefixMessageID, string(id)) -} - -func (id MessageID) String() string { - return string(id) -} - -func (id MessageID) Prefix() string { - return prefixMessageID -} - -func (id MessageID) Raw() string { - return getRawData(prefixMessageID, string(id)) -} - -func (id MessageID) CheckString() string { - return getCheckString(prefixMessageID, string(id)) -} - -func (id MessageID) Regex() rext.Regex { - return regexMessageID -} - -// ------------------------------------------------------------ - -type SubscriptionID string - -func NewSubscriptionID() SubscriptionID { - return SubscriptionID(generateID(prefixSubscriptionID)) -} - -func (id SubscriptionID) Valid() error { - return validateID(prefixSubscriptionID, string(id)) -} - -func (id SubscriptionID) String() string { - return string(id) -} - -func (id SubscriptionID) Prefix() string { - return prefixSubscriptionID -} - -func (id SubscriptionID) Raw() string { - return getRawData(prefixSubscriptionID, string(id)) -} - -func (id SubscriptionID) CheckString() string { - return getCheckString(prefixSubscriptionID, string(id)) -} - -func (id SubscriptionID) Regex() rext.Regex { - return regexSubscriptionID -} - -// ------------------------------------------------------------ - -type ClientID string - -func NewClientID() ClientID { - return ClientID(generateID(prefixClientID)) -} - -func (id ClientID) Valid() error { - return validateID(prefixClientID, string(id)) -} - -func (id ClientID) String() string { - return string(id) -} - -func (id ClientID) Prefix() string { - return prefixClientID -} - -func (id ClientID) Raw() string { - return getRawData(prefixClientID, string(id)) -} - -func (id ClientID) CheckString() string { - return getCheckString(prefixClientID, string(id)) -} - -func (id ClientID) Regex() rext.Regex { - return regexClientID -} - -// ------------------------------------------------------------ - -type RequestID string - -func NewRequestID() RequestID { - return RequestID(generateID(prefixRequestID)) -} - -func (id RequestID) Valid() error { - return validateID(prefixRequestID, string(id)) -} - -func (id RequestID) String() string { - return string(id) -} - -func (id RequestID) Prefix() string { - return prefixRequestID -} - -func (id RequestID) Raw() string { - return getRawData(prefixRequestID, string(id)) -} - -func (id RequestID) CheckString() string { - return getCheckString(prefixRequestID, string(id)) -} - -func (id RequestID) Regex() rext.Regex { - return regexRequestID -} - -// ------------------------------------------------------------ - -type KeyTokenID string - -func NewKeyTokenID() KeyTokenID { - return KeyTokenID(generateID(prefixKeyTokenID)) -} - -func (id KeyTokenID) Valid() error { - return validateID(prefixKeyTokenID, string(id)) -} - -func (id KeyTokenID) String() string { - return string(id) -} - -func (id KeyTokenID) Prefix() string { - return prefixKeyTokenID -} - -func (id KeyTokenID) Raw() string { - return getRawData(prefixKeyTokenID, string(id)) -} - -func (id KeyTokenID) CheckString() string { - return getCheckString(prefixKeyTokenID, string(id)) -} - -func (id KeyTokenID) Regex() rext.Regex { - return regexKeyTokenID -} +type UserID string //@csid:type [USR] +type ChannelID string //@csid:type [CHA] +type DeliveryID string //@csid:type [DEL] +type MessageID string //@csid:type [MSG] +type SubscriptionID string //@csid:type [SUB] +type ClientID string //@csid:type [CLN] +type RequestID string //@csid:type [REQ] +type KeyTokenID string //@csid:type [TOK] diff --git a/scnserver/models/ids_gen.go b/scnserver/models/ids_gen.go new file mode 100644 index 0000000..ae673cd --- /dev/null +++ b/scnserver/models/ids_gen.go @@ -0,0 +1,388 @@ +// Code generated by id-generate.go DO NOT EDIT. + +package models + +import "crypto/rand" +import "fmt" +import "github.com/go-playground/validator/v10" +import "github.com/rs/zerolog/log" +import "gogs.mikescher.com/BlackForestBytes/goext/exerr" +import "gogs.mikescher.com/BlackForestBytes/goext/langext" +import "gogs.mikescher.com/BlackForestBytes/goext/rext" +import "math/big" +import "reflect" +import "regexp" +import "strings" + +const ChecksumCharsetIDGenerator = "8926e4a9845e67086109bef7ca447371ab5c0a94fcfd988f14fd4ee98da9e932" // GoExtVersion: 0.0.291 + +const idlen = 24 + +const checklen = 1 + +const idCharset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +const idCharsetLen = len(idCharset) + +var charSetReverseMap = generateCharsetMap() + +const ( + prefixUserID = "USR" + prefixChannelID = "CHA" + prefixDeliveryID = "DEL" + prefixMessageID = "MSG" + prefixSubscriptionID = "SUB" + prefixClientID = "CLN" + prefixRequestID = "REQ" + prefixKeyTokenID = "TOK" +) + +var ( + regexUserID = generateRegex(prefixUserID) + regexChannelID = generateRegex(prefixChannelID) + regexDeliveryID = generateRegex(prefixDeliveryID) + regexMessageID = generateRegex(prefixMessageID) + regexSubscriptionID = generateRegex(prefixSubscriptionID) + regexClientID = generateRegex(prefixClientID) + regexRequestID = generateRegex(prefixRequestID) + regexKeyTokenID = generateRegex(prefixKeyTokenID) +) + +func generateRegex(prefix string) rext.Regex { + return rext.W(regexp.MustCompile(fmt.Sprintf("^%s[%s]{%d}[%s]{%d}$", prefix, idCharset, idlen-len(prefix)-checklen, idCharset, checklen))) +} + +func generateCharsetMap() []int { + result := make([]int, 128) + for i := 0; i < len(result); i++ { + result[i] = -1 + } + for idx, chr := range idCharset { + result[int(chr)] = idx + } + return result +} + +func generateID(prefix string) string { + k := "" + max := big.NewInt(int64(idCharsetLen)) + checksum := 0 + for i := 0; i < idlen-len(prefix)-checklen; i++ { + v, err := rand.Int(rand.Reader, max) + if err != nil { + panic(err) + } + v64 := v.Int64() + k += string(idCharset[v64]) + checksum = (checksum + int(v64)) % (idCharsetLen) + } + checkstr := string(idCharset[checksum%idCharsetLen]) + return prefix + k + checkstr +} + +func validateID(prefix string, value string) error { + if len(value) != idlen { + return exerr.New(exerr.TypeInvalidCSID, "id has the wrong length").Str("value", value).Build() + } + + if !strings.HasPrefix(value, prefix) { + return exerr.New(exerr.TypeInvalidCSID, "id is missing the correct prefix").Str("value", value).Str("prefix", prefix).Build() + } + + checksum := 0 + for i := len(prefix); i < len(value)-checklen; i++ { + ichr := int(value[i]) + if ichr < 0 || ichr >= len(charSetReverseMap) || charSetReverseMap[ichr] == -1 { + return exerr.New(exerr.TypeInvalidCSID, "id contains invalid characters").Str("value", value).Build() + } + checksum = (checksum + charSetReverseMap[ichr]) % (idCharsetLen) + } + + checkstr := string(idCharset[checksum%idCharsetLen]) + + if !strings.HasSuffix(value, checkstr) { + return exerr.New(exerr.TypeInvalidCSID, "id checkstring is invalid").Str("value", value).Str("checkstr", checkstr).Build() + } + + return nil +} + +func getRawData(prefix string, value string) string { + if len(value) != idlen { + return "" + } + return value[len(prefix) : idlen-checklen] +} + +func getCheckString(prefix string, value string) string { + if len(value) != idlen { + return "" + } + return value[idlen-checklen:] +} + +func ValidateEntityID(vfl validator.FieldLevel) bool { + if !vfl.Field().CanInterface() { + log.Error().Msgf("Failed to validate EntityID (cannot interface ?!?)") + return false + } + + ifvalue := vfl.Field().Interface() + + if value1, ok := ifvalue.(EntityID); ok { + + if vfl.Field().Type().Kind() == reflect.Pointer && langext.IsNil(value1) { + return true + } + + if err := value1.Valid(); err != nil { + log.Debug().Msgf("Failed to validate EntityID '%s' (%s)", value1.String(), err.Error()) + return false + } else { + return true + } + + } else { + log.Error().Msgf("Failed to validate EntityID (wrong type: %T)", ifvalue) + return false + } +} + +// ================================ UserID (ids.go) ================================ + +func NewUserID() UserID { + return UserID(generateID(prefixUserID)) +} + +func (id UserID) Valid() error { + return validateID(prefixUserID, string(id)) +} + +func (i UserID) String() string { + return string(i) +} + +func (i UserID) Prefix() string { + return prefixUserID +} + +func (id UserID) Raw() string { + return getRawData(prefixUserID, string(id)) +} + +func (id UserID) CheckString() string { + return getCheckString(prefixUserID, string(id)) +} + +func (id UserID) Regex() rext.Regex { + return regexUserID +} + +// ================================ ChannelID (ids.go) ================================ + +func NewChannelID() ChannelID { + return ChannelID(generateID(prefixChannelID)) +} + +func (id ChannelID) Valid() error { + return validateID(prefixChannelID, string(id)) +} + +func (i ChannelID) String() string { + return string(i) +} + +func (i ChannelID) Prefix() string { + return prefixChannelID +} + +func (id ChannelID) Raw() string { + return getRawData(prefixChannelID, string(id)) +} + +func (id ChannelID) CheckString() string { + return getCheckString(prefixChannelID, string(id)) +} + +func (id ChannelID) Regex() rext.Regex { + return regexChannelID +} + +// ================================ DeliveryID (ids.go) ================================ + +func NewDeliveryID() DeliveryID { + return DeliveryID(generateID(prefixDeliveryID)) +} + +func (id DeliveryID) Valid() error { + return validateID(prefixDeliveryID, string(id)) +} + +func (i DeliveryID) String() string { + return string(i) +} + +func (i DeliveryID) Prefix() string { + return prefixDeliveryID +} + +func (id DeliveryID) Raw() string { + return getRawData(prefixDeliveryID, string(id)) +} + +func (id DeliveryID) CheckString() string { + return getCheckString(prefixDeliveryID, string(id)) +} + +func (id DeliveryID) Regex() rext.Regex { + return regexDeliveryID +} + +// ================================ MessageID (ids.go) ================================ + +func NewMessageID() MessageID { + return MessageID(generateID(prefixMessageID)) +} + +func (id MessageID) Valid() error { + return validateID(prefixMessageID, string(id)) +} + +func (i MessageID) String() string { + return string(i) +} + +func (i MessageID) Prefix() string { + return prefixMessageID +} + +func (id MessageID) Raw() string { + return getRawData(prefixMessageID, string(id)) +} + +func (id MessageID) CheckString() string { + return getCheckString(prefixMessageID, string(id)) +} + +func (id MessageID) Regex() rext.Regex { + return regexMessageID +} + +// ================================ SubscriptionID (ids.go) ================================ + +func NewSubscriptionID() SubscriptionID { + return SubscriptionID(generateID(prefixSubscriptionID)) +} + +func (id SubscriptionID) Valid() error { + return validateID(prefixSubscriptionID, string(id)) +} + +func (i SubscriptionID) String() string { + return string(i) +} + +func (i SubscriptionID) Prefix() string { + return prefixSubscriptionID +} + +func (id SubscriptionID) Raw() string { + return getRawData(prefixSubscriptionID, string(id)) +} + +func (id SubscriptionID) CheckString() string { + return getCheckString(prefixSubscriptionID, string(id)) +} + +func (id SubscriptionID) Regex() rext.Regex { + return regexSubscriptionID +} + +// ================================ ClientID (ids.go) ================================ + +func NewClientID() ClientID { + return ClientID(generateID(prefixClientID)) +} + +func (id ClientID) Valid() error { + return validateID(prefixClientID, string(id)) +} + +func (i ClientID) String() string { + return string(i) +} + +func (i ClientID) Prefix() string { + return prefixClientID +} + +func (id ClientID) Raw() string { + return getRawData(prefixClientID, string(id)) +} + +func (id ClientID) CheckString() string { + return getCheckString(prefixClientID, string(id)) +} + +func (id ClientID) Regex() rext.Regex { + return regexClientID +} + +// ================================ RequestID (ids.go) ================================ + +func NewRequestID() RequestID { + return RequestID(generateID(prefixRequestID)) +} + +func (id RequestID) Valid() error { + return validateID(prefixRequestID, string(id)) +} + +func (i RequestID) String() string { + return string(i) +} + +func (i RequestID) Prefix() string { + return prefixRequestID +} + +func (id RequestID) Raw() string { + return getRawData(prefixRequestID, string(id)) +} + +func (id RequestID) CheckString() string { + return getCheckString(prefixRequestID, string(id)) +} + +func (id RequestID) Regex() rext.Regex { + return regexRequestID +} + +// ================================ KeyTokenID (ids.go) ================================ + +func NewKeyTokenID() KeyTokenID { + return KeyTokenID(generateID(prefixKeyTokenID)) +} + +func (id KeyTokenID) Valid() error { + return validateID(prefixKeyTokenID, string(id)) +} + +func (i KeyTokenID) String() string { + return string(i) +} + +func (i KeyTokenID) Prefix() string { + return prefixKeyTokenID +} + +func (id KeyTokenID) Raw() string { + return getRawData(prefixKeyTokenID, string(id)) +} + +func (id KeyTokenID) CheckString() string { + return getCheckString(prefixKeyTokenID, string(id)) +} + +func (id KeyTokenID) Regex() rext.Regex { + return regexKeyTokenID +} diff --git a/scnserver/models/utils.go b/scnserver/models/utils.go index 9feb20a..7d2fb17 100644 --- a/scnserver/models/utils.go +++ b/scnserver/models/utils.go @@ -5,8 +5,6 @@ import ( "time" ) -//go:generate go run ../_gen/enum-generate.go -- enums_gen.go - func timeOptFmt(t *time.Time, fmt string) *string { if t == nil { return nil diff --git a/scnserver/swagger/swagger.json b/scnserver/swagger/swagger.json index f9db824..f20f397 100644 --- a/scnserver/swagger/swagger.json +++ b/scnserver/swagger/swagger.json @@ -958,13 +958,13 @@ } }, "/api/v2/messages/{mid}": { - "delete": { - "description": "The user must own the message and request the resource with the ADMIN Key", + "get": { + "description": "The user must either own the message and request the resource with the READ or ADMIN Key\nOr the user must subscribe to the corresponding channel (and be confirmed) and request the resource with the READ or ADMIN Key\nThe returned message is never trimmed", "tags": [ "API-v2" ], - "summary": "Delete a single message", - "operationId": "api-messages-delete", + "summary": "Get a single message (untrimmed)", + "operationId": "api-messages-get", "parameters": [ { "type": "string", @@ -1007,13 +1007,13 @@ } } }, - "patch": { - "description": "The user must either own the message and request the resource with the READ or ADMIN Key\nOr the user must subscribe to the corresponding channel (and be confirmed) and request the resource with the READ or ADMIN Key\nThe returned message is never trimmed", + "delete": { + "description": "The user must own the message and request the resource with the ADMIN Key", "tags": [ "API-v2" ], - "summary": "Get a single message (untrimmed)", - "operationId": "api-messages-get", + "summary": "Delete a single message", + "operationId": "api-messages-delete", "parameters": [ { "type": "string", @@ -2449,6 +2449,104 @@ } } }, + "/external/v1/uptime-kuma": { + "post": { + "description": "All parameter can be set via query-parameter or the json body. Only UserID, UserKey and Title are required", + "tags": [ + "External" + ], + "summary": "Send a new message", + "parameters": [ + { + "type": "string", + "name": "channel", + "in": "query" + }, + { + "type": "string", + "name": "channel_down", + "in": "query" + }, + { + "type": "string", + "name": "channel_up", + "in": "query" + }, + { + "type": "string", + "example": "P3TNH8mvv14fm", + "name": "key", + "in": "query" + }, + { + "type": "integer", + "name": "priority", + "in": "query" + }, + { + "type": "integer", + "name": "priority_down", + "in": "query" + }, + { + "type": "integer", + "name": "priority_up", + "in": "query" + }, + { + "type": "string", + "name": "senderName", + "in": "query" + }, + { + "type": "string", + "example": "7725", + "name": "user_id", + "in": "query" + }, + { + "description": " ", + "name": "post_body", + "in": "body", + "schema": { + "$ref": "#/definitions/handler.UptimeKuma.body" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handler.UptimeKuma.response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/ginresp.apiError" + } + }, + "401": { + "description": "The user_id was not found or the user_key is wrong", + "schema": { + "$ref": "#/definitions/ginresp.apiError" + } + }, + "403": { + "description": "The user has exceeded its daily quota - wait 24 hours or upgrade your account", + "schema": { + "$ref": "#/definitions/ginresp.apiError" + } + }, + "500": { + "description": "An internal server error occurred - try again later", + "schema": { + "$ref": "#/definitions/ginresp.apiError" + } + } + } + } + }, "/send": { "post": { "description": "All parameter can be set via query-parameter or the json body. Only UserID, UserKey and Title are required", @@ -2629,72 +2727,120 @@ "parameters": [ { "type": "string", + "example": "test", + "name": "channel", + "in": "query" + }, + { + "type": "string", + "example": "This is a message", "name": "content", "in": "query" }, { "type": "string", + "example": "P3TNH8mvv14fm", + "name": "key", + "in": "query" + }, + { + "type": "string", + "example": "db8b0e6a-a08c-4646", "name": "msg_id", "in": "query" }, { + "enum": [ + 0, + 1, + 2 + ], "type": "integer", + "example": 1, "name": "priority", "in": "query" }, + { + "type": "string", + "example": "example-server", + "name": "sender_name", + "in": "query" + }, { "type": "number", + "example": 1669824037, "name": "timestamp", "in": "query" }, { "type": "string", + "example": "Hello World", "name": "title", "in": "query" }, { - "type": "integer", + "type": "string", + "example": "7725", "name": "user_id", "in": "query" }, { "type": "string", - "name": "user_key", - "in": "query" + "example": "test", + "name": "channel", + "in": "formData" }, { "type": "string", + "example": "This is a message", "name": "content", "in": "formData" }, { "type": "string", + "example": "P3TNH8mvv14fm", + "name": "key", + "in": "formData" + }, + { + "type": "string", + "example": "db8b0e6a-a08c-4646", "name": "msg_id", "in": "formData" }, { + "enum": [ + 0, + 1, + 2 + ], "type": "integer", + "example": 1, "name": "priority", "in": "formData" }, + { + "type": "string", + "example": "example-server", + "name": "sender_name", + "in": "formData" + }, { "type": "number", + "example": 1669824037, "name": "timestamp", "in": "formData" }, { "type": "string", + "example": "Hello World", "name": "title", "in": "formData" }, - { - "type": "integer", - "name": "user_id", - "in": "formData" - }, { "type": "string", - "name": "user_key", + "example": "7725", + "name": "user_id", "in": "formData" } ], @@ -2702,7 +2848,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/handler.SendMessageCompat.response" + "$ref": "#/definitions/handler.SendMessage.response" } }, "400": { @@ -2731,69 +2877,6 @@ } } } - }, - "/webhook/uptime-kuma": { - "post": { - "description": "All parameter can be set via query-parameter or the json body. Only UserID, UserKey and Title are required", - "tags": [ - "External" - ], - "summary": "Send a new message", - "parameters": [ - { - "type": "string", - "example": "P3TNH8mvv14fm", - "name": "key", - "in": "query" - }, - { - "type": "string", - "example": "7725", - "name": "user_id", - "in": "query" - }, - { - "description": " ", - "name": "post_body", - "in": "body", - "schema": { - "$ref": "#/definitions/handler.UptimeKumaWebHook.uptimeKumaWebhookBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/ginresp.apiError" - } - }, - "401": { - "description": "The user_id was not found or the user_key is wrong", - "schema": { - "$ref": "#/definitions/ginresp.apiError" - } - }, - "403": { - "description": "The user has exceeded its daily quota - wait 24 hours or upgrade your account", - "schema": { - "$ref": "#/definitions/ginresp.apiError" - } - }, - "500": { - "description": "An internal server error occurred - try again later", - "schema": { - "$ref": "#/definitions/ginresp.apiError" - } - } - } - } } }, "definitions": { @@ -3323,41 +3406,6 @@ } } }, - "handler.SendMessageCompat.response": { - "type": "object", - "properties": { - "errhighlight": { - "type": "integer" - }, - "error": { - "$ref": "#/definitions/apierr.APIError" - }, - "is_pro": { - "type": "boolean" - }, - "message": { - "type": "string" - }, - "messagecount": { - "type": "integer" - }, - "quota": { - "type": "integer" - }, - "quota_max": { - "type": "integer" - }, - "scn_msg_id": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "suppress_send": { - "type": "boolean" - } - } - }, "handler.Sleep.response": { "type": "object", "properties": { @@ -3449,7 +3497,7 @@ } } }, - "handler.UptimeKumaWebHook.uptimeKumaWebhookBody": { + "handler.UptimeKuma.body": { "type": "object", "properties": { "heartbeat": { @@ -3461,6 +3509,9 @@ "msg": { "type": "string" }, + "status": { + "type": "integer" + }, "time": { "type": "string" }, @@ -3488,6 +3539,14 @@ } } }, + "handler.UptimeKuma.response": { + "type": "object", + "properties": { + "message_id": { + "type": "string" + } + } + }, "handler.pingResponse": { "type": "object", "properties": { diff --git a/scnserver/swagger/swagger.yaml b/scnserver/swagger/swagger.yaml index 13039c3..aaff2c3 100644 --- a/scnserver/swagger/swagger.yaml +++ b/scnserver/swagger/swagger.yaml @@ -376,29 +376,6 @@ definitions: suppress_send: type: boolean type: object - handler.SendMessageCompat.response: - properties: - errhighlight: - type: integer - error: - $ref: '#/definitions/apierr.APIError' - is_pro: - type: boolean - message: - type: string - messagecount: - type: integer - quota: - type: integer - quota_max: - type: integer - scn_msg_id: - type: integer - success: - type: boolean - suppress_send: - type: boolean - type: object handler.Sleep.response: properties: duration: @@ -458,7 +435,7 @@ definitions: user_id: type: integer type: object - handler.UptimeKumaWebHook.uptimeKumaWebhookBody: + handler.UptimeKuma.body: properties: heartbeat: properties: @@ -466,6 +443,8 @@ definitions: type: string msg: type: string + status: + type: integer time: type: string timezone: @@ -483,6 +462,11 @@ definitions: msg: type: string type: object + handler.UptimeKuma.response: + properties: + message_id: + type: string + type: object handler.pingResponse: properties: info: @@ -1418,7 +1402,7 @@ paths: summary: Delete a single message tags: - API-v2 - patch: + get: description: |- The user must either own the message and request the resource with the READ or ADMIN Key Or the user must subscribe to the corresponding channel (and be confirmed) and request the resource with the READ or ADMIN Key @@ -2414,6 +2398,70 @@ paths: summary: Update a subscription (e.g. confirm) tags: - API-v2 + /external/v1/uptime-kuma: + post: + description: All parameter can be set via query-parameter or the json body. + Only UserID, UserKey and Title are required + parameters: + - in: query + name: channel + type: string + - in: query + name: channel_down + type: string + - in: query + name: channel_up + type: string + - example: P3TNH8mvv14fm + in: query + name: key + type: string + - in: query + name: priority + type: integer + - in: query + name: priority_down + type: integer + - in: query + name: priority_up + type: integer + - in: query + name: senderName + type: string + - example: "7725" + in: query + name: user_id + type: string + - description: ' ' + in: body + name: post_body + schema: + $ref: '#/definitions/handler.UptimeKuma.body' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handler.UptimeKuma.response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/ginresp.apiError' + "401": + description: The user_id was not found or the user_key is wrong + schema: + $ref: '#/definitions/ginresp.apiError' + "403": + description: The user has exceeded its daily quota - wait 24 hours or upgrade + your account + schema: + $ref: '#/definitions/ginresp.apiError' + "500": + description: An internal server error occurred - try again later + schema: + $ref: '#/definitions/ginresp.apiError' + summary: Send a new message + tags: + - External /send: post: description: All parameter can be set via query-parameter or the json body. @@ -2535,53 +2583,91 @@ paths: description: All parameter can be set via query-parameter or form-data body. Only UserID, UserKey and Title are required parameters: - - in: query + - example: test + in: query + name: channel + type: string + - example: This is a message + in: query name: content type: string - - in: query + - example: P3TNH8mvv14fm + in: query + name: key + type: string + - example: db8b0e6a-a08c-4646 + in: query name: msg_id type: string - - in: query + - enum: + - 0 + - 1 + - 2 + example: 1 + in: query name: priority type: integer - - in: query + - example: example-server + in: query + name: sender_name + type: string + - example: 1669824037 + in: query name: timestamp type: number - - in: query + - example: Hello World + in: query name: title type: string - - in: query + - example: "7725" + in: query name: user_id - type: integer - - in: query - name: user_key type: string - - in: formData + - example: test + in: formData + name: channel + type: string + - example: This is a message + in: formData name: content type: string - - in: formData + - example: P3TNH8mvv14fm + in: formData + name: key + type: string + - example: db8b0e6a-a08c-4646 + in: formData name: msg_id type: string - - in: formData + - enum: + - 0 + - 1 + - 2 + example: 1 + in: formData name: priority type: integer - - in: formData + - example: example-server + in: formData + name: sender_name + type: string + - example: 1669824037 + in: formData name: timestamp type: number - - in: formData + - example: Hello World + in: formData name: title type: string - - in: formData + - example: "7725" + in: formData name: user_id - type: integer - - in: formData - name: user_key type: string responses: "200": description: OK schema: - $ref: '#/definitions/handler.SendMessageCompat.response' + $ref: '#/definitions/handler.SendMessage.response' "400": description: Bad Request schema: @@ -2601,49 +2687,6 @@ paths: summary: Send a new message (compatibility) tags: - External - /webhook/uptime-kuma: - post: - description: All parameter can be set via query-parameter or the json body. - Only UserID, UserKey and Title are required - parameters: - - example: P3TNH8mvv14fm - in: query - name: key - type: string - - example: "7725" - in: query - name: user_id - type: string - - description: ' ' - in: body - name: post_body - schema: - $ref: '#/definitions/handler.UptimeKumaWebHook.uptimeKumaWebhookBody' - responses: - "200": - description: OK - schema: - type: object - "400": - description: Bad Request - schema: - $ref: '#/definitions/ginresp.apiError' - "401": - description: The user_id was not found or the user_key is wrong - schema: - $ref: '#/definitions/ginresp.apiError' - "403": - description: The user has exceeded its daily quota - wait 24 hours or upgrade - your account - schema: - $ref: '#/definitions/ginresp.apiError' - "500": - description: An internal server error occurred - try again later - schema: - $ref: '#/definitions/ginresp.apiError' - summary: Send a new message - tags: - - External swagger: "2.0" tags: - name: External