Compare commits

..

No commits in common. "c227c291c962b54ab9d35c6f194b1c1fd27f87c1" and "bd70ac45425a316883f6b2e415aa536cc9be7e6f" have entirely different histories.

7 changed files with 30 additions and 73 deletions

View File

@ -1,3 +0,0 @@
tmp
docker-compose.yaml
.air.toml

View File

@ -1,14 +0,0 @@
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server
FROM scratch
COPY --from=builder /app/server /server
ADD https://curl.haxx.se/ca/cacert.pem /etc/ssl/certs/ca-certificates.crt
ENTRYPOINT [ "/server" ]

View File

@ -15,11 +15,11 @@ import (
// @Description Generate a contract based on the provided data
// @Tags contracts
// @Accept json
// @Param data body models.ContractRequest true "Contract data"
// @Param data body models.Contract true "Contract data"
// @Produce application/pdf
// @Router /contracts [post]
func GenerateContract(c *fiber.Ctx) error {
contract := new(models.ContractRequest)
contract := new(models.Contract)
if err := c.BodyParser(contract); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": err.Error(),
@ -31,7 +31,14 @@ func GenerateContract(c *fiber.Ctx) error {
})
}
contract.Runners = repeatRunnerArrayItems(contract.Runners, 2)
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{}
templateString, err := templates.GetTemplate(contract.Locale, "contract")
@ -48,7 +55,7 @@ func GenerateContract(c *fiber.Ctx) error {
})
}
genConfig := &models.ContractTemplateOptions{
result, err := generator.Execute(template, &models.ContractTemplateOptions{
Runners: contract.Runners,
CurrencySymbol: "€",
Disclaimer: "This is a disclaimer",
@ -57,9 +64,7 @@ func GenerateContract(c *fiber.Ctx) error {
SponsoringHeader: templates.ImageSponsoringHeaderBase64,
BarcodeFormat: "ean13",
BarcodePrefix: "1",
}
result, err := generator.Execute(template)
})
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": err.Error(),
@ -77,13 +82,3 @@ func GenerateContract(c *fiber.Ctx) error {
c.Set(fiber.HeaderContentType, "application/pdf")
return c.Send(pdf)
}
func repeatRunnerArrayItems(runners []Runner, duplicates int) []Runner {
var duplicatedRunners []models.Runner
for _, runner := range contract.Runners {
for i := 0; i < duplicates; i++ {
duplicatedRunners = append(duplicatedRunners, runner)
}
}
return duplicatedRunners
}

View File

@ -1,21 +0,0 @@
package models
type CardRequest struct {
Cards []Card `json:"card"`
Locale string `json:"locale" enums:"en,de"`
}
type Card struct {
ID int `json:"id"`
Enabled bool `json:"enabled"`
Runner Runner `json:"runner"`
Code string `json:"code"`
}
type ContractTemplateOptions struct {
Cards []Card `json:"cards"`
EventName string `json:"event_name"`
CardSubtitle string `json:"card_subtitle"`
BarcodeFormat string `json:"barcode_format"`
BarcodePrefix string `json:"barcode_prefix"`
}

View File

@ -1,6 +1,6 @@
package models
type ContractRequest struct {
type Contract struct {
Runners []Runner `json:"runners"`
Locale string `json:"locale" enums:"en,de"`
}

View File

@ -30,25 +30,25 @@
<body class="A4 landscape">
<div class="sheet">
<div class="columns is-multiline">
{{ range .cards }}
{{#each cards}}
<div class="column is-half runnercard">
<p class="title is-5" style="text-align: center; padding-bottom: 0; margin-top: -0.75rem;">{{ $.EventName }}</p>
<p style="text-align: center; margin-top: -1.5rem; font-size: small;">{{ $.CardSubtitle }}</p>
<p class="title is-5" style="text-align: center; padding-bottom: 0; margin-top: -0.75rem;">{{../eventname}}</p>
<p style="text-align: center; margin-top: -1.5rem; font-size: small;">{{../card_subtitle}}</p>
<p style="font-size: small;">Mit Unterstützung von:</p>
<div class="columns" style="height: 6rem; overflow: hidden;">
<div class="column is-half">
<!--SPONSOR LOGO HERE-->
<img style="vertical-align: revert; margin-top: auto; object-fit: cover; max-height: 2cm;"
src="data:image/png;base64,{{ sponsorLogo .ID }}" />
src="{{--sponsor this.id}}" />
</div>
<div class="column is-half">
<!--BARCODE HERE-->
<img style="vertical-align: revert; margin-top: auto; object-fit: cover; max-height: 2cm;"
src="data:image/png;base64,{{ barcode .Code $.BarcodeFormat $.BarcodePrefix }}" />
src="{{--bc this.code ../codeformat}}" />
</div>
</div>
<p>{{ .Runner.LastName }}, {{ .Runner.FirstName }} {{ .Runner.MiddleName }}</p>
<p>{{ .Runner.Group.Name }}</p>
<p>{{this.runner.lastname}}, {{this.runner.firstname}} {{this.runner.middlename}}</p>
<p>{{this.runner.group.fullName}}</p>
</div>
{{/each}}
</div>
@ -59,9 +59,9 @@
<div class="column is-half runnercard" style="justify-content: center; align-items: center; text-align: center;">
<!--SPONSOR LOGO FIRST-->
<div style="height: 2cm; padding: 0 0 2.25cm 0">
<img style="object-fit: cover; max-height: 2cm;" src="data:image/png;base64,{{ sponsorLogo .ID }}" />
<img style="object-fit: cover; max-height: 2cm;" src="{{--sponsor this.id}}" />
</div>
<img style="object-fit: cover; max-height: 2.5cm; position: relative;" src="data:image/png;base64,{{ barcode .Code $.BarcodeFormat $.BarcodePrefix }}" />
<img style="object-fit: cover; max-height: 2.5cm; position: relative;" src="{{--bc this.code ../codeformat}}" />
</div>
{{/each}}
</div>

View File

@ -32,23 +32,23 @@
<div class="columns is-multiline">
{{#each cards}}
<div class="column is-half runnercard">
<p class="title is-5" style="text-align: center; padding-bottom: 0; margin-top: -0.75rem;">{{ $.EventName }}</p>
<p style="text-align: center; margin-top: -1.5rem; font-size: small;">{{ $.CardSubtitle }}</p>
<p class="title is-5" style="text-align: center; padding-bottom: 0; margin-top: -0.75rem;">{{../eventname}}</p>
<p style="text-align: center; margin-top: -1.5rem; font-size: small;">{{../card_subtitle}}</p>
<p style="font-size: small;">Supported by:</p>
<div class="columns" style="height: 6rem; overflow: hidden;">
<div class="column is-half">
<!--SPONSOR LOGO HERE-->
<img style="vertical-align: revert; margin-top: auto; object-fit: cover; max-height: 2cm;"
src="data:image/png;base64,{{ sponsorLogo .ID }}" />
src="{{--sponsor this.id}}" />
</div>
<div class="column is-half">
<!--BARCODE HERE-->
<img style="vertical-align: revert; margin-top: auto; object-fit: cover; max-height: 2cm;"
src="data:image/png;base64,{{ barcode .Code $.BarcodeFormat $.BarcodePrefix }}" />
src="{{--bc this.code ../codeformat}}" />
</div>
</div>
<p>{{ .Runner.LastName }}, {{ .Runner.FirstName }} {{ .Runner.MiddleName }}</p>
<p>{{ .Runner.Group.Name }}</p>
<p>{{this.runner.lastname}}, {{this.runner.firstname}} {{this.runner.middlename}}</p>
<p>{{this.runner.group.fullName}}</p>
</div>
{{/each}}
</div>
@ -59,9 +59,9 @@
<div class="column is-half runnercard" style="justify-content: center; align-items: center; text-align: center;">
<!--SPONSOR LOGO FIRST-->
<div style="height: 2cm; padding: 0 0 2.25cm 0">
<img style="object-fit: cover; max-height: 2cm;" src="data:image/png;base64,{{ sponsorLogo .ID }}" />
<img style="object-fit: cover; max-height: 2cm;" src="{{--sponsor this.id}}" />
</div>
<img style="object-fit: cover; max-height: 2.5cm; position: relative;" src="data:image/png;base64,{{ barcode .Code $.BarcodeFormat $.BarcodePrefix }}" />
<img style="object-fit: cover; max-height: 2.5cm; position: relative;" src="{{--bc this.code ../codeformat}}" />
</div>
{{/each}}
</div>