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 }