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.Contract true "Contract data" // @Produce application/pdf // @Router /contracts [post] func GenerateContract(c *fiber.Ctx) error { contract := new(models.Contract) 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{} template, err := templates.GetTemplate(contract.Locale, "contract") if err != nil { log.Println(err) return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "error": "Template not found", }) } result, err := generator.Execute(template, &services.ContractTemplateOptions{ Runners: contract.Runners, CurrencySymbol: "€", Disclaimer: "This is a disclaimer", ReceiptMinimumAmount: 10, EventName: "Event name", SponsoringHeader: templates.ImageSponsoringHeaderBase64, }) 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) }