refactor(services): Extract barcode generation

This commit is contained in:
Nicolai Ort 2024-12-12 16:43:14 +01:00
parent c5da33f10f
commit b6cc98a165
Signed by: niggl
GPG Key ID: 13AFA55AF62F269F
2 changed files with 74 additions and 40 deletions

69
services/barcode.go Normal file
View File

@ -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)
}

View File

@ -6,13 +6,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"html/template" "html/template"
"image/png"
"strings" "strings"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/code128"
"github.com/boombuler/barcode/ean"
"github.com/boombuler/barcode/qr"
) )
type Templater interface { 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) { func (t *DefaultTemplater) GenerateBarcode(code string, format string, prefix string) (string, error) {
var generatedCode barcode.Barcode gen := &DefaultBarcodeGenerator{}
var err error var err error
switch format { if format == "ean13" {
case "ean13": code, err = idToEan13(code, prefix)
encodedEan, err := idToEan13(code, prefix)
if err != nil { if err != nil {
return "", err 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) buf, err := gen.GenerateBarcode(format, code, 1000, 500)
if err != nil {
return "", err
}
var buf bytes.Buffer return base64.StdEncoding.EncodeToString(buf.Bytes()), err
err = png.Encode(&buf, scaledCode)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(buf.Bytes()), nil
} }
func (t *DefaultTemplater) SelectSponsorImage(id int) (string, error) { func (t *DefaultTemplater) SelectSponsorImage(id int) (string, error) {