From 22cafb347b6e4575d770149c12c0579be366e266 Mon Sep 17 00:00:00 2001 From: Finn Date: Wed, 24 Apr 2024 00:15:12 -0700 Subject: [PATCH] Remove no-longer-needed REST endpoints --- db/lock_code_slots.go | 10 - db/user_codes.go | 27 -- frontend/static/main.css | 6 + go.mod | 11 - go.sum | 38 -- httpserver/{browser-endpoints.go => index.go} | 9 +- httpserver/lock.go | 11 + httpserver/server.go | 8 +- httpserver/slots.go | 112 ----- httpserver/user-codes-admin.go | 51 -- oapi-codegen.yaml | 9 - openapi/openapi.go | 454 ------------------ openapi/openapi.yaml | 104 ---- 13 files changed, 22 insertions(+), 828 deletions(-) delete mode 100644 db/lock_code_slots.go delete mode 100644 db/user_codes.go rename httpserver/{browser-endpoints.go => index.go} (76%) create mode 100644 httpserver/lock.go delete mode 100644 httpserver/slots.go delete mode 100644 httpserver/user-codes-admin.go delete mode 100644 oapi-codegen.yaml delete mode 100644 openapi/openapi.go delete mode 100644 openapi/openapi.yaml diff --git a/db/lock_code_slots.go b/db/lock_code_slots.go deleted file mode 100644 index 54b1826..0000000 --- a/db/lock_code_slots.go +++ /dev/null @@ -1,10 +0,0 @@ -package db - -import "git.janky.solutions/finn/lockserver/openapi" - -func (l LockCodeSlot) OpenAPI() openapi.LockCodeSlot { - return openapi.LockCodeSlot{ - Code: l.Code, - Enabled: l.Enabled, - } -} diff --git a/db/user_codes.go b/db/user_codes.go deleted file mode 100644 index 5b1aa0b..0000000 --- a/db/user_codes.go +++ /dev/null @@ -1,27 +0,0 @@ -package db - -import ( - "time" - - "git.janky.solutions/finn/lockserver/openapi" -) - -func (u GetAllUserCodesRow) OpenAPI() openapi.UserCode { - resp := openapi.UserCode{Code: &u.Code} - - if u.Name.Valid { - resp.User = &u.Name.String - } - - if u.Start.Valid { - start := u.Start.Time.Format(time.RFC3339) - resp.Starts = &start - } - - if u.End.Valid { - end := u.End.Time.Format(time.RFC3339) - resp.Ends = &end - } - - return resp -} diff --git a/frontend/static/main.css b/frontend/static/main.css index 1db3f2a..33271c9 100644 --- a/frontend/static/main.css +++ b/frontend/static/main.css @@ -1,6 +1,12 @@ html, body { height: 100%; margin: 0; + background-color: #1c1c1c; + color: #fff; +} + +a { + color: #fff; } #wrapper { diff --git a/go.mod b/go.mod index e959c8b..07fd583 100644 --- a/go.mod +++ b/go.mod @@ -4,32 +4,22 @@ go 1.21.8 require ( github.com/failsafe-go/failsafe-go v0.6.2 - github.com/getkin/kin-openapi v0.124.0 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.1 github.com/labstack/echo/v4 v4.11.4 - github.com/oapi-codegen/runtime v1.1.1 github.com/pressly/goose/v3 v3.19.2 github.com/sirupsen/logrus v1.9.3 modernc.org/sqlite v1.29.5 ) require ( - github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/swag v0.22.8 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/invopop/yaml v0.2.0 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/labstack/gommon v0.4.2 // indirect - github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect - github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -40,7 +30,6 @@ require ( golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect modernc.org/libc v1.41.0 // indirect modernc.org/mathutil v1.6.0 // indirect diff --git a/go.sum b/go.sum index c554c57..eeabfff 100644 --- a/go.sum +++ b/go.sum @@ -10,14 +10,10 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= -github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= @@ -41,20 +37,12 @@ github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUt github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/failsafe-go/failsafe-go v0.6.2 h1:zRyfYykM080+h40uUuf9HYLRn7vpnR+wjcg68fhwD28= github.com/failsafe-go/failsafe-go v0.6.2/go.mod h1:UCRnPYTVzBt7QGPFAAmFZUtB49dCLVFt38YYzGHXBCA= -github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M= -github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw= -github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= github.com/go-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4= github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -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/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= @@ -74,8 +62,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -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/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -88,23 +74,14 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8 github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8= github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 h1:6PfEMwfInASh9hkN83aR0j4W/eKaAZt/AURtXAXlas0= github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475/go.mod h1:20nXSmcf0nAscrzqsXeC2/tA3KkV2eCiJqYuyAgl+ss= -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.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -118,12 +95,8 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -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/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= -github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= @@ -134,8 +107,6 @@ github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4a github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s= github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= -github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -148,8 +119,6 @@ github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= @@ -158,16 +127,12 @@ github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5g github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898 h1:1MvEhzI5pvP27e9Dzz861mxk9WzXZLSJwzOU67cKTbU= github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898/go.mod h1:9bKuHS7eZh/0mJndbUOrCx8Ej3PlsRDszj4L7oVYMPQ= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= @@ -216,12 +181,9 @@ google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9Y 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= diff --git a/httpserver/browser-endpoints.go b/httpserver/index.go similarity index 76% rename from httpserver/browser-endpoints.go rename to httpserver/index.go index 818cc5f..fbf6b0c 100644 --- a/httpserver/browser-endpoints.go +++ b/httpserver/index.go @@ -10,25 +10,18 @@ import ( "git.janky.solutions/finn/lockserver/frontend" ) -type browserEndpoints struct{} - type baseTemplateData struct { Username string UserDisplayName string } -func (b browserEndpoints) Register(e *echo.Echo) { - e.GET("/", b.Index) - e.StaticFS("/static", frontend.Static) -} - type indexTemplateData struct { baseTemplateData Locks []db.Lock } -func (browserEndpoints) Index(c echo.Context) error { +func indexHandler(c echo.Context) error { queries, dbc, err := db.Get() if err != nil { return err diff --git a/httpserver/lock.go b/httpserver/lock.go new file mode 100644 index 0000000..626bb75 --- /dev/null +++ b/httpserver/lock.go @@ -0,0 +1,11 @@ +package httpserver + +import ( + "errors" + + echo "github.com/labstack/echo/v4" +) + +func lockHandler(c echo.Context) error { + return errors.New("not yet implemented") +} diff --git a/httpserver/server.go b/httpserver/server.go index 2ed1e6b..6b01e18 100644 --- a/httpserver/server.go +++ b/httpserver/server.go @@ -11,7 +11,7 @@ import ( "github.com/sirupsen/logrus" "git.janky.solutions/finn/lockserver/config" - "git.janky.solutions/finn/lockserver/openapi" + "git.janky.solutions/finn/lockserver/frontend" "git.janky.solutions/finn/lockserver/zwavejs" ) @@ -28,9 +28,9 @@ func ListenAndServe(client *zwavejs.Client) { server.HTTPErrorHandler = handleError server.Use(accessLogMiddleware) - browserEndpoints{}.Register(server) - - openapi.RegisterHandlersWithBaseURL(server, lockserver{ZWaveJS: client}, "/api") + server.StaticFS("/static", frontend.Static) + server.GET("/", indexHandler) + server.GET("/locks/{id}", lockHandler) logrus.WithField("address", config.C.HTTPBind).Info("starting http server") err := server.Start(config.C.HTTPBind) diff --git a/httpserver/slots.go b/httpserver/slots.go deleted file mode 100644 index 978dac6..0000000 --- a/httpserver/slots.go +++ /dev/null @@ -1,112 +0,0 @@ -package httpserver - -import ( - "net/http" - - echo "github.com/labstack/echo/v4" - - "git.janky.solutions/finn/lockserver/db" - "git.janky.solutions/finn/lockserver/openapi" - "git.janky.solutions/finn/lockserver/zwavejs" -) - -func (lockserver) GetLockCodeSlot(c echo.Context, lock int, slot int) error { - queries, dbc, err := db.Get() - if err != nil { - return err - } - defer dbc.Close() - - slotData, err := queries.GetLockCodeBySlot(c.Request().Context(), db.GetLockCodeBySlotParams{ - Lock: int64(lock), - Slot: int64(slot), - }) - if err != nil { - return err - } - - return c.JSON(http.StatusFound, slotData.OpenAPI()) -} - -func (l lockserver) PutLockCodeSlot(c echo.Context, lockID int, slot int) error { - queries, dbc, err := db.Get() - if err != nil { - return err - } - defer dbc.Close() - - var body openapi.LockCodeSlot - if err := c.Bind(&body); err != nil { - return err - } - - ctx := c.Request().Context() - - lock, err := queries.GetLock(ctx, int64(lockID)) - if err != nil { - return err - } - - // sample from https://github.com/FutureTense/keymaster/blob/f4f1046bddb7901cbd3ce7820886be1ff7895fe7/tests/test_services.py#L88 - // - // { - // "ccVersion": 1, - // "commandClassName": "User Code", - // "commandClass": 99, - // "endpoint": 0, - // "property": "userCode", - // "propertyName": "userCode", - // "propertyKey": 1, - // "propertyKeyName": "1", - // "metadata": { - // "type": "string", - // "readable": True, - // "writeable": True, - // "minLength": 4, - // "maxLength": 10, - // "label": "User Code (1)", - // }, - // "value": "123456", - // } - err = l.ZWaveJS.SetNodeValue(ctx, int(lock.ZwaveDeviceID), zwavejs.NodeValue{ - CCVersion: 1, - CommandClassName: zwavejs.CommandClassNameUserCode, - CommandClass: zwavejs.CommandClassUserCode, - Endpoint: 0, - Property: zwavejs.AnyType{Type: zwavejs.AnyTypeString, String: string(zwavejs.PropertyUserCode)}, - PropertyName: zwavejs.AnyType{Type: zwavejs.AnyTypeString, String: string(zwavejs.PropertyUserCode)}, - PropertyKey: zwavejs.AnyType{Type: zwavejs.AnyTypeInt, Int: slot}, - }, zwavejs.AnyType{Type: zwavejs.AnyTypeString, String: body.Code}) - if err != nil { - return err - } - - enabled := 0 - if body.Enabled { - enabled = 1 - } - err = l.ZWaveJS.SetNodeValue(ctx, int(lock.ZwaveDeviceID), zwavejs.NodeValue{ - CCVersion: 1, - CommandClassName: zwavejs.CommandClassNameUserCode, - CommandClass: zwavejs.CommandClassUserCode, - Endpoint: 0, - Property: zwavejs.AnyType{Type: zwavejs.AnyTypeString, String: string(zwavejs.PropertyUserIDStatus)}, - PropertyName: zwavejs.AnyType{Type: zwavejs.AnyTypeString, String: string(zwavejs.PropertyUserIDStatus)}, - PropertyKey: zwavejs.AnyType{Type: zwavejs.AnyTypeInt, Int: slot}, - }, zwavejs.AnyType{Type: zwavejs.AnyTypeInt, Int: enabled}) - if err != nil { - return err - } - - err = queries.UpsertCodeSlot(ctx, db.UpsertCodeSlotParams{ - Lock: lock.ID, - Slot: int64(slot), - Code: body.Code, - Enabled: body.Enabled, - }) - if err != nil { - return err - } - - return c.JSON(http.StatusOK, body) -} diff --git a/httpserver/user-codes-admin.go b/httpserver/user-codes-admin.go deleted file mode 100644 index 09d751a..0000000 --- a/httpserver/user-codes-admin.go +++ /dev/null @@ -1,51 +0,0 @@ -package httpserver - -import ( - "database/sql" - "errors" - "net/http" - - "git.janky.solutions/finn/lockserver/db" - "git.janky.solutions/finn/lockserver/openapi" - echo "github.com/labstack/echo/v4" -) - -func (l lockserver) AddUserCode(c echo.Context) error { - queries, dbc, err := db.Get() - if err != nil { - return err - } - defer dbc.Close() - ctx := c.Request().Context() - - if _, err = queries.CreateUserCode(ctx, db.CreateUserCodeParams{}); err != nil { - return err - } - - return c.NoContent(http.StatusInternalServerError) -} - -func (l lockserver) GetAllUserCodes(c echo.Context) error { - queries, dbc, err := db.Get() - if err != nil { - return err - } - defer dbc.Close() - ctx := c.Request().Context() - - resp := []openapi.UserCode{} - - codes, err := queries.GetAllUserCodes(ctx) - if err != nil { - if errors.Is(err, sql.ErrNoRows) { - return c.JSON(http.StatusOK, resp) - } - return err - } - - for _, code := range codes { - resp = append(resp, code.OpenAPI()) - } - - return c.JSON(http.StatusOK, resp) -} diff --git a/oapi-codegen.yaml b/oapi-codegen.yaml deleted file mode 100644 index 78d9210..0000000 --- a/oapi-codegen.yaml +++ /dev/null @@ -1,9 +0,0 @@ -package: openapi -generate: - models: true - embedded-spec: true - strict-server: true - echo-server: true -output-options: - skip-prune: true -output: openapi/openapi.go diff --git a/openapi/openapi.go b/openapi/openapi.go deleted file mode 100644 index af53b53..0000000 --- a/openapi/openapi.go +++ /dev/null @@ -1,454 +0,0 @@ -// Package openapi provides primitives to interact with the openapi HTTP API. -// -// Code generated by github.com/deepmap/oapi-codegen/v2 version v2.1.0 DO NOT EDIT. -package openapi - -import ( - "bytes" - "compress/gzip" - "context" - "encoding/base64" - "encoding/json" - "fmt" - "net/http" - "net/url" - "path" - "strings" - - "github.com/getkin/kin-openapi/openapi3" - "github.com/labstack/echo/v4" - "github.com/oapi-codegen/runtime" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" -) - -// LockCodeSlot defines model for LockCodeSlot. -type LockCodeSlot struct { - Code string `json:"code"` - Enabled bool `json:"enabled"` -} - -// UserCode defines model for UserCode. -type UserCode struct { - Code *string `json:"code,omitempty"` - - // Ends when the code expires - Ends *string `json:"ends,omitempty"` - - // Starts when the code becomes active - Starts *string `json:"starts,omitempty"` - User *string `json:"user,omitempty"` -} - -// AddUserCodeJSONRequestBody defines body for AddUserCode for application/json ContentType. -type AddUserCodeJSONRequestBody = UserCode - -// PutLockCodeSlotJSONRequestBody defines body for PutLockCodeSlot for application/json ContentType. -type PutLockCodeSlotJSONRequestBody = LockCodeSlot - -// ServerInterface represents all server handlers. -type ServerInterface interface { - - // (GET /admin/user-codes) - GetAllUserCodes(ctx echo.Context) error - - // (POST /admin/user-codes) - AddUserCode(ctx echo.Context) error - - // (GET /locks/{lock}/slots/{slot}) - GetLockCodeSlot(ctx echo.Context, lock int, slot int) error - - // (PUT /locks/{lock}/slots/{slot}) - PutLockCodeSlot(ctx echo.Context, lock int, slot int) error -} - -// ServerInterfaceWrapper converts echo contexts to parameters. -type ServerInterfaceWrapper struct { - Handler ServerInterface -} - -// GetAllUserCodes converts echo context to params. -func (w *ServerInterfaceWrapper) GetAllUserCodes(ctx echo.Context) error { - var err error - - // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetAllUserCodes(ctx) - return err -} - -// AddUserCode converts echo context to params. -func (w *ServerInterfaceWrapper) AddUserCode(ctx echo.Context) error { - var err error - - // Invoke the callback with all the unmarshaled arguments - err = w.Handler.AddUserCode(ctx) - return err -} - -// GetLockCodeSlot converts echo context to params. -func (w *ServerInterfaceWrapper) GetLockCodeSlot(ctx echo.Context) error { - var err error - // ------------- Path parameter "lock" ------------- - var lock int - - err = runtime.BindStyledParameterWithOptions("simple", "lock", ctx.Param("lock"), &lock, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter lock: %s", err)) - } - - // ------------- Path parameter "slot" ------------- - var slot int - - err = runtime.BindStyledParameterWithOptions("simple", "slot", ctx.Param("slot"), &slot, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter slot: %s", err)) - } - - // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetLockCodeSlot(ctx, lock, slot) - return err -} - -// PutLockCodeSlot converts echo context to params. -func (w *ServerInterfaceWrapper) PutLockCodeSlot(ctx echo.Context) error { - var err error - // ------------- Path parameter "lock" ------------- - var lock int - - err = runtime.BindStyledParameterWithOptions("simple", "lock", ctx.Param("lock"), &lock, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter lock: %s", err)) - } - - // ------------- Path parameter "slot" ------------- - var slot int - - err = runtime.BindStyledParameterWithOptions("simple", "slot", ctx.Param("slot"), &slot, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter slot: %s", err)) - } - - // Invoke the callback with all the unmarshaled arguments - err = w.Handler.PutLockCodeSlot(ctx, lock, slot) - return err -} - -// This is a simple interface which specifies echo.Route addition functions which -// are present on both echo.Echo and echo.Group, since we want to allow using -// either of them for path registration -type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route -} - -// RegisterHandlers adds each server route to the EchoRouter. -func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") -} - -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. -func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { - - wrapper := ServerInterfaceWrapper{ - Handler: si, - } - - router.GET(baseURL+"/admin/user-codes", wrapper.GetAllUserCodes) - router.POST(baseURL+"/admin/user-codes", wrapper.AddUserCode) - router.GET(baseURL+"/locks/:lock/slots/:slot", wrapper.GetLockCodeSlot) - router.PUT(baseURL+"/locks/:lock/slots/:slot", wrapper.PutLockCodeSlot) - -} - -type GetAllUserCodesRequestObject struct { -} - -type GetAllUserCodesResponseObject interface { - VisitGetAllUserCodesResponse(w http.ResponseWriter) error -} - -type GetAllUserCodes200JSONResponse []UserCode - -func (response GetAllUserCodes200JSONResponse) VisitGetAllUserCodesResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) -} - -type AddUserCodeRequestObject struct { - Body *AddUserCodeJSONRequestBody -} - -type AddUserCodeResponseObject interface { - VisitAddUserCodeResponse(w http.ResponseWriter) error -} - -type AddUserCode201JSONResponse UserCode - -func (response AddUserCode201JSONResponse) VisitAddUserCodeResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(201) - - return json.NewEncoder(w).Encode(response) -} - -type GetLockCodeSlotRequestObject struct { - Lock int `json:"lock"` - Slot int `json:"slot"` -} - -type GetLockCodeSlotResponseObject interface { - VisitGetLockCodeSlotResponse(w http.ResponseWriter) error -} - -type GetLockCodeSlot200JSONResponse LockCodeSlot - -func (response GetLockCodeSlot200JSONResponse) VisitGetLockCodeSlotResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) -} - -type PutLockCodeSlotRequestObject struct { - Lock int `json:"lock"` - Slot int `json:"slot"` - Body *PutLockCodeSlotJSONRequestBody -} - -type PutLockCodeSlotResponseObject interface { - VisitPutLockCodeSlotResponse(w http.ResponseWriter) error -} - -// StrictServerInterface represents all server handlers. -type StrictServerInterface interface { - - // (GET /admin/user-codes) - GetAllUserCodes(ctx context.Context, request GetAllUserCodesRequestObject) (GetAllUserCodesResponseObject, error) - - // (POST /admin/user-codes) - AddUserCode(ctx context.Context, request AddUserCodeRequestObject) (AddUserCodeResponseObject, error) - - // (GET /locks/{lock}/slots/{slot}) - GetLockCodeSlot(ctx context.Context, request GetLockCodeSlotRequestObject) (GetLockCodeSlotResponseObject, error) - - // (PUT /locks/{lock}/slots/{slot}) - PutLockCodeSlot(ctx context.Context, request PutLockCodeSlotRequestObject) (PutLockCodeSlotResponseObject, error) -} - -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc - -func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { - return &strictHandler{ssi: ssi, middlewares: middlewares} -} - -type strictHandler struct { - ssi StrictServerInterface - middlewares []StrictMiddlewareFunc -} - -// GetAllUserCodes operation middleware -func (sh *strictHandler) GetAllUserCodes(ctx echo.Context) error { - var request GetAllUserCodesRequestObject - - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetAllUserCodes(ctx.Request().Context(), request.(GetAllUserCodesRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetAllUserCodes") - } - - response, err := handler(ctx, request) - - if err != nil { - return err - } else if validResponse, ok := response.(GetAllUserCodesResponseObject); ok { - return validResponse.VisitGetAllUserCodesResponse(ctx.Response()) - } else if response != nil { - return fmt.Errorf("unexpected response type: %T", response) - } - return nil -} - -// AddUserCode operation middleware -func (sh *strictHandler) AddUserCode(ctx echo.Context) error { - var request AddUserCodeRequestObject - - var body AddUserCodeJSONRequestBody - if err := ctx.Bind(&body); err != nil { - return err - } - request.Body = &body - - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { - return sh.ssi.AddUserCode(ctx.Request().Context(), request.(AddUserCodeRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "AddUserCode") - } - - response, err := handler(ctx, request) - - if err != nil { - return err - } else if validResponse, ok := response.(AddUserCodeResponseObject); ok { - return validResponse.VisitAddUserCodeResponse(ctx.Response()) - } else if response != nil { - return fmt.Errorf("unexpected response type: %T", response) - } - return nil -} - -// GetLockCodeSlot operation middleware -func (sh *strictHandler) GetLockCodeSlot(ctx echo.Context, lock int, slot int) error { - var request GetLockCodeSlotRequestObject - - request.Lock = lock - request.Slot = slot - - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetLockCodeSlot(ctx.Request().Context(), request.(GetLockCodeSlotRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetLockCodeSlot") - } - - response, err := handler(ctx, request) - - if err != nil { - return err - } else if validResponse, ok := response.(GetLockCodeSlotResponseObject); ok { - return validResponse.VisitGetLockCodeSlotResponse(ctx.Response()) - } else if response != nil { - return fmt.Errorf("unexpected response type: %T", response) - } - return nil -} - -// PutLockCodeSlot operation middleware -func (sh *strictHandler) PutLockCodeSlot(ctx echo.Context, lock int, slot int) error { - var request PutLockCodeSlotRequestObject - - request.Lock = lock - request.Slot = slot - - var body PutLockCodeSlotJSONRequestBody - if err := ctx.Bind(&body); err != nil { - return err - } - request.Body = &body - - handler := func(ctx echo.Context, request interface{}) (interface{}, error) { - return sh.ssi.PutLockCodeSlot(ctx.Request().Context(), request.(PutLockCodeSlotRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "PutLockCodeSlot") - } - - response, err := handler(ctx, request) - - if err != nil { - return err - } else if validResponse, ok := response.(PutLockCodeSlotResponseObject); ok { - return validResponse.VisitPutLockCodeSlotResponse(ctx.Response()) - } else if response != nil { - return fmt.Errorf("unexpected response type: %T", response) - } - return nil -} - -// Base64 encoded, gzipped, json marshaled Swagger object -var swaggerSpec = []string{ - - "H4sIAAAAAAAC/+RVO2/bMBD+K8S1o2w6bSZtjgsUAToUCDoUQQZaOttMKZI9npwahv57cZQcx4mQB9pO", - "nSiRvMf3OGkPVWhi8Og5QbmHVG2wMfnxS6h+LEKNVy6wvEcKEYkt5tMq1Cgr7yJCCYnJ+jV0BaA3S4f1", - "g7NlCA6Nh64rgPBna0mOr/sUx4Cb4hAQlrdYsST7lpAWQ6VX16/zhRpTRTayDR5KuNugV7xBJXEKf0VL", - "mKB4Gp7YEL+YYIlVaDApU7Hd4lieNiGN9Nc9ASlb1q+CXHa2Qp8yLm8aubVYTC6+T67mk/PpDApoyUEJ", - "G+aYSq0rQiP1q9A0wadpoLUeUiS93Onz6UxLL2zZSTJRNCFtkaCALVLqoc2mZ9OZ3AsRvYkWSviYtwqI", - "hjeZDG3qxnotqCbCQN5cYzaGyGKEpssaSviMPHfuIJxwTJhikJ7k8ofZrJfPM/ocbmJ0tsoJ9G2Sjg42", - "lCfL2OTA94QrKOGdPhpWD27V9zY50muIzK5n91RI45yqWiL0rIyv1arlllAJMtUjy0ExpBFw87q+r9Wb", - "GRNfhHr3Jkyvg9L183LC3dk/qfOYonsu1J1JKrsM66Eh7cREei9Lp5MLnPRelu45R5x8S8RWZBpkpATl", - "9eNJu/ykwkpJfpDJgDK7EIrDSAwnxy8JU4vFA9iDA6xnXCPJzI2XyAhT39FIneHkDXVu/tDrz+l1wuCI", - "ZvPM2ANMvYvbET2+tv+THn9/RF+SQv4SHu/U1rgW1SpQ/m+Mtn864b51TqbsdwAAAP//L1q9IJUHAAA=", -} - -// GetSwagger returns the content of the embedded swagger specification file -// or error if failed to decode -func decodeSpec() ([]byte, error) { - zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, "")) - if err != nil { - return nil, fmt.Errorf("error base64 decoding spec: %w", err) - } - zr, err := gzip.NewReader(bytes.NewReader(zipped)) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %w", err) - } - var buf bytes.Buffer - _, err = buf.ReadFrom(zr) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %w", err) - } - - return buf.Bytes(), nil -} - -var rawSpec = decodeSpecCached() - -// a naive cached of a decoded swagger spec -func decodeSpecCached() func() ([]byte, error) { - data, err := decodeSpec() - return func() ([]byte, error) { - return data, err - } -} - -// Constructs a synthetic filesystem for resolving external references when loading openapi specifications. -func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { - res := make(map[string]func() ([]byte, error)) - if len(pathToFile) > 0 { - res[pathToFile] = rawSpec - } - - return res -} - -// GetSwagger returns the Swagger specification corresponding to the generated code -// in this file. The external references of Swagger specification are resolved. -// The logic of resolving external references is tightly connected to "import-mapping" feature. -// Externally referenced files must be embedded in the corresponding golang packages. -// Urls can be supported but this task was out of the scope. -func GetSwagger() (swagger *openapi3.T, err error) { - resolvePath := PathToRawSpec("") - - loader := openapi3.NewLoader() - loader.IsExternalRefsAllowed = true - loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) { - pathToFile := url.String() - pathToFile = path.Clean(pathToFile) - getSpec, ok := resolvePath[pathToFile] - if !ok { - err1 := fmt.Errorf("path not found: %s", pathToFile) - return nil, err1 - } - return getSpec() - } - var specData []byte - specData, err = rawSpec() - if err != nil { - return - } - swagger, err = loader.LoadFromData(specData) - if err != nil { - return - } - return -} diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml deleted file mode 100644 index fe2e4a6..0000000 --- a/openapi/openapi.yaml +++ /dev/null @@ -1,104 +0,0 @@ -openapi: "3.1.0" -info: - version: 0.1.0 - title: Lockserver - license: - name: CC-BY-SA-4.0 - url: https://creativecommons.org/licenses/by/4.0/ -paths: - /locks/{lock}/slots/{slot}: - get: - operationId: get_lock_code_slot - parameters: - - name: lock - in: path - description: ID of lock - required: true - schema: - type: integer - - name: slot - in: path - description: ID of code slot - required: true - schema: - type: integer - responses: - '200': - description: A lock code slot - content: - application/json: - schema: - $ref: '#/components/schemas/LockCodeSlot' - put: - operationId: put_lock_code_slot - parameters: - - name: lock - in: path - description: ID of lock - required: true - schema: - type: integer - - name: slot - in: path - description: ID of code slot - required: true - schema: - type: integer - requestBody: - description: the new value for the slot - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/LockCodeSlot' - /admin/user-codes: - get: - operationId: get_all_user_codes - responses: - '200': - description: all current and future user codes - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/UserCode' - post: - operationId: add_user_code - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserCode' - responses: - '201': - description: user code was created - content: - application/json: - schema: - $ref: '#/components/schemas/UserCode' -components: - schemas: - LockCodeSlot: - type: object - required: - - code - - enabled - properties: - code: - type: string - enabled: - type: boolean - UserCode: - type: object - properties: - code: - type: string - user: - type: string - starts: - description: when the code becomes active - type: string - ends: - description: when the code expires - type: string