diff --git a/services/barcode.go b/services/barcode.go new file mode 100644 index 0000000..2da7e64 --- /dev/null +++ b/services/barcode.go @@ -0,0 +1,69 @@ +package services + +import ( + "bytes" + "fmt" + "image/png" + "slices" + + "github.com/boombuler/barcode" + "github.com/boombuler/barcode/code128" + "github.com/boombuler/barcode/ean" + "github.com/boombuler/barcode/qr" +) + +type BarcodeGenerator interface { + GenerateBarcode(format string, content string) (bytes.Buffer, error) + IsTypeSupported(format string) bool +} + +type DefaultBarcodeGenerator struct { +} + +func (b *DefaultBarcodeGenerator) GenerateBarcode(format string, content string, width int, height int) (bytes.Buffer, error) { + if !b.IsTypeSupported(format) { + return bytes.Buffer{}, fmt.Errorf("unsupported barcode type: %s", format) + } + + var generatedCode barcode.Barcode + var err error + + switch format { + case "ean13": + generatedCode, err = ean.Encode(content) + if err != nil { + return bytes.Buffer{}, err + } + break + case "code128": + generatedCode, err = code128.Encode(content) + if err != nil { + return bytes.Buffer{}, err + } + break + case "qr": + generatedCode, err = qr.Encode(content, qr.M, qr.AlphaNumeric) + if err != nil { + return bytes.Buffer{}, err + } + break + } + + scaledCode, err := barcode.Scale(generatedCode, width, height) + if err != nil { + return bytes.Buffer{}, err + } + + var buf bytes.Buffer + err = png.Encode(&buf, scaledCode) + if err != nil { + return bytes.Buffer{}, err + } + + return buf, nil +} + +func (b *DefaultBarcodeGenerator) IsTypeSupported(format string) bool { + supportedTypes := []string{"ean13", "code128", "qr"} + return slices.Contains(supportedTypes, format) +} diff --git a/services/templater.go b/services/templater.go index d865990..51e0839 100644 --- a/services/templater.go +++ b/services/templater.go @@ -6,13 +6,7 @@ import ( "errors" "fmt" "html/template" - "image/png" "strings" - - "github.com/boombuler/barcode" - "github.com/boombuler/barcode/code128" - "github.com/boombuler/barcode/ean" - "github.com/boombuler/barcode/qr" ) type Templater interface { @@ -37,48 +31,19 @@ func idToEan13(id string, prefix string) (string, error) { } func (t *DefaultTemplater) GenerateBarcode(code string, format string, prefix string) (string, error) { - var generatedCode barcode.Barcode + gen := &DefaultBarcodeGenerator{} var err error - switch format { - case "ean13": - encodedEan, err := idToEan13(code, prefix) + if format == "ean13" { + code, err = idToEan13(code, prefix) if err != nil { return "", err } - generatedCode, err = ean.Encode(encodedEan) - if err != nil { - return "", err - } - break - case "code128": - generatedCode, err = code128.Encode(prefix + code) - if err != nil { - return "", err - } - break - case "qr": - generatedCode, err = qr.Encode(prefix+code, qr.M, qr.AlphaNumeric) - if err != nil { - return "", err - } - break - default: - return "", errors.New("unknown barcode format") } - scaledCode, err := barcode.Scale(generatedCode, 1000, 500) - if err != nil { - return "", err - } + buf, err := gen.GenerateBarcode(format, code, 1000, 500) - var buf bytes.Buffer - err = png.Encode(&buf, scaledCode) - if err != nil { - return "", err - } - - return base64.StdEncoding.EncodeToString(buf.Bytes()), nil + return base64.StdEncoding.EncodeToString(buf.Bytes()), err } func (t *DefaultTemplater) SelectSponsorImage(id int) (string, error) {