109 lines
3.4 KiB
Go
109 lines
3.4 KiB
Go
package handlers
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"git.odit.services/lfk/document-server/models"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// GenerateCertificate godoc
|
|
//
|
|
// @Summary Generate runner certificates
|
|
// @Description Generate certificates based on the provided data
|
|
// @Tags pdfs
|
|
// @Accept json
|
|
// @Param data body models.CertificateRequest true "Certificate data"
|
|
// @Produce application/pdf
|
|
// @Security ApiKeyAuth
|
|
// @Router /v1/pdfs/certificates [post]
|
|
func (h *DefaultHandler) GenerateCertificate(c *fiber.Ctx) error {
|
|
|
|
logger := h.Logger.Named("GenerateCertificate")
|
|
|
|
certificateRequest := new(models.CertificateRequest)
|
|
if err := c.BodyParser(certificateRequest); err != nil {
|
|
logger.Errorw("Invalid request", "error", err)
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": err.Error(),
|
|
})
|
|
}
|
|
if !slices.Contains([]string{"en", "de"}, certificateRequest.Locale) {
|
|
logger.Errorw("Invalid locale", "locale", certificateRequest.Locale)
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": "Invalid locale",
|
|
})
|
|
}
|
|
|
|
logger = logger.With("locale", certificateRequest.Locale)
|
|
|
|
templateString, err := h.StaticService.GetTemplate(certificateRequest.Locale, "certificate")
|
|
if err != nil {
|
|
logger.Errorw("Template not found", "error", err)
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": "Template not found",
|
|
})
|
|
}
|
|
template, err := h.Templater.StringToTemplate(templateString)
|
|
if err != nil {
|
|
logger.Errorw("Error parsing template", "error", err)
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": err.Error(),
|
|
})
|
|
}
|
|
|
|
genConfig := &models.CertificateTemplateOptions{
|
|
Runners: addUpRunnerDonations(certificateRequest.Runners),
|
|
EventName: h.Config.EventName,
|
|
Footer: h.Config.CertificateFooter,
|
|
CurrencySymbol: h.Config.CurrencySymbol,
|
|
Locale: certificateRequest.Locale,
|
|
SepaConfig: &models.SepaConfig{
|
|
BIC: h.Config.SepaBic,
|
|
HolderName: h.Config.SepaName,
|
|
IBAN: h.Config.SepaIban,
|
|
CurrencyIdentifier: h.Config.CurrencyIdentifier,
|
|
},
|
|
}
|
|
|
|
logger.Info("Generating certificate html")
|
|
result, err := h.Templater.Execute(template, genConfig)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": err.Error(),
|
|
})
|
|
}
|
|
logger.Info("Generated card html")
|
|
c.Set(fiber.HeaderContentType, "text/html")
|
|
|
|
logger.Info("Converting html to pdf")
|
|
pdf, err := h.Converter.ToPdf(result, "a4", false)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": err.Error(),
|
|
})
|
|
}
|
|
logger.Info("Converted html to pdf")
|
|
|
|
c.Set(fiber.HeaderContentType, "application/pdf")
|
|
c.Set(fiber.HeaderContentDisposition, "attachment; filename=certificate.pdf")
|
|
return c.Send(pdf)
|
|
}
|
|
|
|
func addUpRunnerDonations(runners []models.RunnerWithDonations) []models.RunnerWithDonations {
|
|
for i := 0; i < len(runners); i++ {
|
|
for j := 0; j < len(runners[i].DistanceDonations); j++ {
|
|
runners[i].TotalDonations += runners[i].DistanceDonations[j].Amount
|
|
runners[i].TotalPerDistance += runners[i].DistanceDonations[j].AmountPerDistance
|
|
}
|
|
if runners[i].Group.ParentGroup.Name != "" {
|
|
runners[i].CombinedGroupName = runners[i].Group.ParentGroup.Name + " - " + runners[i].Group.Name
|
|
} else {
|
|
runners[i].CombinedGroupName = runners[i].Group.Name
|
|
|
|
}
|
|
|
|
}
|
|
return runners
|
|
}
|