From f1c8eb82b8af9a64a00ae619c8a811ef465a09eb Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 1 Sep 2023 21:51:30 +0100 Subject: [PATCH] Implement web-server --- generation/generate.go | 5 +++ main.go | 3 ++ strings/wifi.go | 22 ++++++++++++ validation/validate.go | 1 + web/server.go | 78 ++++++++++++++++++++++++++++++++++++++++++ web/types.go | 9 +++++ 6 files changed, 118 insertions(+) create mode 100644 web/server.go create mode 100644 web/types.go diff --git a/generation/generate.go b/generation/generate.go index 5a0a729..45d739f 100644 --- a/generation/generate.go +++ b/generation/generate.go @@ -27,5 +27,10 @@ func Generate(parameters Parameters) (barcode.Barcode, error) { fmt.Println("Unsupported barcode type: ", parameters.Format) } + if err != nil { + fmt.Println("Generation Error: ", err) + return nil, err + } + fmt.Println("Barcode Generated") return barcode_content, err } diff --git a/main.go b/main.go index 2ef85fa..b93bbe9 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "git.fjla.uk/fred.boniface/barcodes/generation" "git.fjla.uk/fred.boniface/barcodes/validation" + "git.fjla.uk/fred.boniface/barcodes/web" ) func main() { @@ -46,4 +47,6 @@ func main() { defer file.Close() png.Encode(file, generated_barcode) + web.StartServer() + } diff --git a/strings/wifi.go b/strings/wifi.go index e152b4b..4cc0542 100644 --- a/strings/wifi.go +++ b/strings/wifi.go @@ -1 +1,23 @@ package strings + +import "fmt" + +type Encryption string + +const ( + WEP Encryption = "wep" + WPA Encryption = "wpa" + None Encryption = "" +) + +type WiFi struct { + Ssid string + Password string + Hidden bool + Encryption Encryption +} + +func FormatWiFi(input WiFi) string { + content := fmt.Sprintf("WIFI:T:%s;S:%s;P:%s;H:%t;", input.Encryption, input.Ssid, input.Password, input.Hidden) + return content +} diff --git a/validation/validate.go b/validation/validate.go index 3a85818..fb7b48f 100644 --- a/validation/validate.go +++ b/validation/validate.go @@ -24,5 +24,6 @@ func Validate(input string, format string) bool { return false } + fmt.Printf("Validation passed for barcode type %s\n", format) return true } diff --git a/web/server.go b/web/server.go new file mode 100644 index 0000000..0dd33c7 --- /dev/null +++ b/web/server.go @@ -0,0 +1,78 @@ +package web + +import ( + "encoding/json" + "fmt" + "image" + "image/png" + "net/http" + + "git.fjla.uk/fred.boniface/barcodes/generation" + "git.fjla.uk/fred.boniface/barcodes/validation" + "github.com/boombuler/barcode" +) + +func StartServer() { + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Barcodes") + }) + + http.HandleFunc("/generate", generateBarcode) + + port := ":8500" + fmt.Printf("Server listening on port %s\n", port) + + err := http.ListenAndServe(port, nil) + if err != nil { + fmt.Println("Error: ", err) + } +} + +func generateBarcode(w http.ResponseWriter, r *http.Request) { + var req BarcodeRequest + err := json.NewDecoder(r.Body).Decode(&req) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + parameters := generation.Parameters{ + Format: generation.BarcodeType(req.BarcodeType), + ECCLevel: generation.ECCLevel(req.ECCLevel), + Content: req.Content, + } + + validate := validation.Validate(req.Content, req.BarcodeType) + if !validate { + fmt.Println("Validation Failed") + http.Error(w, "Validation Failed", http.StatusBadRequest) + return + } + + barcodeGen, err := generation.Generate(parameters) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if barcodeGen == nil { + fmt.Println("Generation failed, no barcode created") + http.Error(w, "Barcode Generation Failed", http.StatusInternalServerError) + return + } + + barcodeGen, _ = barcode.Scale(barcodeGen, req.Width, req.Height) + + image, isImage := barcodeGen.(image.Image) + if !isImage { + fmt.Println("Generation failed - no image") + http.Error(w, "Generated Barcode is not an image", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "image/png") + + err = png.Encode(w, image) + if err != nil { + http.Error(w, "Error streaming barcode", http.StatusInternalServerError) + } +} diff --git a/web/types.go b/web/types.go new file mode 100644 index 0000000..4f13d70 --- /dev/null +++ b/web/types.go @@ -0,0 +1,9 @@ +package web + +type BarcodeRequest struct { + BarcodeType string `json:"barcode_type"` + Width int `json:"width"` + Height int `json:"height"` + ECCLevel int `json:"ecc_level"` + Content string `json:"content"` +}