package handlers import ( "slices" "git.odit.services/lfk/document-server/models" "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 { logger := h.Logger.Named("GenerateContract") contract := new(models.ContractRequest) if err := c.BodyParser(contract); 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"}, contract.Locale) { logger.Errorw("Invalid locale", "locale", contract.Locale) return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "error": "Invalid locale", }) } logger = logger.With("locale", contract.Locale) templateString, err := h.StaticService.GetTemplate(contract.Locale, "contract") 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.ContractTemplateOptions{ Runners: repeatRunnerArrayItems(contract.Runners, 2), CurrencySymbol: h.Config.CurrencySymbol, Disclaimer: h.Config.SponosringDisclaimer, ReceiptMinimumAmount: h.Config.SponsoringReceiptMinimum, EventName: h.Config.EventName, BarcodeFormat: h.Config.SponsoringBarcodeFormat, BarcodePrefix: h.Config.SponsoringBarcodePrefix, } logger.Info("Generating contract 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 contract html") logger.Info("Converting html to pdf") pdf, err := h.Converter.ToPdf(result, "a5", true) 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=runner-contracts.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 }