feat(cards): Implement endpoint for card generation

This commit is contained in:
2024-12-03 18:44:17 +01:00
parent ed4941b403
commit 7d22a32cb4
7 changed files with 250 additions and 10 deletions

74
handlers/card.go Normal file
View File

@@ -0,0 +1,74 @@
package handlers
import (
"log"
"slices"
"git.odit.services/lfk/document-server/models"
"git.odit.services/lfk/document-server/services"
"git.odit.services/lfk/document-server/templates"
"github.com/gofiber/fiber/v2"
)
// GenerateCard godoc
// @Summary Generate runner cards
// @Description Generate cards based on the provided data
// @Tags cards
// @Accept json
// @Param data body models.CardRequest true "Card data"
// @Produce application/pdf
// @Router /cards [post]
func GenerateCard(c *fiber.Ctx) error {
cardRequest := new(models.CardRequest)
if err := c.BodyParser(cardRequest); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": err.Error(),
})
}
if !slices.Contains([]string{"en", "de"}, cardRequest.Locale) {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid locale",
})
}
generator := services.DefaultTemplater{}
templateString, err := templates.GetTemplate(cardRequest.Locale, "card")
if err != nil {
log.Println(err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Template not found",
})
}
template, err := generator.StringToTemplate(templateString)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(),
})
}
genConfig := &models.CardTemplateOptions{
Cards: cardRequest.Cards,
EventName: "Event name",
CardSubtitle: "Card subtitle",
BarcodeFormat: "ean13",
BarcodePrefix: "",
}
result, err := generator.Execute(template, genConfig)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(),
})
}
converter := services.GotenbergConverter{BaseUrl: "http://localhost:3001"}
pdf, err := converter.ToPdf(result, "a5", true)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(),
})
}
c.Set(fiber.HeaderContentType, "application/pdf")
return c.Send(pdf)
}

View File

@@ -59,7 +59,7 @@ func GenerateContract(c *fiber.Ctx) error {
BarcodePrefix: "1",
}
result, err := generator.Execute(template)
result, err := generator.Execute(template, genConfig)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(),
@@ -78,9 +78,9 @@ func GenerateContract(c *fiber.Ctx) error {
return c.Send(pdf)
}
func repeatRunnerArrayItems(runners []Runner, duplicates int) []Runner {
func repeatRunnerArrayItems(runners []models.Runner, duplicates int) []models.Runner {
var duplicatedRunners []models.Runner
for _, runner := range contract.Runners {
for _, runner := range runners {
for i := 0; i < duplicates; i++ {
duplicatedRunners = append(duplicatedRunners, runner)
}