Compare commits

..

No commits in common. "4d57cf827d11f3648fabf8d3972e453e7e679f01" and "a2e94f715b39a7d42a9b7f6e49b778439c5c9caa" have entirely different histories.

8 changed files with 16 additions and 97 deletions

1
.env
View File

@ -1,4 +1,3 @@
LOGLEVEL=debug
PORT=3000 PORT=3000
PRODUCION=false PRODUCION=false
APIKEY=lfk APIKEY=lfk

View File

@ -20,8 +20,6 @@ import (
// @Router /v1/barcodes/{type}/{content} [get] // @Router /v1/barcodes/{type}/{content} [get]
func (h *DefaultHandler) GenerateBarcode(c *fiber.Ctx) error { func (h *DefaultHandler) GenerateBarcode(c *fiber.Ctx) error {
logger := h.Logger.Named("GenerateBarcode")
// Get the type and content from the URL // Get the type and content from the URL
barcodeType := c.Params("type") barcodeType := c.Params("type")
barcodeContent := c.Params("content") barcodeContent := c.Params("content")
@ -34,7 +32,6 @@ func (h *DefaultHandler) GenerateBarcode(c *fiber.Ctx) error {
// Convert width and height to integers // Convert width and height to integers
width, err := strconv.Atoi(widthStr) width, err := strconv.Atoi(widthStr)
if err != nil { if err != nil {
logger.Errorw("Invalid width parameter", "width", widthStr, "error", err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid width parameter", "error": "Invalid width parameter",
}) })
@ -42,7 +39,6 @@ func (h *DefaultHandler) GenerateBarcode(c *fiber.Ctx) error {
height, err := strconv.Atoi(heightStr) height, err := strconv.Atoi(heightStr)
if err != nil { if err != nil {
logger.Errorw("Invalid height parameter", "height", heightStr, "error", err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid height parameter", "error": "Invalid height parameter",
}) })
@ -50,23 +46,18 @@ func (h *DefaultHandler) GenerateBarcode(c *fiber.Ctx) error {
padding, err := strconv.Atoi(paddingStr) padding, err := strconv.Atoi(paddingStr)
if err != nil { if err != nil {
logger.Errorw("Invalid padding parameter", "padding", paddingStr, "error", err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid padding parameter", "error": "Invalid padding parameter",
}) })
} }
logger = logger.With("type", barcodeType, "content", barcodeContent, "width", width, "height", height, "padding", padding)
// Generate the barcode // Generate the barcode
logger.Info("Generating barcode")
barcode, err := h.BarcodeService.GenerateBarcode(barcodeType, barcodeContent, width, height, padding) barcode, err := h.BarcodeService.GenerateBarcode(barcodeType, barcodeContent, width, height, padding)
if err != nil { if err != nil {
logger.Errorw("Failed to generate barcode", "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
logger.Info("Barcode generated")
c.Set(fiber.HeaderContentType, "image/png") c.Set(fiber.HeaderContentType, "image/png")
return c.Send(barcode.Bytes()) return c.Send(barcode.Bytes())

View File

@ -1,6 +1,7 @@
package handlers package handlers
import ( import (
"log"
"slices" "slices"
"git.odit.services/lfk/document-server/models" "git.odit.services/lfk/document-server/models"
@ -18,35 +19,27 @@ import (
// @Security ApiKeyAuth // @Security ApiKeyAuth
// @Router /v1/pdfs/cards [post] // @Router /v1/pdfs/cards [post]
func (h *DefaultHandler) GenerateCard(c *fiber.Ctx) error { func (h *DefaultHandler) GenerateCard(c *fiber.Ctx) error {
logger := h.Logger.Named("GenerateCard")
cardRequest := new(models.CardRequest) cardRequest := new(models.CardRequest)
if err := c.BodyParser(cardRequest); err != nil { if err := c.BodyParser(cardRequest); err != nil {
logger.Errorw("Invalid request", "error", err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
if !slices.Contains([]string{"en", "de"}, cardRequest.Locale) { if !slices.Contains([]string{"en", "de"}, cardRequest.Locale) {
logger.Errorw("Invalid locale", "locale", cardRequest.Locale)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid locale", "error": "Invalid locale",
}) })
} }
logger = logger.With("locale", cardRequest.Locale)
templateString, err := h.StaticService.GetTemplate(cardRequest.Locale, "card") templateString, err := h.StaticService.GetTemplate(cardRequest.Locale, "card")
if err != nil { if err != nil {
logger.Errorw("Template not found", "error", err) log.Println(err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Template not found", "error": "Template not found",
}) })
} }
template, err := h.Templater.StringToTemplate(templateString) template, err := h.Templater.StringToTemplate(templateString)
if err != nil { if err != nil {
logger.Errorw("Error parsing template", "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
@ -60,26 +53,20 @@ func (h *DefaultHandler) GenerateCard(c *fiber.Ctx) error {
BarcodePrefix: h.Config.CardBarcodePrefix, BarcodePrefix: h.Config.CardBarcodePrefix,
} }
logger.Info("Generating card html")
result, err := h.Templater.Execute(template, genConfig) result, err := h.Templater.Execute(template, genConfig)
if err != nil { if err != nil {
logger.Errorw("Error executing template", "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
logger.Info("Generated card html")
c.Set(fiber.HeaderContentType, "text/html") c.Set(fiber.HeaderContentType, "text/html")
logger.Info("Converting html to pdf")
pdf, err := h.Converter.ToPdf(result, "a4", false) pdf, err := h.Converter.ToPdf(result, "a4", false)
if err != nil { if err != nil {
logger.Errorw("Error converting html to pdf", "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
logger.Info("Converted html to pdf")
c.Set(fiber.HeaderContentType, "application/pdf") c.Set(fiber.HeaderContentType, "application/pdf")
c.Set(fiber.HeaderContentDisposition, "attachment; filename=runner-cards.pdf") c.Set(fiber.HeaderContentDisposition, "attachment; filename=runner-cards.pdf")

View File

@ -1,6 +1,7 @@
package handlers package handlers
import ( import (
"log"
"slices" "slices"
"git.odit.services/lfk/document-server/models" "git.odit.services/lfk/document-server/models"
@ -18,35 +19,27 @@ import (
// @Security ApiKeyAuth // @Security ApiKeyAuth
// @Router /v1/pdfs/certificates [post] // @Router /v1/pdfs/certificates [post]
func (h *DefaultHandler) GenerateCertificate(c *fiber.Ctx) error { func (h *DefaultHandler) GenerateCertificate(c *fiber.Ctx) error {
logger := h.Logger.Named("GenerateCertificate")
certificateRequest := new(models.CertificateRequest) certificateRequest := new(models.CertificateRequest)
if err := c.BodyParser(certificateRequest); err != nil { if err := c.BodyParser(certificateRequest); err != nil {
logger.Errorw("Invalid request", "error", err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
if !slices.Contains([]string{"en", "de"}, certificateRequest.Locale) { if !slices.Contains([]string{"en", "de"}, certificateRequest.Locale) {
logger.Errorw("Invalid locale", "locale", certificateRequest.Locale)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid locale", "error": "Invalid locale",
}) })
} }
logger = logger.With("locale", certificateRequest.Locale)
templateString, err := h.StaticService.GetTemplate(certificateRequest.Locale, "certificate") templateString, err := h.StaticService.GetTemplate(certificateRequest.Locale, "certificate")
if err != nil { if err != nil {
logger.Errorw("Template not found", "error", err) log.Println(err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Template not found", "error": "Template not found",
}) })
} }
template, err := h.Templater.StringToTemplate(templateString) template, err := h.Templater.StringToTemplate(templateString)
if err != nil { if err != nil {
logger.Errorw("Error parsing template", "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
@ -60,24 +53,20 @@ func (h *DefaultHandler) GenerateCertificate(c *fiber.Ctx) error {
Locale: certificateRequest.Locale, Locale: certificateRequest.Locale,
} }
logger.Info("Generating certificate html")
result, err := h.Templater.Execute(template, genConfig) result, err := h.Templater.Execute(template, genConfig)
if err != nil { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
logger.Info("Generated card html")
c.Set(fiber.HeaderContentType, "text/html") c.Set(fiber.HeaderContentType, "text/html")
logger.Info("Converting html to pdf")
pdf, err := h.Converter.ToPdf(result, "a4", false) pdf, err := h.Converter.ToPdf(result, "a4", false)
if err != nil { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
logger.Info("Converted html to pdf")
c.Set(fiber.HeaderContentType, "application/pdf") c.Set(fiber.HeaderContentType, "application/pdf")
c.Set(fiber.HeaderContentDisposition, "attachment; filename=certificate.pdf") c.Set(fiber.HeaderContentDisposition, "attachment; filename=certificate.pdf")

View File

@ -1,6 +1,7 @@
package handlers package handlers
import ( import (
"log"
"slices" "slices"
"git.odit.services/lfk/document-server/models" "git.odit.services/lfk/document-server/models"
@ -18,42 +19,36 @@ import (
// @Security ApiKeyAuth // @Security ApiKeyAuth
// @Router /v1/pdfs/contracts [post] // @Router /v1/pdfs/contracts [post]
func (h *DefaultHandler) GenerateContract(c *fiber.Ctx) error { func (h *DefaultHandler) GenerateContract(c *fiber.Ctx) error {
logger := h.Logger.Named("GenerateContract")
contract := new(models.ContractRequest) contract := new(models.ContractRequest)
if err := c.BodyParser(contract); err != nil { if err := c.BodyParser(contract); err != nil {
logger.Errorw("Invalid request", "error", err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
if !slices.Contains([]string{"en", "de"}, contract.Locale) { if !slices.Contains([]string{"en", "de"}, contract.Locale) {
logger.Errorw("Invalid locale", "locale", contract.Locale)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid locale", "error": "Invalid locale",
}) })
} }
logger = logger.With("locale", contract.Locale) contract.Runners = repeatRunnerArrayItems(contract.Runners, 2)
templateString, err := h.StaticService.GetTemplate(contract.Locale, "contract") templateString, err := h.StaticService.GetTemplate(contract.Locale, "contract")
if err != nil { if err != nil {
logger.Errorw("Template not found", "error", err) log.Println(err)
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Template not found", "error": "Template not found",
}) })
} }
template, err := h.Templater.StringToTemplate(templateString) template, err := h.Templater.StringToTemplate(templateString)
if err != nil { if err != nil {
logger.Errorw("Error parsing template", "error", err)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
genConfig := &models.ContractTemplateOptions{ genConfig := &models.ContractTemplateOptions{
Runners: repeatRunnerArrayItems(contract.Runners, 2), Runners: contract.Runners,
CurrencySymbol: h.Config.CurrencySymbol, CurrencySymbol: h.Config.CurrencySymbol,
Disclaimer: h.Config.SponosringDisclaimer, Disclaimer: h.Config.SponosringDisclaimer,
ReceiptMinimumAmount: h.Config.SponsoringReceiptMinimum, ReceiptMinimumAmount: h.Config.SponsoringReceiptMinimum,
@ -62,23 +57,19 @@ func (h *DefaultHandler) GenerateContract(c *fiber.Ctx) error {
BarcodePrefix: h.Config.SponsoringBarcodePrefix, BarcodePrefix: h.Config.SponsoringBarcodePrefix,
} }
logger.Info("Generating contract html")
result, err := h.Templater.Execute(template, genConfig) result, err := h.Templater.Execute(template, genConfig)
if err != nil { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
logger.Info("Generated contract html")
logger.Info("Converting html to pdf")
pdf, err := h.Converter.ToPdf(result, "a5", true) pdf, err := h.Converter.ToPdf(result, "a5", true)
if err != nil { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(), "error": err.Error(),
}) })
} }
logger.Info("Converted html to pdf")
c.Set(fiber.HeaderContentType, "application/pdf") c.Set(fiber.HeaderContentType, "application/pdf")
c.Set(fiber.HeaderContentDisposition, "attachment; filename=runner-contracts.pdf") c.Set(fiber.HeaderContentDisposition, "attachment; filename=runner-contracts.pdf")

View File

@ -4,7 +4,6 @@ import (
"git.odit.services/lfk/document-server/models" "git.odit.services/lfk/document-server/models"
"git.odit.services/lfk/document-server/services" "git.odit.services/lfk/document-server/services"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"go.uber.org/zap"
) )
type Handler interface { type Handler interface {
@ -20,5 +19,4 @@ type DefaultHandler struct {
Templater services.Templater Templater services.Templater
Converter services.Converter Converter services.Converter
StaticService services.StaticService StaticService services.StaticService
Logger *zap.SugaredLogger
} }

51
main.go
View File

@ -3,8 +3,6 @@ package main
import ( import (
"crypto/sha256" "crypto/sha256"
"crypto/subtle" "crypto/subtle"
"os"
"strings"
"git.odit.services/lfk/document-server/docs" // Correct import path for docs "git.odit.services/lfk/document-server/docs" // Correct import path for docs
"git.odit.services/lfk/document-server/handlers" "git.odit.services/lfk/document-server/handlers"
@ -18,7 +16,6 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
"github.com/spf13/viper" "github.com/spf13/viper"
"go.uber.org/zap" "go.uber.org/zap"
"go.uber.org/zap/zapcore"
) )
var ( var (
@ -38,8 +35,7 @@ func validateAPIKey(c *fiber.Ctx, key string) (bool, error) {
func loadEnv() error { func loadEnv() error {
viper.SetDefault("LOGLEVEL", "INFO") viper.SetDefault("PRODUCION", true)
viper.SetDefault("PRODUCION", false)
viper.SetDefault("PORT", "3000") viper.SetDefault("PORT", "3000")
viper.SetDefault("APIKEY", "lfk") viper.SetDefault("APIKEY", "lfk")
viper.SetDefault("EVENTNAME", "Demo Event") viper.SetDefault("EVENTNAME", "Demo Event")
@ -71,34 +67,7 @@ func loadEnv() error {
return err return err
} }
logger.Infow("Loaded config", "config", &config) logger.Infow("Loaded config", config)
return nil
}
func initLogger() error {
logLevel := os.Getenv("LOGLEVEL")
if logLevel == "" {
logLevel = "INFO"
}
var zapLogLevel zapcore.Level
err := zapLogLevel.UnmarshalText([]byte(strings.ToLower(logLevel)))
if err != nil {
zapLogLevel = zapcore.InfoLevel
}
zapConfig := zap.NewProductionConfig()
zapConfig.Level = zap.NewAtomicLevelAt(zapLogLevel)
zapLogger, err := zapConfig.Build()
if err != nil {
return err
}
defer zapLogger.Sync()
logger = zapLogger.Sugar()
logger.Debug("Initialized logger")
return nil return nil
} }
@ -116,12 +85,12 @@ func initLogger() error {
func main() { func main() {
// Init the logger // Init the logger
err := initLogger() zapLogger, _ := zap.NewProduction()
if err != nil { defer zapLogger.Sync()
return logger = zapLogger.Sugar()
} logger.Info("Logger initialized")
err = loadEnv() err := loadEnv()
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
return return
@ -129,7 +98,7 @@ func main() {
var redisClient *redis.Client var redisClient *redis.Client
if config.RedisAddr != "" { if config.RedisAddr != "" {
logger.Infow("Using redis", "redisAddr", config.RedisAddr) logger.Infow("Using redis", config.RedisAddr)
redisClient = redis.NewClient(&redis.Options{ redisClient = redis.NewClient(&redis.Options{
Addr: config.RedisAddr, Addr: config.RedisAddr,
}) })
@ -152,9 +121,7 @@ func main() {
Converter: &services.GotenbergConverter{ Converter: &services.GotenbergConverter{
BaseUrl: config.GotenbergBaseUrl, BaseUrl: config.GotenbergBaseUrl,
}, },
Logger: logger,
} }
logger.Debug("Initialized services")
// Create a new Fiber instance // Create a new Fiber instance
app := fiber.New(fiber.Config{ app := fiber.New(fiber.Config{
@ -180,11 +147,9 @@ func main() {
pdfv1.Post("/certificates", handler.GenerateCertificate) pdfv1.Post("/certificates", handler.GenerateCertificate)
v1.Get("/barcodes/:type/:content", handler.GenerateBarcode) v1.Get("/barcodes/:type/:content", handler.GenerateBarcode)
logger.Debug("Initialized routes")
app.Use(handler.NotFoundHandler) app.Use(handler.NotFoundHandler)
docs.SwaggerInfo.BasePath = "/" docs.SwaggerInfo.BasePath = "/"
logger.Infow("Starting server", "port", config.Port)
logger.Error(app.Listen("0.0.0.0:" + config.Port)) logger.Error(app.Listen("0.0.0.0:" + config.Port))
} }

View File

@ -1,7 +1,6 @@
package models package models
type Config struct { type Config struct {
LogLevel string `mapstructure:"LOGLEVEL"`
Prod bool `mapstructure:"PRODUCION"` Prod bool `mapstructure:"PRODUCION"`
Port string `mapstructure:"PORT"` Port string `mapstructure:"PORT"`
APIKey string `mapstructure:"APIKEY"` APIKey string `mapstructure:"APIKEY"`