89 lines
2.5 KiB
Go

package handlers
import (
"log"
"slices"
"git.odit.services/lfk/document-server/models"
"git.odit.services/lfk/document-server/services"
"github.com/gofiber/fiber/v2"
)
// GenerateContract godoc
//
// @Summary Generate a contract
// @Description Generate a contract based on the provided data
// @Tags pdfs
// @Accept json
// @Param data body models.ContractRequest true "Contract data"
// @Produce application/pdf
// @Security ApiKeyAuth
// @Router /v1/pdfs/contracts [post]
func (h *DefaultHandler) 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",
})
}
contract.Runners = repeatRunnerArrayItems(contract.Runners, 2)
templateString, err := services.GetTemplate(contract.Locale, "contract")
if err != nil {
log.Println(err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Template not found",
})
}
template, err := h.Templater.StringToTemplate(templateString)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(),
})
}
genConfig := &models.ContractTemplateOptions{
Runners: contract.Runners,
CurrencySymbol: h.Config.CurrencySymbol,
Disclaimer: h.Config.SponosringDisclaimer,
ReceiptMinimumAmount: h.Config.SponsoringReceiptMinimum,
EventName: h.Config.EventName,
BarcodeFormat: h.Config.SponsoringBarcodeFormat,
BarcodePrefix: h.Config.SponsoringBarcodePrefix,
}
result, err := h.Templater.Execute(template, genConfig)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(),
})
}
converter := services.GotenbergConverter{BaseUrl: h.Config.GotenbergBaseUrl}
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)
}
func repeatRunnerArrayItems(runners []models.Runner, duplicates int) []models.Runner {
var duplicatedRunners []models.Runner
for _, runner := range runners {
for i := 0; i < duplicates; i++ {
duplicatedRunners = append(duplicatedRunners, runner)
}
}
return duplicatedRunners
}