Barcode generation with Boombuler
This commit is contained in:
@@ -5,8 +5,11 @@ import (
|
||||
"apskel-pos-be/internal/constants"
|
||||
"apskel-pos-be/internal/contract"
|
||||
"apskel-pos-be/internal/logger"
|
||||
"apskel-pos-be/internal/pkg/qrcode"
|
||||
"apskel-pos-be/internal/util"
|
||||
"apskel-pos-be/internal/validator"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -16,12 +19,14 @@ import (
|
||||
type TableHandler struct {
|
||||
tableService TableService
|
||||
tableValidator *validator.TableValidator
|
||||
baseURL string
|
||||
}
|
||||
|
||||
func NewTableHandler(tableService TableService, tableValidator *validator.TableValidator) *TableHandler {
|
||||
func NewTableHandler(tableService TableService, tableValidator *validator.TableValidator, baseURL string) *TableHandler {
|
||||
return &TableHandler{
|
||||
tableService: tableService,
|
||||
tableValidator: tableValidator,
|
||||
baseURL: baseURL,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,3 +291,45 @@ func (h *TableHandler) GetOccupiedTables(c *gin.Context) {
|
||||
|
||||
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::GetOccupiedTables")
|
||||
}
|
||||
|
||||
func (h *TableHandler) GenerateQRCode(c *gin.Context) {
|
||||
ctx := c.Request.Context()
|
||||
|
||||
id := c.Param("id")
|
||||
tableID, err := uuid.Parse(id)
|
||||
if err != nil {
|
||||
logger.FromContext(ctx).WithError(err).Error("TableHandler::GenerateQRCode -> Invalid table ID")
|
||||
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid table ID")
|
||||
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::GenerateQRCode")
|
||||
return
|
||||
}
|
||||
|
||||
token, err := h.tableService.GetTableToken(ctx, tableID)
|
||||
if err != nil {
|
||||
logger.FromContext(ctx).WithError(err).Error("TableHandler::GenerateQRCode -> table not found")
|
||||
validationResponseError := contract.NewResponseError(constants.NotFoundErrorCode, constants.TableEntity, "Table not found")
|
||||
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::GenerateQRCode")
|
||||
return
|
||||
}
|
||||
|
||||
selfOrderURL := fmt.Sprintf("%s/api/v1/self-order/table/%s", h.baseURL, token)
|
||||
|
||||
size := 256
|
||||
if sizeStr := c.Query("size"); sizeStr != "" {
|
||||
if s, err := strconv.Atoi(sizeStr); err == nil && s > 0 && s <= 1024 {
|
||||
size = s
|
||||
}
|
||||
}
|
||||
|
||||
pngBytes, err := qrcode.GeneratePNG(selfOrderURL, size)
|
||||
if err != nil {
|
||||
logger.FromContext(ctx).WithError(err).Error("TableHandler::GenerateQRCode -> QR generation failed")
|
||||
validationResponseError := contract.NewResponseError(constants.InternalServerErrorCode, constants.TableEntity, "Failed to generate QR code")
|
||||
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::GenerateQRCode")
|
||||
return
|
||||
}
|
||||
|
||||
c.Header("Content-Type", "image/png")
|
||||
c.Header("Content-Disposition", fmt.Sprintf("inline; filename=\"table-%s-qr.png\"", tableID))
|
||||
c.Data(http.StatusOK, "image/png", pngBytes)
|
||||
}
|
||||
|
||||
@@ -17,4 +17,5 @@ type TableService interface {
|
||||
ReleaseTable(ctx context.Context, tableID uuid.UUID, req *contract.ReleaseTableRequest) *contract.Response
|
||||
GetAvailableTables(ctx context.Context, outletID uuid.UUID) *contract.Response
|
||||
GetOccupiedTables(ctx context.Context, outletID uuid.UUID) *contract.Response
|
||||
GetTableToken(ctx context.Context, tableID uuid.UUID) (string, error)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user