@@ -3,40 +3,56 @@ package http
33import (
44 "encoding/json"
55 "fmt"
6- "log"
6+ "log/slog "
77 "net/http"
88
99 "github.com/etilite/qr-coder/internal/coder"
10+ "github.com/etilite/qr-coder/internal/model"
1011)
1112
1213type QRCodeHandler struct {
14+ encode func (code model.QRCode ) ([]byte , error )
1315}
1416
15- func (h * QRCodeHandler ) handle () http.HandlerFunc {
16- return func (writer http.ResponseWriter , request * http.Request ) {
17- qrCode := coder.QRCode {}
18- err := json .NewDecoder (request .Body ).Decode (& qrCode )
17+ func NewQRCodeHandler () * QRCodeHandler {
18+ return & QRCodeHandler {encode : coder .Encode }
19+ }
1920
20- //writer.Header().Set("Content-Type", "application/json")
21+ func (h * QRCodeHandler ) handle () http.HandlerFunc {
22+ return func (w http.ResponseWriter , r * http.Request ) {
23+ defer func () {
24+ if err := r .Body .Close (); err != nil {
25+ slog .Error ("handler: failed to close request body" , "error" , err )
26+ }
27+ }()
28+
29+ qrCode := model.QRCode {}
30+
31+ if err := json .NewDecoder (r .Body ).Decode (& qrCode ); err != nil {
32+ err = fmt .Errorf ("failed to decode JSON: %v" , err )
33+ slog .Error ("handler: bad request" , "error" , err )
34+ http .Error (w , err .Error (), http .StatusBadRequest )
35+ return
36+ }
2137
22- if err != nil {
23- err = fmt .Errorf ("failed to decode JSON : %w " , err )
24- log . Print ( err )
25- http .Error (writer , err .Error (), http .StatusBadRequest )
38+ if err := qrCode . Validate (); err != nil {
39+ err = fmt .Errorf ("failed to validate QR Code : %v " , err )
40+ slog . Error ( "handler: bad request" , "error" , err )
41+ http .Error (w , err .Error (), http .StatusBadRequest )
2642 return
2743 }
2844
29- //var image []byte
30- image , err := qrCode .Generate ()
45+ image , err := h .encode (qrCode )
3146 if err != nil {
32- writer .WriteHeader (400 )
33- json .NewEncoder (writer ).Encode (
34- fmt .Sprintf ("Could not generate QR code. %v" , err ),
35- )
47+ err = fmt .Errorf ("failed to generate QR-code: %v" , err )
48+ slog .Error ("handler: internal error" , "error" , err )
49+ http .Error (w , err .Error (), http .StatusInternalServerError )
3650 return
3751 }
3852
39- writer .Header ().Set ("Content-Type" , "image/png" )
40- writer .Write (image )
53+ w .Header ().Set ("Content-Type" , "image/png" )
54+ if _ , err := w .Write (image ); err != nil {
55+ slog .Error ("handler: failed to write response" , "error" , err )
56+ }
4157 }
4258}
0 commit comments