diff --git a/handlers/certificate.go b/handlers/certificate.go new file mode 100644 index 0000000..16ff5c1 --- /dev/null +++ b/handlers/certificate.go @@ -0,0 +1,73 @@ +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" +) + +// GenerateCertificate godoc +// @Summary Generate runner certificates +// @Description Generate certificates based on the provided data +// @Tags certificates +// @Accept json +// @Param data body models.CertificateRequest true "Certificate data" +// @Produce application/pdf +// @Router /certificates [post] +func GenerateCertificate(c *fiber.Ctx) error { + certificateRequest := new(models.CertificateRequest) + if err := c.BodyParser(certificateRequest); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "error": err.Error(), + }) + } + if !slices.Contains([]string{"en", "de"}, certificateRequest.Locale) { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid locale", + }) + } + + generator := services.DefaultTemplater{} + templateString, err := templates.GetTemplate(certificateRequest.Locale, "certificate") + if err != nil { + log.Println(err) + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "error": "Template not found", + }) + } + template, err := generator.StringToTemplate(templateString) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + + genConfig := &models.CertificateTemplateOptions{ + Runners: certificateRequest.Runners, + EventName: "Event name", + Footer: "Footer", + CurrencySymbol: "€", + } + + result, err := generator.Execute(template, genConfig) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + c.Set(fiber.HeaderContentType, "text/html") + converter := services.GotenbergConverter{BaseUrl: "http://localhost:3001"} + pdf, err := converter.ToPdf(result, "a4", false) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + + c.Set(fiber.HeaderContentType, "application/pdf") + return c.Send(pdf) +} diff --git a/main.go b/main.go index 5d72e08..3420d5a 100644 --- a/main.go +++ b/main.go @@ -36,6 +36,7 @@ func main() { }) v1.Post("/contracts", handlers.GenerateContract) v1.Post("/cards", handlers.GenerateCard) + v1.Post("/certificates", handlers.GenerateCertificate) app.Use(handlers.NotFoundHandler) docs.SwaggerInfo.BasePath = "/"