From a0ab1fe8d8edcde83302de7c32f3f687fb007c13 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Wed, 18 Jan 2023 15:17:59 -0900 Subject: [PATCH] qrcode support --- backend/app/api/handlers/v1/QRIcon.png | Bin 0 -> 4589 bytes backend/app/api/handlers/v1/v1_ctrl_qrcode.go | 68 ++++++++++++++++++ backend/app/api/routes.go | 6 ++ backend/app/api/static/docs/docs.go | 32 +++++++++ backend/app/api/static/docs/swagger.json | 32 +++++++++ backend/app/api/static/docs/swagger.yaml | 19 +++++ backend/go.mod | 7 ++ backend/go.sum | 23 ++++-- 8 files changed, 181 insertions(+), 6 deletions(-) create mode 100644 backend/app/api/handlers/v1/QRIcon.png create mode 100644 backend/app/api/handlers/v1/v1_ctrl_qrcode.go diff --git a/backend/app/api/handlers/v1/QRIcon.png b/backend/app/api/handlers/v1/QRIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..016ceafe14e2535f15fc2d29e9264b8f9fde1607 GIT binary patch literal 4589 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 C>IhW; literal 0 HcmV?d00001 diff --git a/backend/app/api/handlers/v1/v1_ctrl_qrcode.go b/backend/app/api/handlers/v1/v1_ctrl_qrcode.go new file mode 100644 index 0000000..d8e83a5 --- /dev/null +++ b/backend/app/api/handlers/v1/v1_ctrl_qrcode.go @@ -0,0 +1,68 @@ +package v1 + +import ( + "bytes" + "image/png" + "io" + "io/ioutil" + "net/http" + + "github.com/hay-kot/homebox/backend/internal/sys/validate" + "github.com/hay-kot/homebox/backend/pkgs/server" + "github.com/yeqown/go-qrcode/v2" + "github.com/yeqown/go-qrcode/writer/standard" + + _ "embed" +) + +//go:embed QRIcon.png +var qrcodeLogo []byte + +// HandleGenerateQRCode godoc +// +// @Summary Encode data into QRCode +// @Tags Items +// @Produce json +// @Param data query string false "data to be encoded into qrcode" +// @Success 200 {string} string "image/jpeg" +// @Router /v1/qrcode [GET] +// @Security Bearer +func (ctrl *V1Controller) HandleGenerateQRCode() server.HandlerFunc { + const MaxLength = 4_296 // assume alphanumeric characters only + + return func(w http.ResponseWriter, r *http.Request) error { + data := r.URL.Query().Get("data") + + image, err := png.Decode(bytes.NewReader(qrcodeLogo)) + if err != nil { + panic(err) + } + + if len(data) > MaxLength { + return validate.NewFieldErrors(validate.FieldError{ + Field: "data", + Error: "max length is 4,296 characters exceeded", + }) + } + + qrc, err := qrcode.New(data) + if err != nil { + return err + } + + toWriteCloser := struct { + io.Writer + io.Closer + }{ + Writer: w, + Closer: ioutil.NopCloser(nil), + } + + qrwriter := standard.NewWithWriter(toWriteCloser, standard.WithLogoImage(image)) + + // Return the QR code as a jpeg image + w.Header().Set("Content-Type", "image/jpeg") + w.Header().Set("Content-Disposition", "attachment; filename=qrcode.jpg") + return qrc.Save(qrwriter) + } +} diff --git a/backend/app/api/routes.go b/backend/app/api/routes.go index 9c71d0f..b5ae495 100644 --- a/backend/app/api/routes.go +++ b/backend/app/api/routes.go @@ -119,6 +119,12 @@ func (a *app) mountRoutes(repos *repo.AllRepos) { a.server.Get(v1Base("/asset/{id}"), v1Ctrl.HandleAssetGet(), userMW...) + // Asset-Like endpoints + a.server.Get( + v1Base("/qrcode"), + v1Ctrl.HandleGenerateQRCode(), + a.mwAuthToken, a.mwRoles(RoleModeOr, authroles.RoleUser.String(), authroles.RoleAttachments.String()), + ) a.server.Get( v1Base("/items/{id}/attachments/{attachment_id}"), v1Ctrl.HandleItemAttachmentGet(), diff --git a/backend/app/api/static/docs/docs.go b/backend/app/api/static/docs/docs.go index 466f3f5..4aa7410 100644 --- a/backend/app/api/static/docs/docs.go +++ b/backend/app/api/static/docs/docs.go @@ -1146,6 +1146,38 @@ const docTemplate = `{ } } }, + "/v1/qrcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Encode data into QRCode", + "parameters": [ + { + "type": "string", + "description": "data to be encoded into qrcode", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/jpeg", + "schema": { + "type": "string" + } + } + } + } + }, "/v1/status": { "get": { "produces": [ diff --git a/backend/app/api/static/docs/swagger.json b/backend/app/api/static/docs/swagger.json index 2693a8b..6e2c0cf 100644 --- a/backend/app/api/static/docs/swagger.json +++ b/backend/app/api/static/docs/swagger.json @@ -1138,6 +1138,38 @@ } } }, + "/v1/qrcode": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Items" + ], + "summary": "Encode data into QRCode", + "parameters": [ + { + "type": "string", + "description": "data to be encoded into qrcode", + "name": "data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "image/jpeg", + "schema": { + "type": "string" + } + } + } + } + }, "/v1/status": { "get": { "produces": [ diff --git a/backend/app/api/static/docs/swagger.yaml b/backend/app/api/static/docs/swagger.yaml index 7be39e2..a6ef340 100644 --- a/backend/app/api/static/docs/swagger.yaml +++ b/backend/app/api/static/docs/swagger.yaml @@ -1301,6 +1301,25 @@ paths: summary: updates a location tags: - Locations + /v1/qrcode: + get: + parameters: + - description: data to be encoded into qrcode + in: query + name: data + type: string + produces: + - application/json + responses: + "200": + description: image/jpeg + schema: + type: string + security: + - Bearer: [] + summary: Encode data into QRCode + tags: + - Items /v1/status: get: produces: diff --git a/backend/go.mod b/backend/go.mod index 648f326..4030e48 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -14,6 +14,8 @@ require ( github.com/stretchr/testify v1.8.1 github.com/swaggo/http-swagger v1.3.3 github.com/swaggo/swag v1.8.9 + github.com/yeqown/go-qrcode/v2 v2.2.1 + github.com/yeqown/go-qrcode/writer/standard v1.2.1 golang.org/x/crypto v0.5.0 ) @@ -22,6 +24,7 @@ require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fogleman/gg v1.3.0 // indirect github.com/go-openapi/inflect v0.19.0 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect @@ -29,6 +32,7 @@ require ( github.com/go-openapi/swag v0.22.3 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/hashicorp/hcl/v2 v2.15.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -37,9 +41,12 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/swaggo/files v1.0.0 // indirect + github.com/yeqown/reedsolomon v1.0.0 // indirect github.com/zclconf/go-cty v1.12.1 // indirect + golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect golang.org/x/mod v0.7.0 // indirect golang.org/x/net v0.5.0 // indirect golang.org/x/sys v0.4.0 // indirect diff --git a/backend/go.sum b/backend/go.sum index a797887..c3313f6 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,11 +1,5 @@ -ariga.io/atlas v0.8.3 h1:nddOywkhr/62Cwa+UsGgO35lAhUYh52XGVsbFwGzWZM= -ariga.io/atlas v0.8.3/go.mod h1:T230JFcENj4ZZzMkZrXFDSkv+2kXkUgpJ5FQQ5hMcKU= -ariga.io/atlas v0.8.4-0.20221212165942-e53dd27a603d h1:eAmX+el+OOTP5Y3ep9kmdj7Db6+0aHbT0LIYyPtcboU= -ariga.io/atlas v0.8.4-0.20221212165942-e53dd27a603d/go.mod h1:T230JFcENj4ZZzMkZrXFDSkv+2kXkUgpJ5FQQ5hMcKU= ariga.io/atlas v0.9.0 h1:q0JMtqyA3X1YWtPcn+E/kVPwLDslb+jAC8Ejl/vW6d0= ariga.io/atlas v0.9.0/go.mod h1:T230JFcENj4ZZzMkZrXFDSkv+2kXkUgpJ5FQQ5hMcKU= -entgo.io/ent v0.11.4 h1:grwVY0fp31BZ6oEo3YrXenAuv8VJmEw7F/Bi6WqeH3Q= -entgo.io/ent v0.11.4/go.mod h1:fnQIXL36RYnCk/9nvG4aE7YHBFZhCycfh7wMjY5p7SE= entgo.io/ent v0.11.5 h1:V2qhG91C4PMQTa82Q4StoESMQ4dzkMNeStCzszxi0jQ= entgo.io/ent v0.11.5/go.mod h1:u7eKwNWAo/VlHIKxgwbmsFy3J7cKDxwi3jyF5TW/okY= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= @@ -22,6 +16,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 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/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= @@ -47,6 +43,8 @@ github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJ github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -79,12 +77,15 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 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= @@ -95,6 +96,8 @@ github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 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= @@ -111,6 +114,12 @@ github.com/swaggo/http-swagger v1.3.3 h1:Hu5Z0L9ssyBLofaama21iYaF2VbWyA8jdohaaCG github.com/swaggo/http-swagger v1.3.3/go.mod h1:sE+4PjD89IxMPm77FnkDz0sdO+p5lbXzrVWT6OTVVGo= github.com/swaggo/swag v1.8.9 h1:kHtaBe/Ob9AZzAANfcn5c6RyCke9gG9QpH0jky0I/sA= github.com/swaggo/swag v1.8.9/go.mod h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk= +github.com/yeqown/go-qrcode/v2 v2.2.1 h1:Jc1Q916fwC05R8C7mpWDbrT9tyLPaLLKDABoC5XBCe8= +github.com/yeqown/go-qrcode/v2 v2.2.1/go.mod h1:2Qsk2APUCPne0TsRo40DIkI5MYnbzYKCnKGEFWrxd24= +github.com/yeqown/go-qrcode/writer/standard v1.2.1 h1:FMRZiur5yApUIe4fqtqmcdl/XQTZAZWt2DhkPx4VIW0= +github.com/yeqown/go-qrcode/writer/standard v1.2.1/go.mod h1:ZelyDFiVymrauRjUn454iF7bjsabmB1vixkDA5kq2bw= +github.com/yeqown/reedsolomon v1.0.0 h1:x1h/Ej/uJnNu8jaX7GLHBWmZKCAWjEJTetkqaabr4B0= +github.com/yeqown/reedsolomon v1.0.0/go.mod h1:P76zpcn2TCuL0ul1Fso373qHRc69LKwAw/Iy6g1WiiM= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zclconf/go-cty v1.12.1 h1:PcupnljUm9EIvbgSHQnHhUr3fO6oFmkOrvs2BAFNXXY= github.com/zclconf/go-cty v1.12.1/go.mod h1:s9IfD1LK5ccNMSWCVFCE2rJfHiZgi7JijgeWIMfhLvA= @@ -119,6 +128,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=