72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
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"
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
type BarcodeService interface {
|
|
GenerateBarcode(format string, content string, width int, height int) (bytes.Buffer, error)
|
|
IsTypeSupported(format string) bool
|
|
}
|
|
|
|
type DefaultBarcodeService struct {
|
|
RedisClient *redis.Client
|
|
}
|
|
|
|
func (b *DefaultBarcodeService) 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 *DefaultBarcodeService) IsTypeSupported(format string) bool {
|
|
supportedTypes := []string{"ean13", "code128", "qr"}
|
|
return slices.Contains(supportedTypes, format)
|
|
}
|