85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
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"
|
|
)
|
|
|
|
// GenerateContract godoc
|
|
// @Summary Generate a contract
|
|
// @Description Generate a contract based on the provided data
|
|
// @Tags contracts
|
|
// @Accept json
|
|
// @Param data body models.ContractRequest true "Contract data"
|
|
// @Produce application/pdf
|
|
// @Router /contracts [post]
|
|
func GenerateContract(c *fiber.Ctx) error {
|
|
contract := new(models.ContractRequest)
|
|
if err := c.BodyParser(contract); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": err.Error(),
|
|
})
|
|
}
|
|
if !slices.Contains([]string{"en", "de"}, contract.Locale) {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": "Invalid locale",
|
|
})
|
|
}
|
|
|
|
var duplicates int = 2
|
|
var duplicatedRunners []models.Runner
|
|
for _, runner := range contract.Runners {
|
|
for i := 0; i < duplicates; i++ {
|
|
duplicatedRunners = append(duplicatedRunners, runner)
|
|
}
|
|
}
|
|
contract.Runners = duplicatedRunners
|
|
|
|
generator := services.DefaultTemplater{}
|
|
templateString, err := templates.GetTemplate(contract.Locale, "contract")
|
|
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(),
|
|
})
|
|
}
|
|
|
|
result, err := generator.Execute(template, &models.ContractTemplateOptions{
|
|
Runners: contract.Runners,
|
|
CurrencySymbol: "€",
|
|
Disclaimer: "This is a disclaimer",
|
|
ReceiptMinimumAmount: 10,
|
|
EventName: "Event name",
|
|
SponsoringHeader: templates.ImageSponsoringHeaderBase64,
|
|
BarcodeFormat: "ean13",
|
|
BarcodePrefix: "1",
|
|
})
|
|
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)
|
|
}
|