Compare commits
No commits in common. "145ebd834613f6314d43b4551649bdec95f28dae" and "8f3faee5736ab0a0c5addce9a6480599d52fc8ff" have entirely different histories.
145ebd8346
...
8f3faee573
141
.dockerignore
Normal file
141
.dockerignore
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
# ---> VisualStudioCode
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/i18n-ally-custom-framework.yml
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# ---> Node
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Snowpack dependency directory (https://snowpack.dev/)
|
||||||
|
web_modules/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
.parcel-cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
.cache/
|
||||||
|
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
.tern-port
|
||||||
|
|
||||||
|
# Stores VSCode versions used for testing VSCode extensions
|
||||||
|
.vscode-test
|
||||||
|
|
||||||
|
# yarn v2
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.pnp.*
|
||||||
|
|
||||||
|
yarn.lock
|
||||||
|
package-lock.json
|
||||||
|
build
|
||||||
|
|
||||||
|
*.sqlite
|
||||||
|
*.sqlite-jurnal
|
||||||
|
/docs
|
||||||
|
lib
|
||||||
|
/oss-attribution
|
||||||
|
*.tmp
|
||||||
|
*.pdf
|
124
.drone.yml
Normal file
124
.drone.yml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: docker_username
|
||||||
|
get:
|
||||||
|
path: odit-registry-builder
|
||||||
|
name: username
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: docker_password
|
||||||
|
get:
|
||||||
|
path: odit-registry-builder
|
||||||
|
name: password
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: git_ssh
|
||||||
|
get:
|
||||||
|
path: odit-git-bot
|
||||||
|
name: sshkey
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: npm_url
|
||||||
|
get:
|
||||||
|
path: odit-npm-cache
|
||||||
|
name: url
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: build:dev
|
||||||
|
clone:
|
||||||
|
disable: true
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: clone
|
||||||
|
image: alpine/git
|
||||||
|
commands:
|
||||||
|
- git clone $CI_REPO_CLONE_URL .
|
||||||
|
- git checkout dev
|
||||||
|
- name: build dev
|
||||||
|
depends_on: ["clone"]
|
||||||
|
image: registry.odit.services/library/drone-kaniko
|
||||||
|
settings:
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
build_args:
|
||||||
|
- NPM_REGISTRY_URL:
|
||||||
|
from_secret: npm_url
|
||||||
|
repo: lfk/document-server
|
||||||
|
tags:
|
||||||
|
- dev
|
||||||
|
cache: true
|
||||||
|
registry: registry.odit.services
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- dev
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: build:latest
|
||||||
|
clone:
|
||||||
|
disable: true
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: clone
|
||||||
|
image: alpine/git
|
||||||
|
commands:
|
||||||
|
- git clone $CI_REPO_CLONE_URL .
|
||||||
|
- git checkout dev
|
||||||
|
- name: build dev
|
||||||
|
depends_on: ["clone"]
|
||||||
|
image: registry.odit.services/library/drone-kaniko
|
||||||
|
settings:
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
build_args:
|
||||||
|
- NPM_REGISTRY_URL:
|
||||||
|
from_secret: npm_url
|
||||||
|
repo: lfk/document-server
|
||||||
|
tags:
|
||||||
|
- latest
|
||||||
|
cache: true
|
||||||
|
registry: registry.odit.services
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- main
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: build:tags
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build $CI_COMMIT_TAG
|
||||||
|
depends_on: ["clone"]
|
||||||
|
image: registry.odit.services/library/drone-kaniko
|
||||||
|
settings:
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
build_args:
|
||||||
|
- NPM_REGISTRY_URL:
|
||||||
|
from_secret: npm_url
|
||||||
|
repo: lfk/document-server
|
||||||
|
tags:
|
||||||
|
- "${CI_COMMIT_TAG}"
|
||||||
|
cache: true
|
||||||
|
registry: registry.odit.services
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- tag
|
142
.gitignore
vendored
142
.gitignore
vendored
@ -1 +1,141 @@
|
|||||||
tmp
|
# ---> VisualStudioCode
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/i18n-ally-custom-framework.yml
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# ---> Node
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Snowpack dependency directory (https://snowpack.dev/)
|
||||||
|
web_modules/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
.parcel-cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
.cache/
|
||||||
|
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
.tern-port
|
||||||
|
|
||||||
|
# Stores VSCode versions used for testing VSCode extensions
|
||||||
|
.vscode-test
|
||||||
|
|
||||||
|
# yarn v2
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.pnp.*
|
||||||
|
|
||||||
|
yarn.lock
|
||||||
|
package-lock.json
|
||||||
|
build
|
||||||
|
|
||||||
|
*.sqlite
|
||||||
|
*.sqlite-jurnal
|
||||||
|
/docs
|
||||||
|
lib
|
||||||
|
/oss-attribution
|
||||||
|
*.tmp
|
||||||
|
*.pdf
|
11
.vscode/extensions.json
vendored
Normal file
11
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"2gua.rainbow-brackets",
|
||||||
|
"christian-kohler.npm-intellisense",
|
||||||
|
"remimarsal.prettier-now",
|
||||||
|
"lokalise.i18n-ally",
|
||||||
|
],
|
||||||
|
"unwantedRecommendations": [
|
||||||
|
"antfu.i18n-ally"
|
||||||
|
]
|
||||||
|
}
|
8
.vscode/i18n-ally-custom-framework.yml
vendored
Normal file
8
.vscode/i18n-ally-custom-framework.yml
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
languageIds:
|
||||||
|
- javascript
|
||||||
|
- html
|
||||||
|
keyMatchReg:
|
||||||
|
- '\{\{__ "([a-zA-Z0-9_]+)"\}\}'
|
||||||
|
monopoly: false
|
||||||
|
refactorTemplates:
|
||||||
|
- '{{__ "$1"}}'
|
27
.vscode/settings.json
vendored
Normal file
27
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"typescript.format.enable": true,
|
||||||
|
"typescript.preferences.quoteStyle": "single",
|
||||||
|
"[json]": {
|
||||||
|
"editor.defaultFormatter": "vscode.json-language-features"
|
||||||
|
},
|
||||||
|
"[typescript]": {
|
||||||
|
"editor.defaultFormatter": "vscode.typescript-language-features",
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.organizeImports": true,
|
||||||
|
// "source.fixAll": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"javascript.preferences.quoteStyle": "single",
|
||||||
|
"javascript.preferences.importModuleSpecifierEnding": "minimal",
|
||||||
|
"typescript.preferences.importModuleSpecifierEnding": "minimal",
|
||||||
|
"typescript.preferences.includePackageJsonAutoImports": "on",
|
||||||
|
"i18n-ally.localesPaths": "src/locales",
|
||||||
|
"i18n-ally.keystyle": "nested",
|
||||||
|
"i18n-ally.extract.keygenStrategy":"slug",
|
||||||
|
"i18n-ally.enabledFrameworks": [
|
||||||
|
"custom"
|
||||||
|
],
|
||||||
|
"i18n-ally.sourceLanguage": "en"
|
||||||
|
|
||||||
|
}
|
427
CHANGELOG.md
Normal file
427
CHANGELOG.md
Normal file
@ -0,0 +1,427 @@
|
|||||||
|
### Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
|
#### [v0.6.2](https://git.odit.services/lfk/document-server/compare/v0.6.1...v0.6.2)
|
||||||
|
|
||||||
|
- Added dockerignore for smaller build env [`cbda10e`](https://git.odit.services/lfk/document-server/commit/cbda10e2a11ee467d44ed9c8a5c0c3e410ea0b33)
|
||||||
|
- Added static img folder for directly serving images [`0dbd731`](https://git.odit.services/lfk/document-server/commit/0dbd7311aba081003b75c91f277b49e8d5cb68d9)
|
||||||
|
- Fixed docs not getting bundeled [`ee3c443`](https://git.odit.services/lfk/document-server/commit/ee3c4432162a69be39f475f6a2db6c3a49af6c47)
|
||||||
|
|
||||||
|
#### [v0.6.1](https://git.odit.services/lfk/document-server/compare/v0.6.0...v0.6.1)
|
||||||
|
|
||||||
|
> 23 February 2023
|
||||||
|
|
||||||
|
- Dependency cleanup [`c21076a`](https://git.odit.services/lfk/document-server/commit/c21076a049484e353735db8542a932d93d0520c1)
|
||||||
|
- Dependency Bumps [`fc774d5`](https://git.odit.services/lfk/document-server/commit/fc774d5af39d7b6db999e85f2be8e109400cf862)
|
||||||
|
- 🚀Bumped version to v0.6.1 [`bbe01cd`](https://git.odit.services/lfk/document-server/commit/bbe01cd231a4fed897b3a30858d008506ad410be)
|
||||||
|
- Slimmed down docker build thx to copy [`10c68cf`](https://git.odit.services/lfk/document-server/commit/10c68cfb37025642688cde40cac69a8ff7f6c513)
|
||||||
|
|
||||||
|
#### [v0.6.0](https://git.odit.services/lfk/document-server/compare/v0.5.1...v0.6.0)
|
||||||
|
|
||||||
|
> 23 February 2023
|
||||||
|
|
||||||
|
- Merge branch 'bugfix/44-runner-certificates-result-in-a-status-500' into dev [`#44`](https://git.odit.services/lfk/document-server/issues/44)
|
||||||
|
- Lockfile [`b47b2f8`](https://git.odit.services/lfk/document-server/commit/b47b2f804f5419bff6f0cddbc1dbc12d29afd935)
|
||||||
|
- Fixed Locale comma format [`2a33226`](https://git.odit.services/lfk/document-server/commit/2a3322612d473bd9002cf8d6f9807f9dc7d687da)
|
||||||
|
- Added autochangelog [`d064b51`](https://git.odit.services/lfk/document-server/commit/d064b51e1b3e00d9c49b1e983bd75def6d8512be)
|
||||||
|
- Moved drone to kaniko [`744f567`](https://git.odit.services/lfk/document-server/commit/744f567b7cc7fcbe916143bb98f1dd784fe794da)
|
||||||
|
- Updated translation due to customer request [`517e8a0`](https://git.odit.services/lfk/document-server/commit/517e8a081970b9ce4f6f225a7f9b5b54cca1258e)
|
||||||
|
- 🚀Bumped version to v0.6.0 [`dd0b60b`](https://git.odit.services/lfk/document-server/commit/dd0b60b2ba98efaeaeeea3b056f6937c5579598a)
|
||||||
|
- Bumped docker images [`05e0c63`](https://git.odit.services/lfk/document-server/commit/05e0c639319a2a635bbcf0f5f6bd08d6a46dce74)
|
||||||
|
- wrap distanceDonations.reduce in array length check [`bac004d`](https://git.odit.services/lfk/document-server/commit/bac004d74eb954d1753d4efcdb927822b89fa757)
|
||||||
|
- Nerf [`7dbce9e`](https://git.odit.services/lfk/document-server/commit/7dbce9e87046567de1ea46deaea427a5353057b3)
|
||||||
|
- Version pin [`6add09c`](https://git.odit.services/lfk/document-server/commit/6add09c7df6872b6922f6624ee89b4a04ad6fc0a)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`300b8fd`](https://git.odit.services/lfk/document-server/commit/300b8fd01a0b601935c3658b195759dd19041c5f)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`ff0421d`](https://git.odit.services/lfk/document-server/commit/ff0421da2f16a8f79f9987dabea7bdcb4ef88c05)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`fcbcec8`](https://git.odit.services/lfk/document-server/commit/fcbcec85c531d774be1337f179dae2aa1d5f3839)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`b78534e`](https://git.odit.services/lfk/document-server/commit/b78534e1b0165522ff0ee1dfd110d8ba78f183d8)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`5e92b9a`](https://git.odit.services/lfk/document-server/commit/5e92b9a48fcbb8ab6a179c53f180a7a6bd743ae7)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`dca2829`](https://git.odit.services/lfk/document-server/commit/dca2829323f3a19247455df99498633605d09603)
|
||||||
|
- Fixed decimal separator in docker [`c9cb03e`](https://git.odit.services/lfk/document-server/commit/c9cb03ea95acccd6cdc8b86c747c787938840d07)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`451b7fb`](https://git.odit.services/lfk/document-server/commit/451b7fbe0543991e8a203e38daa350a954ae0e11)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`573b921`](https://git.odit.services/lfk/document-server/commit/573b9211972a55df0a38742cb6eb789d6fd3717b)
|
||||||
|
- Added image [`5f4fc74`](https://git.odit.services/lfk/document-server/commit/5f4fc74cd9ff6764d209d49822020cda70b3514e)
|
||||||
|
- 🚀Bumped version to v0.6.0 [`72ed249`](https://git.odit.services/lfk/document-server/commit/72ed2495f6feb90643d3c9d7fa943a2703533331)
|
||||||
|
- Changed default kilometer formatting to min 2 decimals, max 3 [`3af4b52`](https://git.odit.services/lfk/document-server/commit/3af4b521d302e3aab558d20f1fccca57ea61fff3)
|
||||||
|
- Merge pull request 'Fixed decimal separator' (#47) from dev into main [`57a84c2`](https://git.odit.services/lfk/document-server/commit/57a84c256a978f583508bdf772499466a73b4a22)
|
||||||
|
- 🚀Bumped version to v0.5.4 [`4b5a862`](https://git.odit.services/lfk/document-server/commit/4b5a86282d0618a0c5b00fc796efe77db2103356)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`c7f5754`](https://git.odit.services/lfk/document-server/commit/c7f57548f316e1bb6635bd56bd269d80ac1e220f)
|
||||||
|
- Merge pull request 'Hotfixes' (#46) from dev into main [`8d00307`](https://git.odit.services/lfk/document-server/commit/8d003071704b5a6d7b0d70aff2f9cb05c3660b78)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`f846572`](https://git.odit.services/lfk/document-server/commit/f8465721cddfb55d51eb30d29d74ef63d825b5ac)
|
||||||
|
- Fix for runner donation array [`72303b1`](https://git.odit.services/lfk/document-server/commit/72303b11052276ad15373887f9e04183841f56f4)
|
||||||
|
- 🚀Bumped version to v0.5.3 [`01e1323`](https://git.odit.services/lfk/document-server/commit/01e1323555fe67f6f0ce3c18163e475035bd1cdd)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`4b4d66a`](https://git.odit.services/lfk/document-server/commit/4b4d66ae784150f7e1cc491a3fc5d84c93273aee)
|
||||||
|
- Merge pull request 'v0.5.2: hotfix TypeError in Runner Certificate generation' (#45) from dev into main [`c935950`](https://git.odit.services/lfk/document-server/commit/c935950eb052bce71185fc74c750ec77f081e7df)
|
||||||
|
- 🚀Bumped version to v0.5.2 [`274c13e`](https://git.odit.services/lfk/document-server/commit/274c13e358f16207fe8bb5cdc1b9ede0582ecb46)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`b7b7f6a`](https://git.odit.services/lfk/document-server/commit/b7b7f6a0ae304d24f90a3de3931f53cf08770060)
|
||||||
|
|
||||||
|
#### [v0.5.1](https://git.odit.services/lfk/document-server/compare/v0.5.0...v0.5.1)
|
||||||
|
|
||||||
|
> 22 April 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Release 0.5.1' (#43) from dev into main [`11efdeb`](https://git.odit.services/lfk/document-server/commit/11efdebacf076ecfe0e10cdcda37ac07464901ce)
|
||||||
|
- Quick callstack fix🛠 [`76418f6`](https://git.odit.services/lfk/document-server/commit/76418f65e1e111e83838f0d42c541ae6a8063a09)
|
||||||
|
- Fixed barcode generation for runenrcard pdfs🐞 [`f78037c`](https://git.odit.services/lfk/document-server/commit/f78037c0f15162d5b98986edf20d263961f43e69)
|
||||||
|
- Updated docker-compose example🐳 [`a4c8dad`](https://git.odit.services/lfk/document-server/commit/a4c8dade23e448d4d4caefe304a6cd9195c873a4)
|
||||||
|
- Now laoding card subtitle from env [`e97e209`](https://git.odit.services/lfk/document-server/commit/e97e2097463f4c88947e865a38ea1e5aa2be1f5d)
|
||||||
|
- typo fixes [`fa26ed6`](https://git.odit.services/lfk/document-server/commit/fa26ed6012ded759d3702587dba67c2090324801)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`2ee4c06`](https://git.odit.services/lfk/document-server/commit/2ee4c060557a44db1974a015412288f7942ebe72)
|
||||||
|
- more typo fixes [`981bae4`](https://git.odit.services/lfk/document-server/commit/981bae4786a2fa12a1355122e8c5a1e95e29cf32)
|
||||||
|
- You can now configure the card's code format distinct from the others [`ac9be79`](https://git.odit.services/lfk/document-server/commit/ac9be793bd598771174f5313ef8288240306ba5c)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`0f2d6f5`](https://git.odit.services/lfk/document-server/commit/0f2d6f58d6a8a8888263778cf1a14c73b28e774e)
|
||||||
|
- 🚀Bumped version to v0.5.1 [`22fb3ed`](https://git.odit.services/lfk/document-server/commit/22fb3edd7836ba4ca35e6b208ab6f6620da60f4a)
|
||||||
|
- Emoji+Chinese fixes🌍 [`b6fc069`](https://git.odit.services/lfk/document-server/commit/b6fc069042dc9c5d7ec97f2660568e8e105780b9)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`cc4a2b4`](https://git.odit.services/lfk/document-server/commit/cc4a2b4ab4c2cb9976797f93e8348607fb88ea7d)
|
||||||
|
- Dependenc bump 🔝 [`d8f3a6e`](https://git.odit.services/lfk/document-server/commit/d8f3a6ed063a9cdf6189e85ae01a5516b4295892)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`a57e090`](https://git.odit.services/lfk/document-server/commit/a57e0909b919a1c720c9994b6baa8910b78dc569)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`ded610f`](https://git.odit.services/lfk/document-server/commit/ded610f11464a27429b8184a32554e99aed63f72)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`60cc343`](https://git.odit.services/lfk/document-server/commit/60cc343adf71ed3b849d1d93af3d60cbc2820fed)
|
||||||
|
- Added new config options to reamde [`010f204`](https://git.odit.services/lfk/document-server/commit/010f2046ad326898c75b6546e4d70a6f78346d8b)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`2e7c3e8`](https://git.odit.services/lfk/document-server/commit/2e7c3e8a5b7f6a0461254b33c6f412929719c966)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`754d0ca`](https://git.odit.services/lfk/document-server/commit/754d0ca58ccf8f77570ff6218f2dec61cfb4f808)
|
||||||
|
- Fixed typo in translation [`8f30d89`](https://git.odit.services/lfk/document-server/commit/8f30d8933f105b4bf112c81222a72ca1931145d7)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`3c02e13`](https://git.odit.services/lfk/document-server/commit/3c02e13997b1626fb0e6496da4c58eac2cc6fcf8)
|
||||||
|
|
||||||
|
#### [v0.5.0](https://git.odit.services/lfk/document-server/compare/v0.4.3...v0.5.0)
|
||||||
|
|
||||||
|
> 31 March 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Release 0.5.0' (#42) from dev into main [`a81db03`](https://git.odit.services/lfk/document-server/commit/a81db03ba3b274c44be4b4c0c318083bdeb07987)
|
||||||
|
- Added translations [`ac572f1`](https://git.odit.services/lfk/document-server/commit/ac572f1ea31cb66985e04cb5d56cc67f521e990d)
|
||||||
|
- Added translations [`7fea1ca`](https://git.odit.services/lfk/document-server/commit/7fea1ca78ff6fdbb38dee0edd9918eaeb1264d18)
|
||||||
|
- Sorted translations 🌍 [`2278e4a`](https://git.odit.services/lfk/document-server/commit/2278e4ad06947b540323856ea1e71022562ea719)
|
||||||
|
- Added front certificate design [`8b71608`](https://git.odit.services/lfk/document-server/commit/8b71608792f00084df1e71956e503f102cea290d)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`3fc6124`](https://git.odit.services/lfk/document-server/commit/3fc612488d1f231d83d6a5823a13dc4817e6a588)
|
||||||
|
- Addest first coupple of test improvements [`a580841`](https://git.odit.services/lfk/document-server/commit/a5808419738563fec3a7d8d35f4ce20d76c017fb)
|
||||||
|
- Pinned depencencies (and bumped some) [`479e28c`](https://git.odit.services/lfk/document-server/commit/479e28c46c6b3b8ba1622bcf5712695a94c2ae89)
|
||||||
|
- Added new basic certificate endpoint [`0af9b81`](https://git.odit.services/lfk/document-server/commit/0af9b81b38e1c28261c012375af2c91808e65621)
|
||||||
|
- Added function for generateing runner certificates [`955e118`](https://git.odit.services/lfk/document-server/commit/955e11846b5385c1a0b6f0b54b9951f0768ff414)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`f220e70`](https://git.odit.services/lfk/document-server/commit/f220e70743534c1fc66ff6f50e3693182d35990a)
|
||||||
|
- Now formatting currency ans distance [`e0add84`](https://git.odit.services/lfk/document-server/commit/e0add846bb37b435da9807bdc76c70793002896e)
|
||||||
|
- Fixed bg image opacity overlay [`8d6ea4d`](https://git.odit.services/lfk/document-server/commit/8d6ea4dbf9763994f0f44c4ad9b32a7b1d16f11a)
|
||||||
|
- Pinned dev dependencies [`82159be`](https://git.odit.services/lfk/document-server/commit/82159bed536bbafd20746927f5a7f61f76959637)
|
||||||
|
- Now calculateing total donations (perdistance) [`6b23dea`](https://git.odit.services/lfk/document-server/commit/6b23dea47745e98371a65a4f577f2e20cfdfe597)
|
||||||
|
- Added backside table [`3ca2237`](https://git.odit.services/lfk/document-server/commit/3ca22379535bba72d05e0b3fafe22d3a4b2f549d)
|
||||||
|
- Added template strings [`6767c3b`](https://git.odit.services/lfk/document-server/commit/6767c3b2d1e991e2f4f74b8d423a72e240ffcb8c)
|
||||||
|
- Added template strings [`2b21957`](https://git.odit.services/lfk/document-server/commit/2b2195727b15b8666edf0d925f2e68a98030153d)
|
||||||
|
- Fixed background opacity [`2a4cfdb`](https://git.odit.services/lfk/document-server/commit/2a4cfdb2f88ad3ac1ebc925199a440756e9e9d3a)
|
||||||
|
- Now with embedded background [`64fce5b`](https://git.odit.services/lfk/document-server/commit/64fce5bd019a00bf34c1ebd133c1904bb577b67b)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`7ae4750`](https://git.odit.services/lfk/document-server/commit/7ae47503076f6721d1cfd82fbf8218b9febfa580)
|
||||||
|
- 🚀Bumped version to v0.5.0 [`f623c0a`](https://git.odit.services/lfk/document-server/commit/f623c0a7cd06f707ac488456c9e8a051d3ceae46)
|
||||||
|
- Merge pull request 'Generate runner certificates feature/36-runner_certificates' (#41) from feature/36-runner_certificates into dev [`d3f7d1a`](https://git.odit.services/lfk/document-server/commit/d3f7d1a6c9858d7fdf09c696622962e6f8471e78)
|
||||||
|
- disabled testing for now [`cec8930`](https://git.odit.services/lfk/document-server/commit/cec893032dea9f312e37841232a9434e19b79003)
|
||||||
|
- Added missing interpolations [`b43aeec`](https://git.odit.services/lfk/document-server/commit/b43aeec0cf40a9c37a10072062ab5d93102f6c81)
|
||||||
|
- Made footer text configureable [`63c7beb`](https://git.odit.services/lfk/document-server/commit/63c7beb8b9cdc564186c5b86a4f305c8575f5b9f)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`f1084b5`](https://git.odit.services/lfk/document-server/commit/f1084b59a74dcc5981fd314721c36726706f386c)
|
||||||
|
- disabled testing for now [`e75f151`](https://git.odit.services/lfk/document-server/commit/e75f15142e293349a071a7cdcc53cc10780304f6)
|
||||||
|
- Removed temporary background-image fix [`5ba26c4`](https://git.odit.services/lfk/document-server/commit/5ba26c4cbfae7d3f31d3709aaeb372c14de78fa9)
|
||||||
|
- Fixed page size+background image [`b82a32a`](https://git.odit.services/lfk/document-server/commit/b82a32ae3ee3256402be5dde0ada903f2c19a8cc)
|
||||||
|
- Fixed typo [`1d12de7`](https://git.odit.services/lfk/document-server/commit/1d12de7045b5e8324dc0ddc421944e70ffc2ec73)
|
||||||
|
- Documented new env var [`5a98688`](https://git.odit.services/lfk/document-server/commit/5a98688d60eed34644391ecde638949fe5a46c65)
|
||||||
|
|
||||||
|
#### [v0.4.3](https://git.odit.services/lfk/document-server/compare/v0.4.2...v0.4.3)
|
||||||
|
|
||||||
|
> 30 March 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Release 0.4.3' (#40) from dev into main [`c8dc998`](https://git.odit.services/lfk/document-server/commit/c8dc998ecdccc7fc4348ecc0db552a3d7bc2eb52)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`289a0d8`](https://git.odit.services/lfk/document-server/commit/289a0d8671575dda911c64f79d24726d3bbee071)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`3df3d26`](https://git.odit.services/lfk/document-server/commit/3df3d26708aab12590cd9c1f697cfdea8017ace4)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`457ea26`](https://git.odit.services/lfk/document-server/commit/457ea26cf8124009084415d12c7a0e31912a3eb1)
|
||||||
|
- 🚀Bumped version to v0.4.3 [`c3beb3e`](https://git.odit.services/lfk/document-server/commit/c3beb3e1032492f9a8304c4b099a700ad0d1d2cf)
|
||||||
|
- Pipeline mtu fix [`c2d2b66`](https://git.odit.services/lfk/document-server/commit/c2d2b66f2f6fbd30c2027fd3dab393db5219eb44)
|
||||||
|
|
||||||
|
#### [v0.4.2](https://git.odit.services/lfk/document-server/compare/v0.4.0...v0.4.2)
|
||||||
|
|
||||||
|
> 29 March 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Release 0.4.2' (#39) from dev into main [`ce3053c`](https://git.odit.services/lfk/document-server/commit/ce3053c0ba5404ebd8d4cbd5386c454d8cd8c4d2)
|
||||||
|
- 🚀Bumped version to v0.4.1 [`d17108f`](https://git.odit.services/lfk/document-server/commit/d17108f4b9f041727afcee5c171d5d8f9a3c677c)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`0ade575`](https://git.odit.services/lfk/document-server/commit/0ade57536e372a62356fe2f329f6cfe04bcfc397)
|
||||||
|
- Fixed faulty object mapping [`9584bfe`](https://git.odit.services/lfk/document-server/commit/9584bfed8ba5b8c856b55aa90969874d4d6751ff)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`8bac1fa`](https://git.odit.services/lfk/document-server/commit/8bac1fadd6b4257e5062a1b1673e122c5b535046)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`b8f0d1f`](https://git.odit.services/lfk/document-server/commit/b8f0d1fa60da4e3262623cecf4a78c8a9a322f8c)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`073433f`](https://git.odit.services/lfk/document-server/commit/073433f308f2f8e7ada97dd0b3896fb541e85711)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`a478081`](https://git.odit.services/lfk/document-server/commit/a47808172797e12800c46d17ccf4b458f4a506de)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`6608456`](https://git.odit.services/lfk/document-server/commit/6608456c686e51d3aa16e630ba72c7c29e428b2a)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`0839ff6`](https://git.odit.services/lfk/document-server/commit/0839ff63593cfb9e8339b2b2a86dbe7e2afb5dcb)
|
||||||
|
- Now using our own images to build stuff 🚀 [`96886c7`](https://git.odit.services/lfk/document-server/commit/96886c74bc397e1ee793e83e0d01a6bbaa953da3)
|
||||||
|
- 🚀Bumped version to v0.4.2 [`1cbe5a1`](https://git.odit.services/lfk/document-server/commit/1cbe5a1614c40fbf23f032be60039ddb1472ca94)
|
||||||
|
- Emergency bugfixes 🐞 [`3c42ca3`](https://git.odit.services/lfk/document-server/commit/3c42ca30427174c21e0db6426d8f0d91a1ebc501)
|
||||||
|
- Let's try the mtu fix [`c51ec74`](https://git.odit.services/lfk/document-server/commit/c51ec74d30334b156668de4719c77f2e9c6d023f)
|
||||||
|
|
||||||
|
#### [v0.4.0](https://git.odit.services/lfk/document-server/compare/v0.3.3...v0.4.0)
|
||||||
|
|
||||||
|
> 14 March 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.4.0' (#38) from dev into main [`8d3cc34`](https://git.odit.services/lfk/document-server/commit/8d3cc34395922a271da1032310da6ec6f7a164f7)
|
||||||
|
- Updated ci with new kubernetes secrets 🚀🚀🚀 [`b180e04`](https://git.odit.services/lfk/document-server/commit/b180e0404537404d0564453fde5976f4de672a8b)
|
||||||
|
- Updated styleing [`03ed6d5`](https://git.odit.services/lfk/document-server/commit/03ed6d5bc18c5b26edd7b1d698c9de936e008f32)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`b612562`](https://git.odit.services/lfk/document-server/commit/b612562d347f5fafcf4ce94a4508b7c0bb9370c6)
|
||||||
|
- 🚀Bumped version to v0.4.0 [`85519bc`](https://git.odit.services/lfk/document-server/commit/85519bc2e4e8906732dc5f99e417014a14bad7d0)
|
||||||
|
- Merge pull request 'Configureable contracts amount feature/35-contracts_per_runner' (#37) from feature/35-contracts_per_runner into dev [`ed02306`](https://git.odit.services/lfk/document-server/commit/ed023067386551dc92d60ba63dff8bc4cc44ce00)
|
||||||
|
- Added disclaimer to template [`4e1e124`](https://git.odit.services/lfk/document-server/commit/4e1e124d0dc08f96aeb05dd1c975064fe785b80f)
|
||||||
|
- Changed ci pipeline type to kubernetes [`677bd86`](https://git.odit.services/lfk/document-server/commit/677bd861335302269baec96a59916475bbdd405f)
|
||||||
|
- Added config for amount of contracts per runner [`d01b4a0`](https://git.odit.services/lfk/document-server/commit/d01b4a0b99f3c1aa088b02d766d21bfb6b9e3a29)
|
||||||
|
- Added logic for generateing multiple contracts per runner [`d991940`](https://git.odit.services/lfk/document-server/commit/d9919404b5b90151318d20258a273ca6c7640393)
|
||||||
|
- MAde disclaimer configurable via env [`5e4d6f4`](https://git.odit.services/lfk/document-server/commit/5e4d6f44dab581483135594432bd8c8d65ba74ef)
|
||||||
|
- MAde disclaimer configurable via env [`885765a`](https://git.odit.services/lfk/document-server/commit/885765ac71b6a65c869ee841c383667f4947dcde)
|
||||||
|
- Documented the new config var [`31a5950`](https://git.odit.services/lfk/document-server/commit/31a59500fa77f1ad7c54fa297d00c8707ae6db9c)
|
||||||
|
- Merge pull request 'Configurable sponsoring disclaimer feature/33-disclaimer' (#34) from feature/33-disclaimer into dev [`e9d3574`](https://git.odit.services/lfk/document-server/commit/e9d35745997a9e948509ea67b59f5a7658f9d652)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`19fbf50`](https://git.odit.services/lfk/document-server/commit/19fbf50f6f6057c5321a999b6551d05db32b5fd8)
|
||||||
|
- Added reamde entry for the new env var [`9dd62ce`](https://git.odit.services/lfk/document-server/commit/9dd62cefa94bf3f0bf8e77fd25e7ca1ec4b30e2b)
|
||||||
|
|
||||||
|
#### [v0.3.3](https://git.odit.services/lfk/document-server/compare/v0.3.2...v0.3.3)
|
||||||
|
|
||||||
|
> 19 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.3.3 - Download options' (#32) from dev into main [`21b5e04`](https://git.odit.services/lfk/document-server/commit/21b5e048ed5ed72f88304e5c737639c54cc71483)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`d1a29c1`](https://git.odit.services/lfk/document-server/commit/d1a29c1cbb8845a1adf8a414d158ebcabd48dc04)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`fd8b7e5`](https://git.odit.services/lfk/document-server/commit/fd8b7e56da4a1601141f63627e3990660c521ea6)
|
||||||
|
- Added download option to cards [`1ca5d3e`](https://git.odit.services/lfk/document-server/commit/1ca5d3ea078ef51818657e2b3c9f114c67bff86d)
|
||||||
|
- Added download header [`55877de`](https://git.odit.services/lfk/document-server/commit/55877de2aa46583f30d033467037e0454d1236be)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`c012b49`](https://git.odit.services/lfk/document-server/commit/c012b4943d96ee3a9442c65389c4dcea08642109)
|
||||||
|
- 🚀Bumped version to v0.3.3 [`ba566bc`](https://git.odit.services/lfk/document-server/commit/ba566bcc33ed920324cd9977b3f293a2c629f92c)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`a386c5b`](https://git.odit.services/lfk/document-server/commit/a386c5bef88da29e4447399d4edca0234b674ed5)
|
||||||
|
|
||||||
|
#### [v0.3.2](https://git.odit.services/lfk/document-server/compare/v0.3.0...v0.3.2)
|
||||||
|
|
||||||
|
> 18 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.3.2' (#31) from dev into main [`e6f7dd2`](https://git.odit.services/lfk/document-server/commit/e6f7dd2be8d729f5fc7fbb458cc859b113f5aa86)
|
||||||
|
- 🚀Bumped version to v0.3.1 [`dcde424`](https://git.odit.services/lfk/document-server/commit/dcde424b77dcc9753859f94f7bcbe24fe3523c27)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`92c5240`](https://git.odit.services/lfk/document-server/commit/92c52401b398f6a2f247c10879e17f6dc105aa8e)
|
||||||
|
- Now manually parsing runnergroup full names [`c290908`](https://git.odit.services/lfk/document-server/commit/c2909082a2dbb38041ae0fc695bd0fa1451b39ff)
|
||||||
|
- Implemented basic auth [`bdeadd2`](https://git.odit.services/lfk/document-server/commit/bdeadd274bc0f9c8cbab35a8a5605bef4c22ba6c)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`9d7d044`](https://git.odit.services/lfk/document-server/commit/9d7d0443848522e5bdfdb6a80c836bea4bc200a1)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`cc6a53b`](https://git.odit.services/lfk/document-server/commit/cc6a53b25895594874acca370a1439d37bb280de)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`e306cdb`](https://git.odit.services/lfk/document-server/commit/e306cdb2c8e58fc1aef79b95cba5d4cc96ac7658)
|
||||||
|
- Added auth to openapi spec [`729f2d7`](https://git.odit.services/lfk/document-server/commit/729f2d7240b54ffe2d4db36cce29de0afdfc9417)
|
||||||
|
- Pinned routing controllers version as temp workaround for routing controllers openapi being broken again [`7ca7266`](https://git.odit.services/lfk/document-server/commit/7ca7266ea46965251c9df637a2556f2a1706e7e6)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`b7c6c6e`](https://git.odit.services/lfk/document-server/commit/b7c6c6e15708e471f5c3d0ca4cf11b1c08c88c9c)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`95099c5`](https://git.odit.services/lfk/document-server/commit/95099c5fbd7e6cb07c68151a998eebb0f00556f3)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`49590b8`](https://git.odit.services/lfk/document-server/commit/49590b897ed5ee5c9386d34408ac6868f43cc27c)
|
||||||
|
- 🚀Bumped version to v0.3.2 [`a9019e4`](https://git.odit.services/lfk/document-server/commit/a9019e4c67e7620b65650d60b0ebd57bc11a854e)
|
||||||
|
- Merge pull request 'Now using full group names feature/18-group_names' (#30) from feature/18-group_names into dev [`e0db6f6`](https://git.odit.services/lfk/document-server/commit/e0db6f6a78d0026a8485a57c88af1e9407bd68a4)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`adf11ab`](https://git.odit.services/lfk/document-server/commit/adf11ab1c356b6964230541331836abd363170b0)
|
||||||
|
- Updated templates with full group name [`0fcfb30`](https://git.odit.services/lfk/document-server/commit/0fcfb30d5c13266ca4faf7697308dfb7a0f91b4f)
|
||||||
|
- Merge pull request 'Alpha Release 0.3.1 - API Keys' (#29) from dev into main [`db91661`](https://git.odit.services/lfk/document-server/commit/db916615564813e8d21e3672581e4f3a4d748b89)
|
||||||
|
- Merge pull request 'API Key based auth feature/26-api_auth' (#27) from feature/26-api_auth into dev [`2d031da`](https://git.odit.services/lfk/document-server/commit/2d031dae035866a4aa247398ea68ff338ab58cbd)
|
||||||
|
- Added api key to env doc [`4543092`](https://git.odit.services/lfk/document-server/commit/454309278ef20a2b97248277b07a7b58a063618d)
|
||||||
|
- Fixed bug [`7be211f`](https://git.odit.services/lfk/document-server/commit/7be211f8b7b26f7f620df81af4ebde5eec2feec2)
|
||||||
|
|
||||||
|
#### [v0.3.0](https://git.odit.services/lfk/document-server/compare/v0.2.0...v0.3.0)
|
||||||
|
|
||||||
|
> 12 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.3.0 - Runnercard generation' (#25) from dev into main [`406add3`](https://git.odit.services/lfk/document-server/commit/406add3d517473d01628b6405569de6cb85114e0)
|
||||||
|
- 🚀Bumped version to v0.2.0 [`491cdb8`](https://git.odit.services/lfk/document-server/commit/491cdb8d71a80ea196d16334c0c80b8f7cc859c5)
|
||||||
|
- Added card generation speed tests (part 1) [`68572b1`](https://git.odit.services/lfk/document-server/commit/68572b194eb740238be8101efed6fdb2a207f65b)
|
||||||
|
- Implemented first experimental speedtest [`e3a45a6`](https://git.odit.services/lfk/document-server/commit/e3a45a61ac3b2d691c2f75d36155896b7ed301d8)
|
||||||
|
- Added basic logic to generate two-sided runnercards [`d3a213c`](https://git.odit.services/lfk/document-server/commit/d3a213ce3326aeb96d924e16a31fc87bf82eb5b3)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`149bf18`](https://git.odit.services/lfk/document-server/commit/149bf1849db20b863ec998a72c77559ec401bc32)
|
||||||
|
- Fixed double-sided printing [`7f58dd6`](https://git.odit.services/lfk/document-server/commit/7f58dd694b53152069c2095b2e18dd3a46cd04dd)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`e74b9a4`](https://git.odit.services/lfk/document-server/commit/e74b9a4c9d041780e0cfd8c4d68a5b63f916e091)
|
||||||
|
- Added basic card generation function [`8fc6c71`](https://git.odit.services/lfk/document-server/commit/8fc6c7176ee92f813db1e1d4b3e5ef1b2f4e1aef)
|
||||||
|
- Beautified output a bit [`aefe549`](https://git.odit.services/lfk/document-server/commit/aefe5493b06c04cc2b20029e1f7fc5f15ec9c04e)
|
||||||
|
- Added barcode generatin [`5c075bc`](https://git.odit.services/lfk/document-server/commit/5c075bce8b94ff4482448c3cd56bdc28cbe0a7d9)
|
||||||
|
- Implemented runner generation using fakerjs [`0894446`](https://git.odit.services/lfk/document-server/commit/08944460854c78cd4368cf178b022c31b624c8d9)
|
||||||
|
- Styled front [`016f746`](https://git.odit.services/lfk/document-server/commit/016f746c7cec29ab391b3918c7589dea0cff9890)
|
||||||
|
- Now loading sponsor logos from env [`29376a7`](https://git.odit.services/lfk/document-server/commit/29376a7782ce39f04f856ec78775e65aa11f0ed7)
|
||||||
|
- Implmented sponsoring image selection from array [`68a1b8f`](https://git.odit.services/lfk/document-server/commit/68a1b8f3e0515e56c7c6069f7f3ef8db24c92674)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`dbccbf6`](https://git.odit.services/lfk/document-server/commit/dbccbf68f4e22470b4fc93c894527cc78973e324)
|
||||||
|
- Added cards api endpoint [`929ac81`](https://git.odit.services/lfk/document-server/commit/929ac81515b3b426ff06f1d6d913bab930421a92)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`96204d8`](https://git.odit.services/lfk/document-server/commit/96204d809e852c1bcea808a9c8f5ca0f8475c87f)
|
||||||
|
- Fixed runnercard backside padding [`08e8587`](https://git.odit.services/lfk/document-server/commit/08e858726c1462b599ba9cb3f7fb057f35178b83)
|
||||||
|
- Added sizing for the real cards [`b92a6f7`](https://git.odit.services/lfk/document-server/commit/b92a6f7b2b98fb0074d5a563d9918295e9ec0274)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`8a90f63`](https://git.odit.services/lfk/document-server/commit/8a90f63b0919376beefef6a52aae9a59337aea59)
|
||||||
|
- 🚀Bumped version to v0.3.0 [`449a96b`](https://git.odit.services/lfk/document-server/commit/449a96b3027fe93d8042b30420245f66e92f14b8)
|
||||||
|
- Merge pull request 'Card generation feature/14-card_generation' (#24) from feature/14-card_generation into dev [`703eaa0`](https://git.odit.services/lfk/document-server/commit/703eaa0e9d667b628eab4e8496689fe66238f896)
|
||||||
|
- Added speedtest script to package [`75b8b28`](https://git.odit.services/lfk/document-server/commit/75b8b281b87d9b173093f16beae12d707ec05052)
|
||||||
|
- Fixed bug in array swapping function [`9697d53`](https://git.odit.services/lfk/document-server/commit/9697d53a1527854536f8ddf5426f7ca902772f51)
|
||||||
|
- Added **very** basic backside [`68f46a4`](https://git.odit.services/lfk/document-server/commit/68f46a45b5a51c8a8edafca852cb274af388fa76)
|
||||||
|
- Added card generation speed tests (part 2) [`d38923c`](https://git.odit.services/lfk/document-server/commit/d38923c4ad3a2cf8872e236dd42f078e2a0e1045)
|
||||||
|
- Implemented basic contracts tests in various sizes [`a1b0a19`](https://git.odit.services/lfk/document-server/commit/a1b0a1918db552eb385fedcbaa576ad493a1d605)
|
||||||
|
- tmp [`0d27916`](https://git.odit.services/lfk/document-server/commit/0d27916188114fa41e666170135de2b714ff113a)
|
||||||
|
- Added new env vars to readme [`cf0f583`](https://git.odit.services/lfk/document-server/commit/cf0f5839ee1e1b87f7b5bd5a299a35574fd1bb3c)
|
||||||
|
- Merge pull request 'Added speedtest feature/19-speed_test' (#23) from feature/19-speed_test into dev [`7ac8edb`](https://git.odit.services/lfk/document-server/commit/7ac8edb5cf4b7317a703faa32ded482a8c2b9b91)
|
||||||
|
|
||||||
|
#### [v0.2.0](https://git.odit.services/lfk/document-server/compare/v0.1.3...v0.2.0)
|
||||||
|
|
||||||
|
> 9 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.2.0 - The barcode release' (#22) from dev into main [`b952ac4`](https://git.odit.services/lfk/document-server/commit/b952ac4d728952e1fb6d26b0929e3f946748b85b)
|
||||||
|
- Implemented async barcode generation using async helpers [`edc846a`](https://git.odit.services/lfk/document-server/commit/edc846ab05319a4e60422625678f204bc145884c)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`fea0b1d`](https://git.odit.services/lfk/document-server/commit/fea0b1dc0582d2906bad22f2ff5e5aad90a1c885)
|
||||||
|
- Reworked template layout for barcode [`1c06689`](https://git.odit.services/lfk/document-server/commit/1c066898009883f510fa204c66800e5f6228a15d)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`7122fe7`](https://git.odit.services/lfk/document-server/commit/7122fe7dbe3fae64806492636255147078eb03c8)
|
||||||
|
- Merge pull request 'Barcode generation feature/13-barcode_generation' (#21) from feature/13-barcode_generation into dev [`ff36b48`](https://git.odit.services/lfk/document-server/commit/ff36b4871f2d696c0b86883d529365ee8f1c6132)
|
||||||
|
- Now with working code scaleing [`4b79b29`](https://git.odit.services/lfk/document-server/commit/4b79b29ee6319559c9d68ddb11f831d25f12b3da)
|
||||||
|
- Added basic barcode generation [`8072d0b`](https://git.odit.services/lfk/document-server/commit/8072d0b1940ef6f316ce78dcbcb9e5af5bab04e7)
|
||||||
|
- Now loading barcode format from env with overwrite via query param [`9a7c1d6`](https://git.odit.services/lfk/document-server/commit/9a7c1d64fdbdadbd104739133a87773e4d2bca01)
|
||||||
|
- Added fallback error image [`5023457`](https://git.odit.services/lfk/document-server/commit/502345782f26895ccf3089d15c3817709b62dfcc)
|
||||||
|
- First part of the handlebars barcode generation [`a35f8cf`](https://git.odit.services/lfk/document-server/commit/a35f8cfd3aa94923968fd77425c074844d28ec0d)
|
||||||
|
- Added todo [`75d2ac3`](https://git.odit.services/lfk/document-server/commit/75d2ac3c5f80f8440b6d48c33b15ef17565559b3)
|
||||||
|
- Removed promise [`e1ec193`](https://git.odit.services/lfk/document-server/commit/e1ec193a4ff1cd618da90f5f2d029ec848a6f669)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`03f63e3`](https://git.odit.services/lfk/document-server/commit/03f63e3777381a4475910e6fa4a3986f87b73f39)
|
||||||
|
- Fixed broken mime-type [`4187a8e`](https://git.odit.services/lfk/document-server/commit/4187a8e82015495c0e0362e957e236ed6935a908)
|
||||||
|
- Switched to using the current runner's id as the barcode text [`3e2b011`](https://git.odit.services/lfk/document-server/commit/3e2b011d2887d261fb9c36820982095d6dd6d847)
|
||||||
|
- Added barcode field to template [`27d1d69`](https://git.odit.services/lfk/document-server/commit/27d1d69360c8513079abcfe3a6fc2a50309a2b61)
|
||||||
|
|
||||||
|
#### [v0.1.3](https://git.odit.services/lfk/document-server/compare/v0.1.2...v0.1.3)
|
||||||
|
|
||||||
|
> 9 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.1.3 - More env vars' (#20) from dev into main [`ecd02a1`](https://git.odit.services/lfk/document-server/commit/ecd02a1af7431d0bf615c4ec064f64e023946e49)
|
||||||
|
- 🚀Bumped version to v0.1.3 [`6a14232`](https://git.odit.services/lfk/document-server/commit/6a142328898d5b89fa11eaf033372971d1093b0c)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`ad9a8a4`](https://git.odit.services/lfk/document-server/commit/ad9a8a4fe0649d48db924771be8ecb4cbf5c162a)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`b6296b8`](https://git.odit.services/lfk/document-server/commit/b6296b8d97cda943dfb5e11bc9dfbb2f363f5b81)
|
||||||
|
- Merge pull request 'Load more stuff from env feature/16-env_vars' (#17) from feature/16-env_vars into dev [`bc4d16e`](https://git.odit.services/lfk/document-server/commit/bc4d16e6f8959ed35d7e87647de84584cdfddd7b)
|
||||||
|
- Added new env vars to config [`3bb322e`](https://git.odit.services/lfk/document-server/commit/3bb322ede5db15a147c0d7a8db2a68ccb7fa2112)
|
||||||
|
- Added new env vars to readme [`b77bb3a`](https://git.odit.services/lfk/document-server/commit/b77bb3ad9dba9d73c2c81215ba57936192155a9a)
|
||||||
|
- Now loading interpolation vars from config/env [`b4ebae2`](https://git.odit.services/lfk/document-server/commit/b4ebae283b472b2f0c6e28caed49b30edb119585)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`a306009`](https://git.odit.services/lfk/document-server/commit/a30600943d01116b99e946cb705a16d0372b5095)
|
||||||
|
|
||||||
|
#### [v0.1.2](https://git.odit.services/lfk/document-server/compare/v0.1.1...v0.1.2)
|
||||||
|
|
||||||
|
> 7 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.1.2 - Hotfix release' (#15) from dev into main [`123cf8a`](https://git.odit.services/lfk/document-server/commit/123cf8ad48a45fa10dcd5208215a6e525f31115a)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`22b1e00`](https://git.odit.services/lfk/document-server/commit/22b1e0097efc865de9cc150cb0d0b99bf789b519)
|
||||||
|
- 🚀Bumped version to v0.1.2 [`7e507d4`](https://git.odit.services/lfk/document-server/commit/7e507d4cc415877ac0b25503dc0ff9ecdceabf42)
|
||||||
|
- PAtch: Copy locales [`f7dfd6d`](https://git.odit.services/lfk/document-server/commit/f7dfd6d0c3c69881338bc1f66d5d33ae9abff628)
|
||||||
|
|
||||||
|
#### [v0.1.1](https://git.odit.services/lfk/document-server/compare/v0.1.0...v0.1.1)
|
||||||
|
|
||||||
|
> 7 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.1.1 - Hotfix release' (#12) from dev into main [`cbff307`](https://git.odit.services/lfk/document-server/commit/cbff3074d10110dbb64dda1ed516d2a18402eeca)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`4fca5af`](https://git.odit.services/lfk/document-server/commit/4fca5afdfa15d3260ac28c1feb89d50221b1f03f)
|
||||||
|
- Updated dockerfile & build for dockerized puppeteer [`ea8028d`](https://git.odit.services/lfk/document-server/commit/ea8028dfd54861335e9752334db335ad21e75cf2)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`8d4e7a1`](https://git.odit.services/lfk/document-server/commit/8d4e7a16d1ebae6976ec183b761ca3e6a8946629)
|
||||||
|
- Revert "Now only using our mirror to build" [`fe0f45e`](https://git.odit.services/lfk/document-server/commit/fe0f45ea92099a65d998e342ef885af39d06915f)
|
||||||
|
- Now only using our mirror to build [`b07c5a9`](https://git.odit.services/lfk/document-server/commit/b07c5a96f2a670f2279a6575b03f9c553b59e0a9)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`9755e43`](https://git.odit.services/lfk/document-server/commit/9755e437c2b68c09e9b0ffa47c6bc1729e6bee14)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`603a814`](https://git.odit.services/lfk/document-server/commit/603a814ad4783c0b29c1f6a1db638f269b29f775)
|
||||||
|
- Switched to using our mirrored images for buildi [`dba765c`](https://git.odit.services/lfk/document-server/commit/dba765cb017998ad636f3f91fb00a8a277d3b225)
|
||||||
|
- 🚀Bumped version to v0.1.1 [`d1b07f3`](https://git.odit.services/lfk/document-server/commit/d1b07f39fd7e3c282a631924bf45367e866e667a)
|
||||||
|
- Pinned alpine version [`6ab3946`](https://git.odit.services/lfk/document-server/commit/6ab3946c31a7716d1c42fb217b0a0f7be8172dba)
|
||||||
|
|
||||||
|
#### v0.1.0
|
||||||
|
|
||||||
|
> 7 February 2021
|
||||||
|
|
||||||
|
- Merge pull request 'Alpha Release 0.1.0 - Contract generation' (#11) from dev into main [`bc2b6fa`](https://git.odit.services/lfk/document-server/commit/bc2b6fadd912f275bc05be29c6fbd87367d617df)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`ee19efa`](https://git.odit.services/lfk/document-server/commit/ee19efa0e63f21a10fed1cf24beb16118bbe6cde)
|
||||||
|
- 🚀Bumped version to v0.0.2 [`de432c4`](https://git.odit.services/lfk/document-server/commit/de432c448129a8acb36fef6b40ef920eeb2f7887)
|
||||||
|
- First working (TM) template code [`a9e3360`](https://git.odit.services/lfk/document-server/commit/a9e3360ee258e4d48c8dbe3a55468409bb6ee0f7)
|
||||||
|
- Working Styleing [`c617c40`](https://git.odit.services/lfk/document-server/commit/c617c40e9d7e03382f647eafde9ff458db3c6c15)
|
||||||
|
- Removed base64 image [`e401d0e`](https://git.odit.services/lfk/document-server/commit/e401d0ec7219e88fbb277b2dcf456a22dae0d1e5)
|
||||||
|
- Updated the contract template to use external css [`6121b1e`](https://git.odit.services/lfk/document-server/commit/6121b1e3bfcf6fc9f88e0589205044c59859b4a7)
|
||||||
|
- Sorted locales [`1962499`](https://git.odit.services/lfk/document-server/commit/1962499d18685347302fd7d8491c6e3e7a355fcb)
|
||||||
|
- Switched to puppeteer for pdf generation [`5afd26e`](https://git.odit.services/lfk/document-server/commit/5afd26ea22cff3b8a339cf658ed37d2053db24ba)
|
||||||
|
- Added a coupple of real replacement strings to the sponsoring template [`041c0ed`](https://git.odit.services/lfk/document-server/commit/041c0ed6bbe5f8645e4e96b57c02d4e45b445402)
|
||||||
|
- Added automatic img to base64 conversion [`42443af`](https://git.odit.services/lfk/document-server/commit/42443af734ccc9ce202aec045a07775f4a054b92)
|
||||||
|
- Added i18n strings [`e345c36`](https://git.odit.services/lfk/document-server/commit/e345c36dd0b03f276259521aebf423853a81a04d)
|
||||||
|
- first working pdf generation from class 🎉 [`3af76a5`](https://git.odit.services/lfk/document-server/commit/3af76a53e3156bdc2d1d3ade6ff940db9d7b24b5)
|
||||||
|
- Added a bunch of english and german translations 🌎 [`784d7c6`](https://git.odit.services/lfk/document-server/commit/784d7c656fd2dfc726722459f3ccb7612021b882)
|
||||||
|
- Added translations using i18next [`75eb925`](https://git.odit.services/lfk/document-server/commit/75eb9252672883f7b6f89a812a37d2b96f9f626e)
|
||||||
|
- Switched to handlebars for templateing [`4acf3e3`](https://git.odit.services/lfk/document-server/commit/4acf3e39ce55c0ad9e697cf9598569ec1c1dcb44)
|
||||||
|
- Moved pdf creatior initialization to new function [`47a05fa`](https://git.odit.services/lfk/document-server/commit/47a05facb33c178e9bf3f99c25049abc010361c4)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`f3de80a`](https://git.odit.services/lfk/document-server/commit/f3de80af78c96bd697715a30dee7cae6806f9f9f)
|
||||||
|
- 🚀Bumped version to v0.1.0 [`6a42fe3`](https://git.odit.services/lfk/document-server/commit/6a42fe37d053a6a00005e3c5781edfcefe61183e)
|
||||||
|
- Merge pull request 'Sponsoring contract generation feature/5-sponsoring_contracts' (#10) from feature/5-sponsoring_contracts into dev [`84259d3`](https://git.odit.services/lfk/document-server/commit/84259d37d42234e1be75f3a5c95f4b442a9e5844)
|
||||||
|
- Added optimization args [`140fda1`](https://git.odit.services/lfk/document-server/commit/140fda11cc88cb93218116d4cbdbf13c014a659d)
|
||||||
|
- Added first parts of template [`13776d1`](https://git.odit.services/lfk/document-server/commit/13776d1ecb2db03f19dd0c01a930d4c98222cf6b)
|
||||||
|
- Added pdf merging for big requests (over 100 runners) [`785544c`](https://git.odit.services/lfk/document-server/commit/785544ca16cd4907a378eb2d48e4269778e3dccc)
|
||||||
|
- Fixed file broken in merge [`c07c6ae`](https://git.odit.services/lfk/document-server/commit/c07c6aeeab70589a4e1ddf025a07bde96c68ef6e)
|
||||||
|
- Now with workin i18n-ally config🥳 [`7c3813b`](https://git.odit.services/lfk/document-server/commit/7c3813b94d06ca38b83db90b7f9fba6c33716a05)
|
||||||
|
- Now with workin i18n-ally config🥳 [`b4232e5`](https://git.odit.services/lfk/document-server/commit/b4232e51e084f491d1a7fb4f929327e88f3b4c00)
|
||||||
|
- Now accepting arrays for sponsoring contract generation [`f833ae2`](https://git.odit.services/lfk/document-server/commit/f833ae222e68b7df9b8f8a8ec7ce17d679a9710f)
|
||||||
|
- Added full interpolation support to the i18n [`f755f4f`](https://git.odit.services/lfk/document-server/commit/f755f4f9fb1463af6bec3cf73b7fabf95ef3fb2e)
|
||||||
|
- Added option to generate empty sponsoring contracts [`1ced0e3`](https://git.odit.services/lfk/document-server/commit/1ced0e317544217599a42c6b270c9136dc73676d)
|
||||||
|
- Added translation sorting secript [`1e67672`](https://git.odit.services/lfk/document-server/commit/1e67672ef0d28f94a50b0377cca8e8ff2a87e983)
|
||||||
|
- Removed the example data from the fill-in fields [`5e12525`](https://git.odit.services/lfk/document-server/commit/5e1252545b7eafeee6c3a1d67567d00e5d615d85)
|
||||||
|
- Edited html template [`d58453f`](https://git.odit.services/lfk/document-server/commit/d58453faf9840037c583e029c41ef1b31a0bafa8)
|
||||||
|
- PDF Creator now accepts single instances of class [`78205ee`](https://git.odit.services/lfk/document-server/commit/78205ee8c7659ae0dc2e4a184554b042251d9271)
|
||||||
|
- PDF Creator now accepts single instances of class [`ba7cedd`](https://git.odit.services/lfk/document-server/commit/ba7cedd187dbc51a53ba169889d8e0ca22a97b5d)
|
||||||
|
- Updated template for i18n [`a596188`](https://git.odit.services/lfk/document-server/commit/a596188c00444c285565eecbb1f0bc668bb4706c)
|
||||||
|
- Parellized the chunks [`e92820e`](https://git.odit.services/lfk/document-server/commit/e92820e12f289b4fd28b4ebc985b5b711777fc35)
|
||||||
|
- Fixed the controller not waiting for initialization [`ee8ba99`](https://git.odit.services/lfk/document-server/commit/ee8ba99cc7778f89a8bb99400c7d1cf1a12898f7)
|
||||||
|
- Implemented language selection by query param [`6f81566`](https://git.odit.services/lfk/document-server/commit/6f81566cb82a0801a20523a7177996ea40cb3968)
|
||||||
|
- Added comments [`cd51e78`](https://git.odit.services/lfk/document-server/commit/cd51e78282278cae6cb86bd0c9616746612a97e3)
|
||||||
|
- Added example locales [`1969769`](https://git.odit.services/lfk/document-server/commit/19697692bcb6c0c1c978918916caccd95a8f2035)
|
||||||
|
- Fixed data validation problem [`bd6ec62`](https://git.odit.services/lfk/document-server/commit/bd6ec6215d362325c510611e4545b7643b918200)
|
||||||
|
- Removed fullname from groups (to be renabled later) [`388d8a2`](https://git.odit.services/lfk/document-server/commit/388d8a2dc6ee06d39e621e1e45ae595dae587483)
|
||||||
|
- Updated comments [`119102a`](https://git.odit.services/lfk/document-server/commit/119102aef8f43a68f537e7542c2f2cd3b41cd28e)
|
||||||
|
- Updated readme for handlebars [`05e4718`](https://git.odit.services/lfk/document-server/commit/05e471878f2321a1873b21730ae85ad6b8af5766)
|
||||||
|
- Updated readme [`f69e777`](https://git.odit.services/lfk/document-server/commit/f69e7779e42f18df7ec3ccb1cdf9dcf7fa845ee6)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`f4a34dd`](https://git.odit.services/lfk/document-server/commit/f4a34dd36b57bd122a650f2de4ea8e00816276ed)
|
||||||
|
- Typos [`95b882a`](https://git.odit.services/lfk/document-server/commit/95b882aceded275ad89446ad92a10cf36b166ab7)
|
||||||
|
- Added sentence about large requests to the /contracts openapi description [`4773a5f`](https://git.odit.services/lfk/document-server/commit/4773a5f18c866b6e9d50b421d7917416860cb6b5)
|
||||||
|
- Removed puppeteer args [`06dedc0`](https://git.odit.services/lfk/document-server/commit/06dedc0797b649f3fa8934f0d774ccae2b062849)
|
||||||
|
- Expanded max request body size to 500mb [`4f191dc`](https://git.odit.services/lfk/document-server/commit/4f191dcb52cd727e34770ab4304937cd1e7e480d)
|
||||||
|
- Now awaiting language change [`c07319b`](https://git.odit.services/lfk/document-server/commit/c07319b250db9452f6122e797b6059151031e2a9)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`42d6c40`](https://git.odit.services/lfk/document-server/commit/42d6c40d0c673f39c27e3d5a6484f01a4da77266)
|
||||||
|
- Formatting [`2d0b7ce`](https://git.odit.services/lfk/document-server/commit/2d0b7ce79ed47d4827096a2bbccfe3bbcd061810)
|
||||||
|
- Removed useless await [`4cd437b`](https://git.odit.services/lfk/document-server/commit/4cd437b6afe40e4c09027c0e2004a1130bc51870)
|
||||||
|
- Updated comments [`cf9cd29`](https://git.odit.services/lfk/document-server/commit/cf9cd298b638012e079be0a04d1b48efea20026f)
|
||||||
|
- Merge pull request 'Patch 0.0.2' (#9) from dev into main [`4585a83`](https://git.odit.services/lfk/document-server/commit/4585a83838b80552160c9d9e5be0af891eae39c8)
|
||||||
|
- Merge pull request 'Basic documentation feature/6-documentation' (#8) from feature/6-documentation into dev [`73915da`](https://git.odit.services/lfk/document-server/commit/73915da20321940e22145b4c5d830b9f700be566)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`465efe0`](https://git.odit.services/lfk/document-server/commit/465efe03000ecc00d14479ac38710ffdba2cafb5)
|
||||||
|
- Typos [`68e34a9`](https://git.odit.services/lfk/document-server/commit/68e34a9054a195545b0bd10ce888f7274854fae6)
|
||||||
|
- Merge pull request 'Implemented the basics for templateing feature/3-pdf_templateing' (#4) from feature/3-pdf_templateing into dev [`15f1641`](https://git.odit.services/lfk/document-server/commit/15f16415c0ac5012df8126c8df6bd4da93ad0a20)
|
||||||
|
- Merge pull request 'Implemented the basic request classes feature/1-input_classes' (#2) from feature/1-input_classes into dev [`b5e79e5`](https://git.odit.services/lfk/document-server/commit/b5e79e51ef5d751a67e7a1763809ece91a7627f2)
|
||||||
|
- Added openapi viewers [`6435c8a`](https://git.odit.services/lfk/document-server/commit/6435c8a88e2ea3f4417ad5d8be9a07b9c043b41b)
|
||||||
|
- 📖New license file version [CI SKIP] [skip ci] [`d493e74`](https://git.odit.services/lfk/document-server/commit/d493e74bf39bc85de842ac7cd3e3d37ba8797a04)
|
||||||
|
- Initial commit [`0908bcd`](https://git.odit.services/lfk/document-server/commit/0908bcd63529b44463bc57ad7d6b8785564e4ddc)
|
||||||
|
- Added address class and errors [`d291cf0`](https://git.odit.services/lfk/document-server/commit/d291cf0d1bf375e96fda822543d5ceb29dc67010)
|
||||||
|
- Added drone file [`48d7cad`](https://git.odit.services/lfk/document-server/commit/48d7cad9f37485656cfb1c70abef158b5dd8d847)
|
||||||
|
- Added the donation classes [`1d73e4e`](https://git.odit.services/lfk/document-server/commit/1d73e4ed9ccb3dfb7709cb89957ed5bbcefad870)
|
||||||
|
- Added openapi related classes [`9d62225`](https://git.odit.services/lfk/document-server/commit/9d6222547811fd3c94b91496d9917b7df5115fc6)
|
||||||
|
- Added a bs example template [`f726a6e`](https://git.odit.services/lfk/document-server/commit/f726a6e699575b839d332c15e61c9008fe996fa9)
|
||||||
|
- Added a basic donor class [`cfa65e8`](https://git.odit.services/lfk/document-server/commit/cfa65e83cafcefbd6261a99ab7a4eaf099665a81)
|
||||||
|
- Added input class for contract generation [`63f9523`](https://git.odit.services/lfk/document-server/commit/63f952376698c3561754bfb206a64c58c1ae86f1)
|
||||||
|
- Initialized package [`b0427a6`](https://git.odit.services/lfk/document-server/commit/b0427a6d810656096c467881a302eef244f86d29)
|
||||||
|
- Added a simplified runnergroup class [`e29c17a`](https://git.odit.services/lfk/document-server/commit/e29c17a29a6ee84944f8d67d7b6f3c4292763c10)
|
||||||
|
- Resolved fun issues with promises [`4617f2c`](https://git.odit.services/lfk/document-server/commit/4617f2c5bdcb29534b46865ebe21d15e2b1cd72f)
|
||||||
|
- Added a runnercard class [`cb7325b`](https://git.odit.services/lfk/document-server/commit/cb7325bbf906b405955bd81e199abae5edc27d91)
|
||||||
|
- Added a basic readme [`df94b1b`](https://git.odit.services/lfk/document-server/commit/df94b1b750922989d870546150ff8d9ff8af4102)
|
||||||
|
- Added base app [`915ff92`](https://git.odit.services/lfk/document-server/commit/915ff92418a2859c11e0ce58b79220fb5ea06c7f)
|
||||||
|
- Added vscode workspace config [`ae466b4`](https://git.odit.services/lfk/document-server/commit/ae466b4d7e5b67c5cd1bc440214f477d15f768a2)
|
||||||
|
- Created a pdf class that takes care of the pdf wrapping [`7d5b575`](https://git.odit.services/lfk/document-server/commit/7d5b5750ad78fd979cb1b647d8b318a84513532a)
|
||||||
|
- Added editor and stageing infos to the README [`56b7227`](https://git.odit.services/lfk/document-server/commit/56b72275aca57b227c775c4a61e91fd03471f987)
|
||||||
|
- Added dockerfile and docker-compose [`b9d4cc3`](https://git.odit.services/lfk/document-server/commit/b9d4cc36199b8f0090d555e961a3454bf35f4bd6)
|
||||||
|
- Added loaders [`57afbd4`](https://git.odit.services/lfk/document-server/commit/57afbd4b6c48cf641b69a2fcbb28783ff84e1cfd)
|
||||||
|
- Added a certificaterunner class [`d08bdfd`](https://git.odit.services/lfk/document-server/commit/d08bdfd961f4128981b969cf149df7397a257193)
|
||||||
|
- Added a template section to the readme [`8141269`](https://git.odit.services/lfk/document-server/commit/8141269dd99f03b33019e5a8f4a010954c4fc44a)
|
||||||
|
- Created a barebones pdf controller [`64bd1ff`](https://git.odit.services/lfk/document-server/commit/64bd1ffc3ad8459c13154e2cd9a568f27baa2bf2)
|
||||||
|
- Moved distance to the main runner object [`1d1fa50`](https://git.odit.services/lfk/document-server/commit/1d1fa50327927328ce77af33c1abbf994df9ac8b)
|
||||||
|
- Added tsconfig [`e1f0378`](https://git.odit.services/lfk/document-server/commit/e1f03788dbdddcb1cb138556c1fed4da9ca104a8)
|
||||||
|
- Added basic dependencies [`43bb728`](https://git.odit.services/lfk/document-server/commit/43bb728d0d8b75239f1db765071d28a839300102)
|
||||||
|
- Added typeing to the buffer and stream conversion [`3fb8be2`](https://git.odit.services/lfk/document-server/commit/3fb8be22b74204accabed8a8c8fb5161c5ad7504)
|
||||||
|
- Added basic dependencies [`d450cea`](https://git.odit.services/lfk/document-server/commit/d450ceac74959bdfb694f9b12fb1fd14ff85b598)
|
||||||
|
- Added release-it config [`185e66f`](https://git.odit.services/lfk/document-server/commit/185e66fb5b2e4330233ff2e74101c4447c317b5a)
|
||||||
|
- Added config class [`278c563`](https://git.odit.services/lfk/document-server/commit/278c56386b0e9079a71d3339b40d08f046255a3e)
|
||||||
|
- Added Barebones pdf creator class [`557cc26`](https://git.odit.services/lfk/document-server/commit/557cc26f281da0b47621dff667435a788c42c103)
|
||||||
|
- Added a simple status controller [`1d62e7f`](https://git.odit.services/lfk/document-server/commit/1d62e7f14c8d6219607ed6ecf774ae152e362cc1)
|
||||||
|
- Added errorhandler middleware [`6539fd7`](https://git.odit.services/lfk/document-server/commit/6539fd785568971330639fb7055827417424c81a)
|
||||||
|
- Runners now use the runnergroup class instead of strings [`aae4f50`](https://git.odit.services/lfk/document-server/commit/aae4f507eafbfd51cd9972cf0fac4c5afafbb45a)
|
||||||
|
- Added files to gitignore [`66134c0`](https://git.odit.services/lfk/document-server/commit/66134c0e1e5dce2ebd9eae3f88a6ad893bad0283)
|
||||||
|
- Switched to the splitted functions [`3ca38ab`](https://git.odit.services/lfk/document-server/commit/3ca38abe9359e436fe0f80400ad0308ad9d64a4f)
|
||||||
|
- Cleaned up openapi stuff [`4efb629`](https://git.odit.services/lfk/document-server/commit/4efb62921bced79c817499b48bbc55b05e6371e5)
|
||||||
|
- Updated apidoc viewer settings [`36396af`](https://git.odit.services/lfk/document-server/commit/36396af50a1f7d1842effbd24e08a8d34946a375)
|
||||||
|
- Updated apidoc viewer settings [`4d45e0f`](https://git.odit.services/lfk/document-server/commit/4d45e0f80d5721c91de0b25334d040448d92e01d)
|
||||||
|
- 🧾New changelog file version [CI SKIP] [skip ci] [`8f250f7`](https://git.odit.services/lfk/document-server/commit/8f250f747a95feb246b1698a7c9be9ee19a1be12)
|
||||||
|
- Added missing dependencies [`c2d7141`](https://git.odit.services/lfk/document-server/commit/c2d714116e02bb4c2ff6501ba32417cd998e2f3e)
|
||||||
|
- Added license export and release scripts [`0c4e5a1`](https://git.odit.services/lfk/document-server/commit/0c4e5a182c91b99a657c83f2c24f4cfaae1ef48d)
|
||||||
|
- Added build script [`cbc421c`](https://git.odit.services/lfk/document-server/commit/cbc421cd838b6c874fbe50556350edeb08a7b882)
|
||||||
|
- Added dev script [`814b564`](https://git.odit.services/lfk/document-server/commit/814b564752aa95ed2c034a9a98c800b43452bf88)
|
||||||
|
- Adjusted template font styleing [`2c7b025`](https://git.odit.services/lfk/document-server/commit/2c7b0254ec7e49c31f8f33eed334ab4156052fb6)
|
||||||
|
- Added html-pdf package [`a7d4001`](https://git.odit.services/lfk/document-server/commit/a7d4001ad992d60e2af69e9bbed53366bc0a46d3)
|
||||||
|
- Added PDFs to gitignore [`9f3758d`](https://git.odit.services/lfk/document-server/commit/9f3758de39ef1d5b591a24868eb683caa742f694)
|
||||||
|
- Added version to config [`b1747f6`](https://git.odit.services/lfk/document-server/commit/b1747f6374c029e1e9c3a87584ea54b9d3714d92)
|
||||||
|
- fixed license-exporter call [`83c4bd6`](https://git.odit.services/lfk/document-server/commit/83c4bd62cbbb13ae33a790baa45cc15a77d99e41)
|
||||||
|
- Added version to config [`cff7011`](https://git.odit.services/lfk/document-server/commit/cff70110fde72c7fede0625872acdc0666703fa1)
|
||||||
|
- Added openapi dependency [`94e5e51`](https://git.odit.services/lfk/document-server/commit/94e5e51f8d421ea7fd64ded2281b89ff4a252b29)
|
||||||
|
- Added templates folder [`8a30265`](https://git.odit.services/lfk/document-server/commit/8a30265fc600dad17f584f95dd51db976945d4c5)
|
47
Dockerfile
Normal file
47
Dockerfile
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Typescript Build
|
||||||
|
FROM registry.odit.services/hub/library/node:19.0.1-alpine3.16 AS build
|
||||||
|
ARG NPM_REGISTRY_URL=https://registry.npmjs.org
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY package.json ./
|
||||||
|
RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@8
|
||||||
|
RUN mkdir /pnpm && pnpm config set store-dir /pnpm && pnpm i
|
||||||
|
|
||||||
|
COPY tsconfig.json ./
|
||||||
|
COPY src ./src
|
||||||
|
RUN pnpm build \
|
||||||
|
&& rm -rf /app/node_modules \
|
||||||
|
&& pnpm i --production --frozen-lockfile
|
||||||
|
|
||||||
|
# final image
|
||||||
|
FROM registry.odit.services/hub/library/alpine:3.16
|
||||||
|
WORKDIR /app
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
chromium \
|
||||||
|
nss \
|
||||||
|
freetype \
|
||||||
|
freetype-dev \
|
||||||
|
harfbuzz \
|
||||||
|
ca-certificates \
|
||||||
|
ttf-freefont \
|
||||||
|
nodejs \
|
||||||
|
font-noto-emoji \
|
||||||
|
&& apk add wqy-zenhei --update-cache --repository https://nl.alpinelinux.org/alpine/edge/testing
|
||||||
|
|
||||||
|
# Tell Puppeteer to skip installing Chrome. We'll be using the installed package.
|
||||||
|
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
|
||||||
|
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
|
||||||
|
|
||||||
|
RUN addgroup -S pptruser && adduser -S -g pptruser pptruser \
|
||||||
|
&& mkdir -p /home/pptruser/Downloads /app \
|
||||||
|
&& chown -R pptruser:pptruser /home/pptruser \
|
||||||
|
&& chown -R pptruser:pptruser /app
|
||||||
|
|
||||||
|
# Run everything after as non-privileged user.
|
||||||
|
USER pptruser
|
||||||
|
|
||||||
|
COPY --from=build /app/package.json /app/
|
||||||
|
COPY --from=build /app/node_modules /app/node_modules
|
||||||
|
COPY --from=build /app/dist app
|
||||||
|
COPY ./src/static app/static
|
||||||
|
ENTRYPOINT ["node", "app/app.js"]
|
362
LICENSE
Normal file
362
LICENSE
Normal file
@ -0,0 +1,362 @@
|
|||||||
|
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Creative
|
||||||
|
Commons Corporation ("Creative Commons") is not a law firm and does not provide
|
||||||
|
legal services or legal advice. Distribution of Creative Commons public licenses
|
||||||
|
does not create a lawyer-client or other relationship. Creative Commons makes
|
||||||
|
its licenses and related information available on an "as-is" basis. Creative
|
||||||
|
Commons gives no warranties regarding its licenses, any material licensed
|
||||||
|
under their terms and conditions, or any related information. Creative Commons
|
||||||
|
disclaims all liability for damages resulting from their use to the fullest
|
||||||
|
extent possible.
|
||||||
|
|
||||||
|
Using Creative Commons Public Licenses
|
||||||
|
|
||||||
|
Creative Commons public licenses provide a standard set of terms and conditions
|
||||||
|
that creators and other rights holders may use to share original works of
|
||||||
|
authorship and other material subject to copyright and certain other rights
|
||||||
|
specified in the public license below. The following considerations are for
|
||||||
|
informational purposes only, are not exhaustive, and do not form part of our
|
||||||
|
licenses.
|
||||||
|
|
||||||
|
Considerations for licensors: Our public licenses are intended for use by
|
||||||
|
those authorized to give the public permission to use material in ways otherwise
|
||||||
|
restricted by copyright and certain other rights. Our licenses are irrevocable.
|
||||||
|
Licensors should read and understand the terms and conditions of the license
|
||||||
|
they choose before applying it. Licensors should also secure all rights necessary
|
||||||
|
before applying our licenses so that the public can reuse the material as
|
||||||
|
expected. Licensors should clearly mark any material not subject to the license.
|
||||||
|
This includes other CC-licensed material, or material used under an exception
|
||||||
|
or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors
|
||||||
|
|
||||||
|
Considerations for the public: By using one of our public licenses, a licensor
|
||||||
|
grants the public permission to use the licensed material under specified
|
||||||
|
terms and conditions. If the licensor's permission is not necessary for any
|
||||||
|
reason–for example, because of any applicable exception or limitation to copyright–then
|
||||||
|
that use is not regulated by the license. Our licenses grant only permissions
|
||||||
|
under copyright and certain other rights that a licensor has authority to
|
||||||
|
grant. Use of the licensed material may still be restricted for other reasons,
|
||||||
|
including because others have copyright or other rights in the material. A
|
||||||
|
licensor may make special requests, such as asking that all changes be marked
|
||||||
|
or described. Although not required by our licenses, you are encouraged to
|
||||||
|
respect those requests where reasonable. More considerations for the public
|
||||||
|
: wiki.creativecommons.org/Considerations_for_licensees
|
||||||
|
|
||||||
|
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public
|
||||||
|
License
|
||||||
|
|
||||||
|
By exercising the Licensed Rights (defined below), You accept and agree to
|
||||||
|
be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike
|
||||||
|
4.0 International Public License ("Public License"). To the extent this Public
|
||||||
|
License may be interpreted as a contract, You are granted the Licensed Rights
|
||||||
|
in consideration of Your acceptance of these terms and conditions, and the
|
||||||
|
Licensor grants You such rights in consideration of benefits the Licensor
|
||||||
|
receives from making the Licensed Material available under these terms and
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
Section 1 – Definitions.
|
||||||
|
|
||||||
|
a. Adapted Material means material subject to Copyright and Similar Rights
|
||||||
|
that is derived from or based upon the Licensed Material and in which the
|
||||||
|
Licensed Material is translated, altered, arranged, transformed, or otherwise
|
||||||
|
modified in a manner requiring permission under the Copyright and Similar
|
||||||
|
Rights held by the Licensor. For purposes of this Public License, where the
|
||||||
|
Licensed Material is a musical work, performance, or sound recording, Adapted
|
||||||
|
Material is always produced where the Licensed Material is synched in timed
|
||||||
|
relation with a moving image.
|
||||||
|
|
||||||
|
b. Adapter's License means the license You apply to Your Copyright and Similar
|
||||||
|
Rights in Your contributions to Adapted Material in accordance with the terms
|
||||||
|
and conditions of this Public License.
|
||||||
|
|
||||||
|
c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses,
|
||||||
|
approved by Creative Commons as essentially the equivalent of this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
d. Copyright and Similar Rights means copyright and/or similar rights closely
|
||||||
|
related to copyright including, without limitation, performance, broadcast,
|
||||||
|
sound recording, and Sui Generis Database Rights, without regard to how the
|
||||||
|
rights are labeled or categorized. For purposes of this Public License, the
|
||||||
|
rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
||||||
|
|
||||||
|
e. Effective Technological Measures means those measures that, in the absence
|
||||||
|
of proper authority, may not be circumvented under laws fulfilling obligations
|
||||||
|
under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996,
|
||||||
|
and/or similar international agreements.
|
||||||
|
|
||||||
|
f. Exceptions and Limitations means fair use, fair dealing, and/or any other
|
||||||
|
exception or limitation to Copyright and Similar Rights that applies to Your
|
||||||
|
use of the Licensed Material.
|
||||||
|
|
||||||
|
g. License Elements means the license attributes listed in the name of a Creative
|
||||||
|
Commons Public License. The License Elements of this Public License are Attribution,
|
||||||
|
NonCommercial, and ShareAlike.
|
||||||
|
|
||||||
|
h. Licensed Material means the artistic or literary work, database, or other
|
||||||
|
material to which the Licensor applied this Public License.
|
||||||
|
|
||||||
|
i. Licensed Rights means the rights granted to You subject to the terms and
|
||||||
|
conditions of this Public License, which are limited to all Copyright and
|
||||||
|
Similar Rights that apply to Your use of the Licensed Material and that the
|
||||||
|
Licensor has authority to license.
|
||||||
|
|
||||||
|
j. Licensor means the individual(s) or entity(ies) granting rights under this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
k. NonCommercial means not primarily intended for or directed towards commercial
|
||||||
|
advantage or monetary compensation. For purposes of this Public License, the
|
||||||
|
exchange of the Licensed Material for other material subject to Copyright
|
||||||
|
and Similar Rights by digital file-sharing or similar means is NonCommercial
|
||||||
|
provided there is no payment of monetary compensation in connection with the
|
||||||
|
exchange.
|
||||||
|
|
||||||
|
l. Share means to provide material to the public by any means or process that
|
||||||
|
requires permission under the Licensed Rights, such as reproduction, public
|
||||||
|
display, public performance, distribution, dissemination, communication, or
|
||||||
|
importation, and to make material available to the public including in ways
|
||||||
|
that members of the public may access the material from a place and at a time
|
||||||
|
individually chosen by them.
|
||||||
|
|
||||||
|
m. Sui Generis Database Rights means rights other than copyright resulting
|
||||||
|
from Directive 96/9/EC of the European Parliament and of the Council of 11
|
||||||
|
March 1996 on the legal protection of databases, as amended and/or succeeded,
|
||||||
|
as well as other essentially equivalent rights anywhere in the world.
|
||||||
|
|
||||||
|
n. You means the individual or entity exercising the Licensed Rights under
|
||||||
|
this Public License. Your has a corresponding meaning.
|
||||||
|
|
||||||
|
Section 2 – Scope.
|
||||||
|
|
||||||
|
a. License grant.
|
||||||
|
|
||||||
|
1. Subject to the terms and conditions of this Public License, the Licensor
|
||||||
|
hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive,
|
||||||
|
irrevocable license to exercise the Licensed Rights in the Licensed Material
|
||||||
|
to:
|
||||||
|
|
||||||
|
A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial
|
||||||
|
purposes only; and
|
||||||
|
|
||||||
|
B. produce, reproduce, and Share Adapted Material for NonCommercial purposes
|
||||||
|
only.
|
||||||
|
|
||||||
|
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions
|
||||||
|
and Limitations apply to Your use, this Public License does not apply, and
|
||||||
|
You do not need to comply with its terms and conditions.
|
||||||
|
|
||||||
|
3. Term. The term of this Public License is specified in Section 6(a).
|
||||||
|
|
||||||
|
4. Media and formats; technical modifications allowed. The Licensor authorizes
|
||||||
|
You to exercise the Licensed Rights in all media and formats whether now known
|
||||||
|
or hereafter created, and to make technical modifications necessary to do
|
||||||
|
so. The Licensor waives and/or agrees not to assert any right or authority
|
||||||
|
to forbid You from making technical modifications necessary to exercise the
|
||||||
|
Licensed Rights, including technical modifications necessary to circumvent
|
||||||
|
Effective Technological Measures. For purposes of this Public License, simply
|
||||||
|
making modifications authorized by this Section 2(a)(4) never produces Adapted
|
||||||
|
Material.
|
||||||
|
|
||||||
|
5. Downstream recipients.
|
||||||
|
|
||||||
|
A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed
|
||||||
|
Material automatically receives an offer from the Licensor to exercise the
|
||||||
|
Licensed Rights under the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
B. Additional offer from the Licensor – Adapted Material. Every recipient
|
||||||
|
of Adapted Material from You automatically receives an offer from the Licensor
|
||||||
|
to exercise the Licensed Rights in the Adapted Material under the conditions
|
||||||
|
of the Adapter's License You apply.
|
||||||
|
|
||||||
|
C. No downstream restrictions. You may not offer or impose any additional
|
||||||
|
or different terms or conditions on, or apply any Effective Technological
|
||||||
|
Measures to, the Licensed Material if doing so restricts exercise of the Licensed
|
||||||
|
Rights by any recipient of the Licensed Material.
|
||||||
|
|
||||||
|
6. No endorsement. Nothing in this Public License constitutes or may be construed
|
||||||
|
as permission to assert or imply that You are, or that Your use of the Licensed
|
||||||
|
Material is, connected with, or sponsored, endorsed, or granted official status
|
||||||
|
by, the Licensor or others designated to receive attribution as provided in
|
||||||
|
Section 3(a)(1)(A)(i).
|
||||||
|
|
||||||
|
b. Other rights.
|
||||||
|
|
||||||
|
1. Moral rights, such as the right of integrity, are not licensed under this
|
||||||
|
Public License, nor are publicity, privacy, and/or other similar personality
|
||||||
|
rights; however, to the extent possible, the Licensor waives and/or agrees
|
||||||
|
not to assert any such rights held by the Licensor to the limited extent necessary
|
||||||
|
to allow You to exercise the Licensed Rights, but not otherwise.
|
||||||
|
|
||||||
|
2. Patent and trademark rights are not licensed under this Public License.
|
||||||
|
|
||||||
|
3. To the extent possible, the Licensor waives any right to collect royalties
|
||||||
|
from You for the exercise of the Licensed Rights, whether directly or through
|
||||||
|
a collecting society under any voluntary or waivable statutory or compulsory
|
||||||
|
licensing scheme. In all other cases the Licensor expressly reserves any right
|
||||||
|
to collect such royalties, including when the Licensed Material is used other
|
||||||
|
than for NonCommercial purposes.
|
||||||
|
|
||||||
|
Section 3 – License Conditions.
|
||||||
|
|
||||||
|
Your exercise of the Licensed Rights is expressly made subject to the following
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
a. Attribution.
|
||||||
|
|
||||||
|
1. If You Share the Licensed Material (including in modified form), You must:
|
||||||
|
|
||||||
|
A. retain the following if it is supplied by the Licensor with the Licensed
|
||||||
|
Material:
|
||||||
|
|
||||||
|
i. identification of the creator(s) of the Licensed Material and any others
|
||||||
|
designated to receive attribution, in any reasonable manner requested by the
|
||||||
|
Licensor (including by pseudonym if designated);
|
||||||
|
|
||||||
|
ii. a copyright notice;
|
||||||
|
|
||||||
|
iii. a notice that refers to this Public License;
|
||||||
|
|
||||||
|
iv. a notice that refers to the disclaimer of warranties;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
||||||
|
|
||||||
|
B. indicate if You modified the Licensed Material and retain an indication
|
||||||
|
of any previous modifications; and
|
||||||
|
|
||||||
|
C. indicate the Licensed Material is licensed under this Public License, and
|
||||||
|
include the text of, or the URI or hyperlink to, this Public License.
|
||||||
|
|
||||||
|
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner
|
||||||
|
based on the medium, means, and context in which You Share the Licensed Material.
|
||||||
|
For example, it may be reasonable to satisfy the conditions by providing a
|
||||||
|
URI or hyperlink to a resource that includes the required information.
|
||||||
|
|
||||||
|
3. If requested by the Licensor, You must remove any of the information required
|
||||||
|
by Section 3(a)(1)(A) to the extent reasonably practicable.
|
||||||
|
|
||||||
|
b. ShareAlike.In addition to the conditions in Section 3(a), if You Share
|
||||||
|
Adapted Material You produce, the following conditions also apply.
|
||||||
|
|
||||||
|
1. The Adapter's License You apply must be a Creative Commons license with
|
||||||
|
the same License Elements, this version or later, or a BY-NC-SA Compatible
|
||||||
|
License.
|
||||||
|
|
||||||
|
2. You must include the text of, or the URI or hyperlink to, the Adapter's
|
||||||
|
License You apply. You may satisfy this condition in any reasonable manner
|
||||||
|
based on the medium, means, and context in which You Share Adapted Material.
|
||||||
|
|
||||||
|
3. You may not offer or impose any additional or different terms or conditions
|
||||||
|
on, or apply any Effective Technological Measures to, Adapted Material that
|
||||||
|
restrict exercise of the rights granted under the Adapter's License You apply.
|
||||||
|
|
||||||
|
Section 4 – Sui Generis Database Rights.
|
||||||
|
|
||||||
|
Where the Licensed Rights include Sui Generis Database Rights that apply to
|
||||||
|
Your use of the Licensed Material:
|
||||||
|
|
||||||
|
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract,
|
||||||
|
reuse, reproduce, and Share all or a substantial portion of the contents of
|
||||||
|
the database for NonCommercial purposes only;
|
||||||
|
|
||||||
|
b. if You include all or a substantial portion of the database contents in
|
||||||
|
a database in which You have Sui Generis Database Rights, then the database
|
||||||
|
in which You have Sui Generis Database Rights (but not its individual contents)
|
||||||
|
is Adapted Material, including for purposes of Section 3(b); and
|
||||||
|
|
||||||
|
c. You must comply with the conditions in Section 3(a) if You Share all or
|
||||||
|
a substantial portion of the contents of the database.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 4 supplements and does not replace
|
||||||
|
Your obligations under this Public License where the Licensed Rights include
|
||||||
|
other Copyright and Similar Rights.
|
||||||
|
|
||||||
|
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||||
|
|
||||||
|
a. Unless otherwise separately undertaken by the Licensor, to the extent possible,
|
||||||
|
the Licensor offers the Licensed Material as-is and as-available, and makes
|
||||||
|
no representations or warranties of any kind concerning the Licensed Material,
|
||||||
|
whether express, implied, statutory, or other. This includes, without limitation,
|
||||||
|
warranties of title, merchantability, fitness for a particular purpose, non-infringement,
|
||||||
|
absence of latent or other defects, accuracy, or the presence or absence of
|
||||||
|
errors, whether or not known or discoverable. Where disclaimers of warranties
|
||||||
|
are not allowed in full or in part, this disclaimer may not apply to You.
|
||||||
|
|
||||||
|
b. To the extent possible, in no event will the Licensor be liable to You
|
||||||
|
on any legal theory (including, without limitation, negligence) or otherwise
|
||||||
|
for any direct, special, indirect, incidental, consequential, punitive, exemplary,
|
||||||
|
or other losses, costs, expenses, or damages arising out of this Public License
|
||||||
|
or use of the Licensed Material, even if the Licensor has been advised of
|
||||||
|
the possibility of such losses, costs, expenses, or damages. Where a limitation
|
||||||
|
of liability is not allowed in full or in part, this limitation may not apply
|
||||||
|
to You.
|
||||||
|
|
||||||
|
c. The disclaimer of warranties and limitation of liability provided above
|
||||||
|
shall be interpreted in a manner that, to the extent possible, most closely
|
||||||
|
approximates an absolute disclaimer and waiver of all liability.
|
||||||
|
|
||||||
|
Section 6 – Term and Termination.
|
||||||
|
|
||||||
|
a. This Public License applies for the term of the Copyright and Similar Rights
|
||||||
|
licensed here. However, if You fail to comply with this Public License, then
|
||||||
|
Your rights under this Public License terminate automatically.
|
||||||
|
|
||||||
|
b. Where Your right to use the Licensed Material has terminated under Section
|
||||||
|
6(a), it reinstates:
|
||||||
|
|
||||||
|
1. automatically as of the date the violation is cured, provided it is cured
|
||||||
|
within 30 days of Your discovery of the violation; or
|
||||||
|
|
||||||
|
2. upon express reinstatement by the Licensor.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 6(b) does not affect any right the
|
||||||
|
Licensor may have to seek remedies for Your violations of this Public License.
|
||||||
|
|
||||||
|
c. For the avoidance of doubt, the Licensor may also offer the Licensed Material
|
||||||
|
under separate terms or conditions or stop distributing the Licensed Material
|
||||||
|
at any time; however, doing so will not terminate this Public License.
|
||||||
|
|
||||||
|
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
||||||
|
|
||||||
|
Section 7 – Other Terms and Conditions.
|
||||||
|
|
||||||
|
a. The Licensor shall not be bound by any additional or different terms or
|
||||||
|
conditions communicated by You unless expressly agreed.
|
||||||
|
|
||||||
|
b. Any arrangements, understandings, or agreements regarding the Licensed
|
||||||
|
Material not stated herein are separate from and independent of the terms
|
||||||
|
and conditions of this Public License.
|
||||||
|
|
||||||
|
Section 8 – Interpretation.
|
||||||
|
|
||||||
|
a. For the avoidance of doubt, this Public License does not, and shall not
|
||||||
|
be interpreted to, reduce, limit, restrict, or impose conditions on any use
|
||||||
|
of the Licensed Material that could lawfully be made without permission under
|
||||||
|
this Public License.
|
||||||
|
|
||||||
|
b. To the extent possible, if any provision of this Public License is deemed
|
||||||
|
unenforceable, it shall be automatically reformed to the minimum extent necessary
|
||||||
|
to make it enforceable. If the provision cannot be reformed, it shall be severed
|
||||||
|
from this Public License without affecting the enforceability of the remaining
|
||||||
|
terms and conditions.
|
||||||
|
|
||||||
|
c. No term or condition of this Public License will be waived and no failure
|
||||||
|
to comply consented to unless expressly agreed to by the Licensor.
|
||||||
|
|
||||||
|
d. Nothing in this Public License constitutes or may be interpreted as a limitation
|
||||||
|
upon, or waiver of, any privileges and immunities that apply to the Licensor
|
||||||
|
or You, including from the legal processes of any jurisdiction or authority.
|
||||||
|
|
||||||
|
Creative Commons is not a party to its public licenses. Notwithstanding, Creative
|
||||||
|
Commons may elect to apply one of its public licenses to material it publishes
|
||||||
|
and in those instances will be considered the "Licensor." The text of the
|
||||||
|
Creative Commons public licenses is dedicated to the public domain under the
|
||||||
|
CC0 Public Domain Dedication. Except for the limited purpose of indicating
|
||||||
|
that material is shared under a Creative Commons public license or as otherwise
|
||||||
|
permitted by the Creative Commons policies published at creativecommons.org/policies,
|
||||||
|
Creative Commons does not authorize the use of the trademark "Creative Commons"
|
||||||
|
or any other trademark or logo of Creative Commons without its prior written
|
||||||
|
consent including, without limitation, in connection with any unauthorized
|
||||||
|
modifications to any of its public licenses or any other arrangements, understandings,
|
||||||
|
or agreements concerning use of licensed material. For the avoidance of doubt,
|
||||||
|
this paragraph does not form part of the public licenses.
|
||||||
|
|
||||||
|
Creative Commons may be contacted at creativecommons.org.
|
95
README.md
95
README.md
@ -1,31 +1,86 @@
|
|||||||
# ✒️ Document generation microservices
|
# @lfk/document-server
|
||||||
|
|
||||||
## Features
|
The document generation server responsible for creating pdfs for sponsoring contracts, certificates and more.
|
||||||
|
This server doesn't interact with any database and can therefor be deployed on it's own.
|
||||||
|
The basic generation mechanism makes the templates and routes interchangeable (if you want to expand or modify it).
|
||||||
|
|
||||||
- 📝 HTML pdf templates
|
## Quickstart 🐳
|
||||||
- 📚 OpenAPI/Swagger documentation
|
> Use this to run the document server in docker.
|
||||||
- ⚡ High-performance with go and gotenberg
|
|
||||||
|
|
||||||
## 🚀 Quick Start
|
1. Clone the repo or copy the docker-compose
|
||||||
|
2. Run in the folder that contains the docker-compose file: `docker-compose up -d`
|
||||||
|
3. Visit http://127.0.0.1:4010/docs to check if the server is running
|
||||||
|
|
||||||
|
## Dev Setup 🛠
|
||||||
|
> Local dev setup
|
||||||
|
|
||||||
|
1. Rename the .env.example file to .env (you can adjust app port and other settings, if needed)
|
||||||
|
2. Install Dependencies
|
||||||
```bash
|
```bash
|
||||||
# Install dependencies
|
yarn
|
||||||
go mod download
|
```
|
||||||
|
3. Start the server
|
||||||
# Generate the swagger docs
|
```bash
|
||||||
swag init
|
yarn dev
|
||||||
|
|
||||||
# Run the server
|
|
||||||
air
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📖 API Documentation
|
## ENV Vars
|
||||||
|
> You can provide them via .env file or docker env vars.
|
||||||
|
|
||||||
Swagger UI is available at: `/swagger`
|
| Name | Type | Default | Description
|
||||||
|
| - | - | - | -
|
||||||
|
| APP_PORT | Number | 4010 | The port the backend server listens on. Is optional.
|
||||||
|
| NODE_ENV | String | dev | The apps env - influences debug info.
|
||||||
|
| EVENT_NAME | String | "Please set the event name" | The event's name - used to generate pdf text.
|
||||||
|
| CURRENCY_SYMBOL | String | "€" | The your currency's symbol - used to generate pdf text.
|
||||||
|
| SPONSORING_RECEIPT_MINIMUM_AMOUNT | String | "10" | The mimimum total donation amount a sponsor has to donate to be able to receive a donation receipt - used to generate pdf text.
|
||||||
|
| SPONOR_LOGOS | Array<String> | Empty png | The sponsor images you want to loop through. You can provide them via http url, local file or base64-encoded image.
|
||||||
|
| API_KEY | String(min length: 64) | Random generated string | The api key you want to use for auth (query-param `key`), has to be at least 64 chars long.
|
||||||
|
| DISCLAIMER_TEXT | String | N/A | A disclaimer that will get displayed on the bottom of each sponsoring contract. R/N You can only provide the disclaimer for one language.
|
||||||
|
| DONATIONS_FOOTER_TEXT | String | N/A | A text that will get displayed on the bottom of each runner certificate's second page. R/N You can only provide the text for one language.
|
||||||
|
| CONTRACTS_PER_RUNNER | Number | 1 | The amount of contracts that get created per runner (per request).
|
||||||
|
| CODEFORMAT | String | code39 | The barcode format for everything except.
|
||||||
|
| CODEFORMAT_CARDS | String | code39 | The barcode format for runnercards (overwrites CODEFORMAT).
|
||||||
|
| CARD_SUBTITLE | String | Empty | A subtitle that get's displayed on the cards under the eventname.
|
||||||
|
|
||||||
## 🛠️ Development
|
## Templates
|
||||||
|
> The document server uses html templates to generate various pdf documents.
|
||||||
|
> The templates are stored in src/templates by default.
|
||||||
|
|
||||||
The project uses:
|
We provide a set of default templates that we use for the ["Lauf für Kaya!" charity run](https://lauf-fuer-kaya.de).
|
||||||
|
We use handlebars for templateing utilizing i18next for translation - the i18n string format in the templates is : `{{__ "string"}}`
|
||||||
|
You can provide your own templates by replacing the ones we provided before compiling the project or by simply mounting your custom templates into the docker container.
|
||||||
|
|
||||||
- 🏃♂️ go as the language and build tool
|
The server currently needs the following templates to work:
|
||||||
- 🌐 gofiber for the web framework
|
* sponsoring_contract.html
|
||||||
|
|
||||||
|
### Sponsoring Contracts
|
||||||
|
|
||||||
|
| Template Data | Type | Optional | Description
|
||||||
|
| - | - | - | -
|
||||||
|
| runners | array(Runner) | ❌ | The runner objects. We generate a contract for each runner on a new DIN-A5 page.
|
||||||
|
|
||||||
|
|
||||||
|
## Recommended Editor
|
||||||
|
|
||||||
|
[Visual Studio Code](https://code.visualstudio.com/)
|
||||||
|
|
||||||
|
### Recommended Extensions
|
||||||
|
|
||||||
|
* will be automatically recommended via ./vscode/extensions.json
|
||||||
|
* we also provide a config for i18n-ally in the .vscode folder
|
||||||
|
|
||||||
|
## Staging
|
||||||
|
### Branches & Tags
|
||||||
|
* vX.Y.Z: Release tags created from the main branch
|
||||||
|
* The version numbers follow the semver standard
|
||||||
|
* A new release tag automaticly triggers the release ci pipeline
|
||||||
|
* main: Protected "release" branch
|
||||||
|
* The latest tag of the docker image get's build from this
|
||||||
|
* New releases get created as tags from this
|
||||||
|
* dev: Current dev branch for merging the different feature branches and bugfixes
|
||||||
|
* The dev tag of the docker image get's build from this
|
||||||
|
* Only push minor changes to this branch!
|
||||||
|
* To merge a feature branch into this please create a pull request
|
||||||
|
* feature/xyz: Feature branches - nameing scheme: `feature/issueid-title`
|
||||||
|
* bugfix/xyz: Branches for bugfixes - nameing scheme:`bugfix/issueid-title`
|
21
docker-compose.yml
Normal file
21
docker-compose.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
document_server:
|
||||||
|
# image: registry.odit.services/lfk/beamershow:0.1.3
|
||||||
|
build: .
|
||||||
|
ports:
|
||||||
|
- 4010:4010
|
||||||
|
# volumes:
|
||||||
|
# - ./lelelelele.pdf:/app/app/static/img/lelelelele.pdf
|
||||||
|
environment:
|
||||||
|
APP_PORT: 4010
|
||||||
|
NODE_ENV: production
|
||||||
|
EVENT_NAME: "Testen für Kaya!"
|
||||||
|
CURRENCY_SYMBOL: "€"
|
||||||
|
API_KEY: NqZSYTy5AFQ7MppbLW5moqpTk7u7YrNUHKYhKYuThnnya2WpCOIU694hIZT1FzYe
|
||||||
|
CONTRACTS_PER_RUNNER: 2
|
||||||
|
SPONSORING_RECEIPT_MINIMUM_AMOUNT: 42
|
||||||
|
DISCLAIMER_TEXT: "Hier könnte ihre Werbung stehen"
|
||||||
|
CODEFORMAT: "code39"
|
||||||
|
CODEFORMAT_CARDS: "ean13"
|
||||||
|
CARD_SUBTITLE: "Hier könnte mehr Werbung stehen"
|
111
docs/docs.go
111
docs/docs.go
@ -1,111 +0,0 @@
|
|||||||
// Package docs Code generated by swaggo/swag. DO NOT EDIT
|
|
||||||
package docs
|
|
||||||
|
|
||||||
import "github.com/swaggo/swag"
|
|
||||||
|
|
||||||
const docTemplate = `{
|
|
||||||
"schemes": {{ marshal .Schemes }},
|
|
||||||
"swagger": "2.0",
|
|
||||||
"info": {
|
|
||||||
"description": "{{escape .Description}}",
|
|
||||||
"title": "{{.Title}}",
|
|
||||||
"contact": {},
|
|
||||||
"version": "{{.Version}}"
|
|
||||||
},
|
|
||||||
"host": "{{.Host}}",
|
|
||||||
"basePath": "{{.BasePath}}",
|
|
||||||
"paths": {
|
|
||||||
"/contracts": {
|
|
||||||
"post": {
|
|
||||||
"description": "Generate a contract based on the provided data",
|
|
||||||
"consumes": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"produces": [
|
|
||||||
"application/pdf"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"contracts"
|
|
||||||
],
|
|
||||||
"summary": "Generate a contract",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"description": "Contract data",
|
|
||||||
"name": "data",
|
|
||||||
"in": "body",
|
|
||||||
"required": true,
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/models.Contract"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"definitions": {
|
|
||||||
"models.Contract": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"runners": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"$ref": "#/definitions/models.Runner"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"models.Group": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"id": {
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"parent_group": {
|
|
||||||
"$ref": "#/definitions/models.Group"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"models.Runner": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"first_name": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"group": {
|
|
||||||
"$ref": "#/definitions/models.Group"
|
|
||||||
},
|
|
||||||
"id": {
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"last_name": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"middle_name": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
||||||
|
|
||||||
// SwaggerInfo holds exported Swagger Info so clients can modify it
|
|
||||||
var SwaggerInfo = &swag.Spec{
|
|
||||||
Version: "",
|
|
||||||
Host: "",
|
|
||||||
BasePath: "",
|
|
||||||
Schemes: []string{},
|
|
||||||
Title: "LfK Document Server API",
|
|
||||||
Description: "This is the API documentation for the LfK Document Server - a tool for pdf generation.",
|
|
||||||
InfoInstanceName: "swagger",
|
|
||||||
SwaggerTemplate: docTemplate,
|
|
||||||
LeftDelim: "{{",
|
|
||||||
RightDelim: "}}",
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
{
|
|
||||||
"swagger": "2.0",
|
|
||||||
"info": {
|
|
||||||
"description": "This is the API documentation for the LfK Document Server - a tool for pdf generation.",
|
|
||||||
"title": "LfK Document Server API",
|
|
||||||
"contact": {}
|
|
||||||
},
|
|
||||||
"paths": {
|
|
||||||
"/contracts": {
|
|
||||||
"post": {
|
|
||||||
"description": "Generate a contract based on the provided data",
|
|
||||||
"consumes": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"produces": [
|
|
||||||
"application/pdf"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"contracts"
|
|
||||||
],
|
|
||||||
"summary": "Generate a contract",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"description": "Contract data",
|
|
||||||
"name": "data",
|
|
||||||
"in": "body",
|
|
||||||
"required": true,
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/models.Contract"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"definitions": {
|
|
||||||
"models.Contract": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"runners": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"$ref": "#/definitions/models.Runner"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"models.Group": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"id": {
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"parent_group": {
|
|
||||||
"$ref": "#/definitions/models.Group"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"models.Runner": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"first_name": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"group": {
|
|
||||||
"$ref": "#/definitions/models.Group"
|
|
||||||
},
|
|
||||||
"id": {
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"last_name": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"middle_name": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
definitions:
|
|
||||||
models.Contract:
|
|
||||||
properties:
|
|
||||||
runners:
|
|
||||||
items:
|
|
||||||
$ref: '#/definitions/models.Runner'
|
|
||||||
type: array
|
|
||||||
type: object
|
|
||||||
models.Group:
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: integer
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
parent_group:
|
|
||||||
$ref: '#/definitions/models.Group'
|
|
||||||
type: object
|
|
||||||
models.Runner:
|
|
||||||
properties:
|
|
||||||
first_name:
|
|
||||||
type: string
|
|
||||||
group:
|
|
||||||
$ref: '#/definitions/models.Group'
|
|
||||||
id:
|
|
||||||
type: integer
|
|
||||||
last_name:
|
|
||||||
type: string
|
|
||||||
middle_name:
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
info:
|
|
||||||
contact: {}
|
|
||||||
description: This is the API documentation for the LfK Document Server - a tool
|
|
||||||
for pdf generation.
|
|
||||||
title: LfK Document Server API
|
|
||||||
paths:
|
|
||||||
/contracts:
|
|
||||||
post:
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
description: Generate a contract based on the provided data
|
|
||||||
parameters:
|
|
||||||
- description: Contract data
|
|
||||||
in: body
|
|
||||||
name: data
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
$ref: '#/definitions/models.Contract'
|
|
||||||
produces:
|
|
||||||
- application/pdf
|
|
||||||
responses: {}
|
|
||||||
summary: Generate a contract
|
|
||||||
tags:
|
|
||||||
- contracts
|
|
||||||
swagger: "2.0"
|
|
35
go.mod
35
go.mod
@ -1,35 +0,0 @@
|
|||||||
module git.odit.services/lfk/document-server
|
|
||||||
|
|
||||||
go 1.22.1
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
|
||||||
github.com/PuerkitoBio/purell v1.2.1 // indirect
|
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
|
||||||
github.com/andybalholm/brotli v1.1.1 // indirect
|
|
||||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
|
||||||
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
|
||||||
github.com/go-openapi/spec v0.21.0 // indirect
|
|
||||||
github.com/go-openapi/swag v0.23.0 // indirect
|
|
||||||
github.com/gofiber/fiber/v2 v2.52.5 // indirect
|
|
||||||
github.com/gofiber/swagger v1.1.0 // indirect
|
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
|
||||||
github.com/klauspost/compress v1.17.11 // indirect
|
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
|
||||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
|
||||||
github.com/swaggo/files/v2 v2.0.1 // indirect
|
|
||||||
github.com/swaggo/swag v1.16.4 // indirect
|
|
||||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
|
||||||
github.com/valyala/fasthttp v1.57.0 // indirect
|
|
||||||
github.com/valyala/tcplisten v1.0.0 // indirect
|
|
||||||
golang.org/x/net v0.31.0 // indirect
|
|
||||||
golang.org/x/sys v0.27.0 // indirect
|
|
||||||
golang.org/x/text v0.20.0 // indirect
|
|
||||||
golang.org/x/tools v0.27.0 // indirect
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
|
||||||
)
|
|
80
go.sum
80
go.sum
@ -1,80 +0,0 @@
|
|||||||
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
|
||||||
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
|
||||||
github.com/PuerkitoBio/purell v1.2.1 h1:QsZ4TjvwiMpat6gBCBxEQI0rcS9ehtkKtSpiUnd9N28=
|
|
||||||
github.com/PuerkitoBio/purell v1.2.1/go.mod h1:ZwHcC/82TOaovDi//J/804umJFFmbOHPngi8iYYv/Eo=
|
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
|
||||||
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
|
||||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
|
||||||
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
|
||||||
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
|
|
||||||
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
|
|
||||||
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
|
|
||||||
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
|
|
||||||
github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
|
|
||||||
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
|
|
||||||
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
|
|
||||||
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
|
|
||||||
github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo=
|
|
||||||
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
|
|
||||||
github.com/gofiber/swagger v1.1.0 h1:ff3rg1fB+Rp5JN/N8jfxTiZtMKe/9tB9QDc79fPiJKQ=
|
|
||||||
github.com/gofiber/swagger v1.1.0/go.mod h1:pRZL0Np35sd+lTODTE5The0G+TMHfNY+oC4hM2/i5m8=
|
|
||||||
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
|
|
||||||
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
|
||||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
|
||||||
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
|
|
||||||
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
|
||||||
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
|
|
||||||
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
|
||||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
|
||||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
|
||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
|
||||||
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
|
||||||
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
|
||||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
|
||||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
|
||||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
|
||||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
|
||||||
github.com/swaggo/files/v2 v2.0.1 h1:XCVJO/i/VosCDsJu1YLpdejGsGnBE9deRMpjN4pJLHk=
|
|
||||||
github.com/swaggo/files/v2 v2.0.1/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM=
|
|
||||||
github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A=
|
|
||||||
github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg=
|
|
||||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
|
||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
|
||||||
github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA=
|
|
||||||
github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g=
|
|
||||||
github.com/valyala/fasthttp v1.57.0 h1:Xw8SjWGEP/+wAAgyy5XTvgrWlOD1+TxbbvNADYCm1Tg=
|
|
||||||
github.com/valyala/fasthttp v1.57.0/go.mod h1:h6ZBaPRlzpZ6O3H5t2gEk1Qi33+TmLvfwgLLp0t9CpE=
|
|
||||||
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
|
||||||
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
|
||||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
|
||||||
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
|
||||||
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
|
||||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
|
||||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
|
||||||
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
|
||||||
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
|
||||||
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
@ -1,27 +0,0 @@
|
|||||||
package handlers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"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 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(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
log.Println(contract.Runners[0].Group.ParentGroup)
|
|
||||||
return c.SendString("Contract generated")
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package handlers
|
|
||||||
|
|
||||||
import "github.com/gofiber/fiber/v2"
|
|
||||||
|
|
||||||
func NotFoundHandler(c *fiber.Ctx) error {
|
|
||||||
return c.Status(404).SendString("Not Found")
|
|
||||||
}
|
|
1077
licenses.md
Normal file
1077
licenses.md
Normal file
File diff suppressed because it is too large
Load Diff
43
main.go
43
main.go
@ -1,43 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"git.odit.services/lfk/document-server/docs" // Correct import path for docs
|
|
||||||
"git.odit.services/lfk/document-server/handlers"
|
|
||||||
"github.com/gofiber/fiber/v2"
|
|
||||||
"github.com/gofiber/swagger"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
port = flag.String("port", ":3000", "Port to listen on")
|
|
||||||
prod = flag.Bool("prod", false, "Enable prefork in Production")
|
|
||||||
)
|
|
||||||
|
|
||||||
// @title LfK Document Server API
|
|
||||||
// @description This is the API documentation for the LfK Document Server - a tool for pdf generation.
|
|
||||||
func main() {
|
|
||||||
// Parse command-line flags
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
// Create a new Fiber instance
|
|
||||||
app := fiber.New(fiber.Config{
|
|
||||||
Prefork: *prod,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Swagger documentation route
|
|
||||||
app.Get("/swagger/*", swagger.HandlerDefault)
|
|
||||||
|
|
||||||
v1 := app.Group("/v1")
|
|
||||||
|
|
||||||
v1.Get("/", func(c *fiber.Ctx) error {
|
|
||||||
return c.SendString("Hello, World!")
|
|
||||||
})
|
|
||||||
v1.Post("/contracts", handlers.GenerateContract)
|
|
||||||
|
|
||||||
app.Use(handlers.NotFoundHandler)
|
|
||||||
docs.SwaggerInfo.BasePath = "/"
|
|
||||||
|
|
||||||
log.Fatal(app.Listen(*port))
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
package models
|
|
||||||
|
|
||||||
type Contract struct {
|
|
||||||
Runners []Runner `json:"runners"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Runner struct {
|
|
||||||
ID int `json:"id"`
|
|
||||||
FirstName string `json:"first_name"`
|
|
||||||
MiddleName string `json:"middle_name"`
|
|
||||||
LastName string `json:"last_name"`
|
|
||||||
Group Group `json:"group"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Group struct {
|
|
||||||
ID int `json:"id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
ParentGroup *Group `json:"parent_group"`
|
|
||||||
}
|
|
96
package.json
Normal file
96
package.json
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"name": "@odit/lfk-document-server",
|
||||||
|
"version": "0.6.2",
|
||||||
|
"description": "The document generation server for the LfK! runner system. This generates certificates, sponsoring aggreements and more",
|
||||||
|
"main": "src/app.ts",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "nodemon src/app.ts",
|
||||||
|
"build": "rimraf ./dist && tsc && cp-cli ./src/templates ./dist/templates && cp-cli ./src/locales ./dist/locales",
|
||||||
|
"licenses:export": "license-exporter --markdown",
|
||||||
|
"changelog:export": "auto-changelog --commit-limit false -p -u --hide-credit",
|
||||||
|
"release": "release-it --only-version",
|
||||||
|
"translations:sort": "node sort_translations.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git@git.odit.services:lfk/document-server.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"odit",
|
||||||
|
"lfk",
|
||||||
|
"pdf",
|
||||||
|
"generate"
|
||||||
|
],
|
||||||
|
"author": {
|
||||||
|
"name": "ODIT.Services",
|
||||||
|
"email": "info@odit.services",
|
||||||
|
"url": "https://odit.services"
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Philipp Dormann",
|
||||||
|
"email": "philipp@philippdormann.de",
|
||||||
|
"url": "https://philippdormann.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nicolai Ort",
|
||||||
|
"email": "info@nicolai-ort.com",
|
||||||
|
"url": "https://nicolai-ort.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "CC-BY-NC-SA-4.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@odit/class-validator-jsonschema": "2.1.1",
|
||||||
|
"async-helpers": "0.3.17",
|
||||||
|
"axios": "1.3.4",
|
||||||
|
"bwip-js": "3.3.0",
|
||||||
|
"cheerio": "1.0.0-rc.5",
|
||||||
|
"class-transformer": "0.3.1",
|
||||||
|
"class-validator": "0.13.1",
|
||||||
|
"consola": "2.15.3",
|
||||||
|
"cors": "2.8.5",
|
||||||
|
"dotenv": "16.0.3",
|
||||||
|
"express": "4.18.2",
|
||||||
|
"handlebars": "4.7.7",
|
||||||
|
"i18next": "20.1.0",
|
||||||
|
"i18next-fs-backend": "1.1.1",
|
||||||
|
"mime-types": "2.1.35",
|
||||||
|
"pdf-lib": "1.17.1",
|
||||||
|
"puppeteer": "8.0.0",
|
||||||
|
"reflect-metadata": "0.1.13",
|
||||||
|
"routing-controllers": "0.9.0-alpha.6",
|
||||||
|
"routing-controllers-openapi": "2.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@odit/license-exporter": "0.0.11",
|
||||||
|
"@types/express": "4.17.17",
|
||||||
|
"@types/node": "18.14.0",
|
||||||
|
"@types/puppeteer": "5.4.3",
|
||||||
|
"auto-changelog": "2.4.0",
|
||||||
|
"cp-cli": "2.0.0",
|
||||||
|
"faker": "5.3.1",
|
||||||
|
"nodemon": "2.0.7",
|
||||||
|
"release-it": "15.6.0",
|
||||||
|
"rimraf": "3.0.2",
|
||||||
|
"ts-node": "9.1.1",
|
||||||
|
"typescript": "4.1.3"
|
||||||
|
},
|
||||||
|
"release-it": {
|
||||||
|
"git": {
|
||||||
|
"commit": true,
|
||||||
|
"requireCleanWorkingDir": false,
|
||||||
|
"commitMessage": "🚀Bumped version to v${version}",
|
||||||
|
"requireBranch": "dev",
|
||||||
|
"push": true,
|
||||||
|
"tag": true,
|
||||||
|
"tagName": "v${version}",
|
||||||
|
"tagAnnotation": "v${version}"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"publish": false
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"after:bump": "npm run changelog:export && npm run licenses:export && git add CHANGELOG.md && git add licenses.md"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4830
pnpm-lock.yaml
generated
Normal file
4830
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
sort_translations.js
Normal file
16
sort_translations.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
// get all language files
|
||||||
|
const files = fs.readdirSync('./src/locales/');
|
||||||
|
files.forEach((f) => {
|
||||||
|
// read file as object
|
||||||
|
const unordered = JSON.parse(fs.readFileSync(`src/locales/${f}`));
|
||||||
|
// order object by keys alpabetically A-Z
|
||||||
|
const ordered = Object.keys(unordered).sort().reduce((obj, key) => {
|
||||||
|
obj[key] = unordered[key];
|
||||||
|
return obj;
|
||||||
|
}, {});
|
||||||
|
// format output as json for commit diff compatibility
|
||||||
|
const out = JSON.stringify(ordered, 0, 4);
|
||||||
|
// write output file
|
||||||
|
fs.writeFileSync(`src/locales/${f}`, out);
|
||||||
|
});
|
308
src/PdfCreator.ts
Normal file
308
src/PdfCreator.ts
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
import axios from 'axios';
|
||||||
|
import cheerio from "cheerio";
|
||||||
|
import fs from "fs";
|
||||||
|
import Handlebars from 'handlebars';
|
||||||
|
import i18next from "i18next";
|
||||||
|
import Backend from 'i18next-fs-backend';
|
||||||
|
import mime from "mime-types";
|
||||||
|
import path from 'path';
|
||||||
|
import { PDFDocument } from 'pdf-lib';
|
||||||
|
import puppeteer from "puppeteer";
|
||||||
|
import { awaitAsyncHandlebarHelpers, helpers } from './asyncHelpers';
|
||||||
|
import { config } from './config';
|
||||||
|
import { CertificateRunner } from './models/CertificateRunner';
|
||||||
|
import { Runner } from './models/Runner';
|
||||||
|
import { RunnerCard } from './models/RunnerCard';
|
||||||
|
import { RunnerGroup } from './models/RunnerGroup';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is responsible for all things pdf creation.
|
||||||
|
* This uses the html templates from src/templates.
|
||||||
|
*/
|
||||||
|
export class PdfCreator {
|
||||||
|
private templateDir = path.join(__dirname, '/templates');
|
||||||
|
private browser;
|
||||||
|
private static interpolations = { eventname: config.eventname, sponsoring_receipt_minimum_amount: config.sponsoring_receipt_minimum_amount, currency_symbol: config.currency_symbol }
|
||||||
|
private static contractsPerRunner = config.contracts_per_runner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main constructor.
|
||||||
|
* Initializes i18n(ext), Handlebars and puppeteer.
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main constructor.
|
||||||
|
* Initializes i18n(ext), Handlebars and puppeteer.
|
||||||
|
*/
|
||||||
|
public async init() {
|
||||||
|
const minimal_args = [
|
||||||
|
'--autoplay-policy=user-gesture-required',
|
||||||
|
'--disable-background-networking',
|
||||||
|
'--disable-background-timer-throttling',
|
||||||
|
'--disable-backgrounding-occluded-windows',
|
||||||
|
'--disable-breakpad',
|
||||||
|
'--disable-client-side-phishing-detection',
|
||||||
|
'--disable-component-update',
|
||||||
|
'--disable-default-apps',
|
||||||
|
'--disable-dev-shm-usage',
|
||||||
|
'--disable-domain-reliability',
|
||||||
|
'--disable-extensions',
|
||||||
|
'--disable-features=AudioServiceOutOfProcess',
|
||||||
|
'--disable-hang-monitor',
|
||||||
|
'--disable-ipc-flooding-protection',
|
||||||
|
'--disable-notifications',
|
||||||
|
'--disable-offer-store-unmasked-wallet-cards',
|
||||||
|
'--disable-popup-blocking',
|
||||||
|
'--disable-print-preview',
|
||||||
|
'--disable-prompt-on-repost',
|
||||||
|
'--disable-renderer-backgrounding',
|
||||||
|
'--disable-speech-api',
|
||||||
|
'--disable-sync',
|
||||||
|
'--hide-scrollbars',
|
||||||
|
'--ignore-gpu-blacklist',
|
||||||
|
'--metrics-recording-only',
|
||||||
|
'--mute-audio',
|
||||||
|
'--no-default-browser-check',
|
||||||
|
'--no-first-run',
|
||||||
|
'--no-pings',
|
||||||
|
'--no-zygote',
|
||||||
|
'--password-store=basic',
|
||||||
|
'--use-gl=swiftshader',
|
||||||
|
'--no-sandbox'
|
||||||
|
];
|
||||||
|
await i18next
|
||||||
|
.use(Backend)
|
||||||
|
.init({
|
||||||
|
fallbackLng: 'en',
|
||||||
|
lng: 'en',
|
||||||
|
backend: {
|
||||||
|
loadPath: path.join(__dirname, '/locales/{{lng}}.json')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await Handlebars.registerHelper(helpers);
|
||||||
|
await Handlebars.registerHelper('__',
|
||||||
|
function (str) {
|
||||||
|
return i18next.t(str, PdfCreator.interpolations).toString();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
await Handlebars.registerHelper('--sponsor',
|
||||||
|
function (str) {
|
||||||
|
const index = (parseInt(str) % config.sponor_logos.length);
|
||||||
|
if (isNaN(index)) {
|
||||||
|
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg=="
|
||||||
|
}
|
||||||
|
return config.sponor_logos[index];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
await Handlebars.registerHelper('--format_kilometers',
|
||||||
|
function (str) {
|
||||||
|
let meters = parseInt(str);
|
||||||
|
return ((meters / 1000).toLocaleString("en-EN", { minimumFractionDigits: 2, maximumFractionDigits: 3 }).replace(".", ","));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
await Handlebars.registerHelper('--format_currency',
|
||||||
|
function (str) {
|
||||||
|
let meters = parseInt(str);
|
||||||
|
return ((meters / 100).toLocaleString("en-EN", { minimumFractionDigits: 2, maximumFractionDigits: 2 }).replace(".", ","));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
this.browser = await puppeteer.launch({ headless: true, args: minimal_args });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate sponsoring contract pdfs.
|
||||||
|
* @param runner The runner you want to generate the contracts for.
|
||||||
|
* @param locale The locale used for the contracts (default:en)
|
||||||
|
*/
|
||||||
|
public async generateSponsoringContract(runners: Runner[], locale: string = "en", codeformat: string = config.codeformat): Promise<Buffer> {
|
||||||
|
if (runners.length == 1 && Object.keys(runners[0]).length == 0) {
|
||||||
|
runners[0] = this.generateEmptyRunner();
|
||||||
|
}
|
||||||
|
if (runners.length > 50) {
|
||||||
|
let pdf_promises = new Array<Promise<Buffer>>();
|
||||||
|
let i, j;
|
||||||
|
for (i = 0, j = runners.length; i < j; i += 50) {
|
||||||
|
let chunk = runners.slice(i, i + 50);
|
||||||
|
pdf_promises.push(this.generateSponsoringContract(chunk, locale));
|
||||||
|
}
|
||||||
|
const pdfs = await Promise.all(pdf_promises);
|
||||||
|
return await this.mergePdfs(pdfs);
|
||||||
|
}
|
||||||
|
for (var i = 1; i < PdfCreator.contractsPerRunner; i++) {
|
||||||
|
runners = runners.reduce(function (res, current, index, array) {
|
||||||
|
return res.concat([current, current]);
|
||||||
|
}, []);
|
||||||
|
}
|
||||||
|
await i18next.changeLanguage(locale);
|
||||||
|
const template_source = fs.readFileSync(`${this.templateDir}/sponsoring_contract.html`, 'utf8');
|
||||||
|
const template = Handlebars.compile(template_source);
|
||||||
|
let result = template({ runners, codeformat, disclaimer: config.disclaimer_text });
|
||||||
|
result = await awaitAsyncHandlebarHelpers(result);
|
||||||
|
const pdf = await this.renderPdf(result, { format: "A5", landscape: true });
|
||||||
|
return pdf
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate runner card pdfs.
|
||||||
|
* @param cards The runner cars you want to generate the cards for.
|
||||||
|
* @param locale The locale used for the cards (default:en)
|
||||||
|
*/
|
||||||
|
public async generateRunnerCards(cards: RunnerCard[], locale: string = "en", codeformat: string = config.codeformat_cards): Promise<Buffer> {
|
||||||
|
if (cards.length > 10) {
|
||||||
|
let pdf_promises = new Array<Promise<Buffer>>();
|
||||||
|
let i, j;
|
||||||
|
for (i = 0, j = cards.length; i < j; i += 10) {
|
||||||
|
let chunk = cards.slice(i, i + 10);
|
||||||
|
pdf_promises.push(this.generateRunnerCards(chunk, locale, codeformat));
|
||||||
|
}
|
||||||
|
const pdfs = await Promise.all(pdf_promises);
|
||||||
|
return await this.mergePdfs(pdfs);
|
||||||
|
}
|
||||||
|
const cards_swapped = this.swapArrayPairs(cards);
|
||||||
|
await i18next.changeLanguage(locale);
|
||||||
|
const template_source = fs.readFileSync(`${this.templateDir}/runner_card.html`, 'utf8');
|
||||||
|
const template = Handlebars.compile(template_source);
|
||||||
|
let result = template({ cards, cards_swapped, eventname: config.eventname, codeformat: codeformat, card_subtitle: config.card_subtitle })
|
||||||
|
result = await awaitAsyncHandlebarHelpers(result);
|
||||||
|
const pdf = await this.renderPdf(result, { format: "A4", landscape: false });
|
||||||
|
return pdf
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate sponsoring contract pdfs.
|
||||||
|
* @param runner The runner you want to generate the contracts for.
|
||||||
|
* @param locale The locale used for the contracts (default:en)
|
||||||
|
*/
|
||||||
|
public async generateRunnerCertficates(runners: CertificateRunner[], locale: string = "en"): Promise<Buffer> {
|
||||||
|
if (runners.length > 50) {
|
||||||
|
let pdf_promises = new Array<Buffer>();
|
||||||
|
let i, j;
|
||||||
|
for (i = 0, j = runners.length; i < j; i += 50) {
|
||||||
|
let chunk = runners.slice(i, i + 50);
|
||||||
|
pdf_promises.push(await this.generateRunnerCertficates(chunk, locale));
|
||||||
|
}
|
||||||
|
return await this.mergePdfs(pdf_promises);
|
||||||
|
}
|
||||||
|
await i18next.changeLanguage(locale);
|
||||||
|
const template_source = fs.readFileSync(`${this.templateDir}/runner_certificate.html`, 'utf8');
|
||||||
|
const template = Handlebars.compile(template_source);
|
||||||
|
let result = template({ runners, eventname: config.eventname, currency_symbol: config.currency_symbol, donations_footer_text: config.donations_footer_text });
|
||||||
|
result = await awaitAsyncHandlebarHelpers(result);
|
||||||
|
const pdf = await this.renderPdf(result, { format: "A4", landscape: false, printBackground: true });
|
||||||
|
return pdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts all images in html to base64.
|
||||||
|
* Works with image files in the template directory or images from urls.
|
||||||
|
* @param html The html string whoms images shall get replaced.
|
||||||
|
*/
|
||||||
|
public async imgToBase64(html): Promise<string> {
|
||||||
|
const $ = cheerio.load(html)
|
||||||
|
|
||||||
|
$('img').each(async (index, element) => {
|
||||||
|
let imgsrc = $(element).attr("src");
|
||||||
|
if (imgsrc.startsWith("data:image")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const img_type = mime.lookup(imgsrc);
|
||||||
|
|
||||||
|
if (!(img_type.includes("image"))) {
|
||||||
|
throw new Error("File is not image mime type");
|
||||||
|
}
|
||||||
|
|
||||||
|
let image;
|
||||||
|
if (imgsrc.startsWith("http")) {
|
||||||
|
image = (await axios.get(imgsrc)).data;
|
||||||
|
image = Buffer.from(image).toString('base64');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (imgsrc.startsWith("./")) {
|
||||||
|
imgsrc = imgsrc.replace("./", "");
|
||||||
|
}
|
||||||
|
image = fs.readFileSync(`${this.templateDir}/${imgsrc}`, { encoding: "base64" });
|
||||||
|
}
|
||||||
|
|
||||||
|
image = `data:${img_type};base64,${image}`
|
||||||
|
$(element).attr("src", image)
|
||||||
|
});
|
||||||
|
|
||||||
|
return $.html();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method manages the creation of pdfs via puppeteer.
|
||||||
|
* @param html The HTML that should get rendered.
|
||||||
|
* @param options Puppeteer PDF option (eg: {format: "A4"})
|
||||||
|
*/
|
||||||
|
public async renderPdf(html: string, options): Promise<any> {
|
||||||
|
html = await this.imgToBase64(html);
|
||||||
|
let page = await this.browser.newPage();
|
||||||
|
await page.setContent(html);
|
||||||
|
const pdf = await page.pdf(options);
|
||||||
|
await page.close();
|
||||||
|
return pdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merges multiple pdfs into one.
|
||||||
|
* @param pdfs The pdfs you want to merge as an buffer array.
|
||||||
|
* @returns The merged pdf as a buffer.
|
||||||
|
*/
|
||||||
|
private async mergePdfs(pdfs: Buffer[]): Promise<Buffer> {
|
||||||
|
const mergedPdf = await PDFDocument.create();
|
||||||
|
|
||||||
|
for (const pdfBuffer of pdfs) {
|
||||||
|
const pdf = await PDFDocument.load(pdfBuffer);
|
||||||
|
const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
|
||||||
|
copiedPages.forEach((page) => {
|
||||||
|
mergedPdf.addPage(page);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Buffer>(await mergedPdf.save());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a new dummy runner with halfspaces for all strings.
|
||||||
|
* Can be used to generate empty sponsoring contracts.
|
||||||
|
* @returns A new runner object that apears to be empty.
|
||||||
|
*/
|
||||||
|
private generateEmptyRunner(): Runner {
|
||||||
|
let group = new RunnerGroup();
|
||||||
|
group.id = 0;
|
||||||
|
group.name = " ";
|
||||||
|
let runner = new Runner();
|
||||||
|
runner.id = 0;
|
||||||
|
runner.firstname = " ";
|
||||||
|
runner.lastname = " ";
|
||||||
|
runner.group = group;
|
||||||
|
return runner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swaps pairs (0/1, 2/3, ...) of elements in an array recursively.
|
||||||
|
* If the last element has no partner it inserts an empty element at the end and swaps the two
|
||||||
|
* This is needed to generate pdfs with front- and backside that get printet on one paper.
|
||||||
|
* @param array The array which's pairs shall get switched.
|
||||||
|
* @returns Array with swapped pairs,
|
||||||
|
*/
|
||||||
|
private swapArrayPairs(array): Array<any> {
|
||||||
|
if (array.length == 1) {
|
||||||
|
return [null, array[0]];
|
||||||
|
}
|
||||||
|
if (array.length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rest = this.swapArrayPairs(array.slice(2))
|
||||||
|
if (!rest) {
|
||||||
|
return [array[1], array[0]]
|
||||||
|
}
|
||||||
|
return [array[1], array[0]].concat(rest);
|
||||||
|
}
|
||||||
|
}
|
33
src/apispec.ts
Normal file
33
src/apispec.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import { MetadataArgsStorage } from 'routing-controllers';
|
||||||
|
import { routingControllersToSpec } from 'routing-controllers-openapi';
|
||||||
|
import { config } from './config';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function generates a the openapi spec from route metadata and type schemas.
|
||||||
|
* @param storage MetadataArgsStorage object generated by routing-controllers.
|
||||||
|
* @param schemas MetadataArgsStorage object generated by class-validator-jsonschema.
|
||||||
|
*/
|
||||||
|
export function generateSpec(storage: MetadataArgsStorage, schemas) {
|
||||||
|
return routingControllersToSpec(
|
||||||
|
storage,
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
components: {
|
||||||
|
schemas,
|
||||||
|
"securitySchemes": {
|
||||||
|
"AuthToken": {
|
||||||
|
"type": "apiKey",
|
||||||
|
"in": "query",
|
||||||
|
"name": "key",
|
||||||
|
description: "A simple api key. See the README's env section for more details."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
info: {
|
||||||
|
description: "The the API for the LfK! document server.",
|
||||||
|
title: "LfK! document server API",
|
||||||
|
version: config.version
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
31
src/app.ts
Normal file
31
src/app.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import consola from "consola";
|
||||||
|
import "reflect-metadata";
|
||||||
|
import { createExpressServer } from "routing-controllers";
|
||||||
|
import { config, e as errors } from './config';
|
||||||
|
import loaders from "./loaders/index";
|
||||||
|
import AuthChecker from './middlewares/AuthChecker';
|
||||||
|
import { ErrorHandler } from './middlewares/ErrorHandler';
|
||||||
|
|
||||||
|
const CONTROLLERS_FILE_EXTENSION = process.env.NODE_ENV === 'production' ? 'js' : 'ts';
|
||||||
|
const app = createExpressServer({
|
||||||
|
middlewares: [ErrorHandler],
|
||||||
|
authorizationChecker: AuthChecker,
|
||||||
|
development: config.development,
|
||||||
|
cors: true,
|
||||||
|
controllers: [`${__dirname}/controllers/*.${CONTROLLERS_FILE_EXTENSION}`],
|
||||||
|
});
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
await loaders(app);
|
||||||
|
app.listen(config.internal_port, () => {
|
||||||
|
consola.success(
|
||||||
|
`⚡️[server]: Server is running at http://localhost:${config.internal_port}`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (errors === 0) {
|
||||||
|
main();
|
||||||
|
} else {
|
||||||
|
consola.error("error");
|
||||||
|
// something's wrong
|
||||||
|
}
|
45
src/asyncHelpers.ts
Normal file
45
src/asyncHelpers.ts
Normal file
File diff suppressed because one or more lines are too long
60
src/config.ts
Normal file
60
src/config.ts
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import consola from "consola";
|
||||||
|
import { config as configDotenv } from 'dotenv';
|
||||||
|
|
||||||
|
configDotenv();
|
||||||
|
export const config = {
|
||||||
|
internal_port: parseInt(process.env.APP_PORT) || 4010,
|
||||||
|
development: process.env.NODE_ENV === "production",
|
||||||
|
version: process.env.VERSION || require('../package.json').version,
|
||||||
|
eventname: process.env.EVENT_NAME || "Please set the event name",
|
||||||
|
currency_symbol: process.env.CURRENCY_SYMBOL || "€",
|
||||||
|
sponsoring_receipt_minimum_amount: process.env.SPONSORING_RECEIPT_MINIMUM_AMOUNT || "10",
|
||||||
|
codeformat: process.env.CODEFORMAT || "code39",
|
||||||
|
codeformat_cards: process.env.CODEFORMAT_CARDS || process.env.CODEFORMAT || "code39",
|
||||||
|
sponor_logos: getSponsorLogos(),
|
||||||
|
api_key: getApiKey(),
|
||||||
|
disclaimer_text: process.env.DISCLAIMER_TEXT || "",
|
||||||
|
donations_footer_text: process.env.DONATIONS_FOOTER_TEXT || "",
|
||||||
|
contracts_per_runner: parseInt(process.env.CONTRACTS_PER_RUNNER) || 1,
|
||||||
|
card_subtitle: process.env.CARD_SUBTITLE || ""
|
||||||
|
}
|
||||||
|
let errors = 0
|
||||||
|
if (typeof config.internal_port !== "number") {
|
||||||
|
errors++
|
||||||
|
}
|
||||||
|
if (typeof config.contracts_per_runner !== "number") {
|
||||||
|
errors++
|
||||||
|
}
|
||||||
|
if (typeof config.development !== "boolean") {
|
||||||
|
errors++
|
||||||
|
}
|
||||||
|
function getSponsorLogos(): string[] {
|
||||||
|
try {
|
||||||
|
const logos = JSON.parse(process.env.SPONOR_LOGOS);
|
||||||
|
if (!Array.isArray(logos)) { throw new Error("Not an array.") }
|
||||||
|
return logos;
|
||||||
|
} catch (error) {
|
||||||
|
return ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg=="];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getApiKey(): string {
|
||||||
|
const key = process.env.API_KEY;
|
||||||
|
if (!key) {
|
||||||
|
consola.info("No API key set - generating a random one...");
|
||||||
|
let result = '';
|
||||||
|
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||||
|
const charactersLength = characters.length;
|
||||||
|
for (var i = 0; i < 64; i++) {
|
||||||
|
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
||||||
|
}
|
||||||
|
consola.info(`API KEY: ${result}`)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (key.length < 64) {
|
||||||
|
consola.error(`API key is too short - minimum: 64, current: ${key.length}`)
|
||||||
|
throw new Error("API_KEY too short.")
|
||||||
|
}
|
||||||
|
return key
|
||||||
|
}
|
||||||
|
export let e = errors
|
146
src/controllers/PdfController.ts
Normal file
146
src/controllers/PdfController.ts
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
import { Authorized, Body, JsonController, Post, QueryParam, Res } from 'routing-controllers';
|
||||||
|
import { OpenAPI } from 'routing-controllers-openapi';
|
||||||
|
import { CertificateRunner } from '../models/CertificateRunner';
|
||||||
|
import { Runner } from '../models/Runner';
|
||||||
|
import { RunnerCard } from '../models/RunnerCard';
|
||||||
|
import { PdfCreator } from '../PdfCreator';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The pdf controller handels all endpoints concerning pdf generation.
|
||||||
|
* It therefore is the hearth of the document-generation server's endpoints.
|
||||||
|
* All endpoints have to accept a locale query-param to support i18n.
|
||||||
|
*/
|
||||||
|
@JsonController()
|
||||||
|
@Authorized()
|
||||||
|
@OpenAPI({ security: [{ "AuthToken": [] }] })
|
||||||
|
export class PdfController {
|
||||||
|
private pdf: PdfCreator = new PdfCreator();
|
||||||
|
private initialized: boolean = false;
|
||||||
|
|
||||||
|
@Post('/contracts')
|
||||||
|
@OpenAPI({ description: "Generate Sponsoring contract pdfs from runner objects.<br>You can choose your prefered locale by passing the 'locale' query-param.<br> If you provide more than 100 runenrs this could take a moment or two (we tested up to 1000 runners in about 70sec so far)." })
|
||||||
|
async generateContracts(@Body({ validate: true, options: { limit: "500mb" } }) runners: Runner[], @Res() res: any, @QueryParam("locale") locale: string, @QueryParam("codeformat") codeformat: string, @QueryParam("download") download: boolean) {
|
||||||
|
if (!this.initialized) {
|
||||||
|
await this.pdf.init();
|
||||||
|
this.initialized = true;
|
||||||
|
}
|
||||||
|
if (!Array.isArray(runners)) {
|
||||||
|
runners = [runners];
|
||||||
|
}
|
||||||
|
runners = this.mapRunnerGroupNames(runners)
|
||||||
|
const contracts = await this.pdf.generateSponsoringContract(runners, locale, codeformat);
|
||||||
|
res.setHeader('content-type', 'application/pdf');
|
||||||
|
if (download) {
|
||||||
|
res.setHeader('Content-Disposition', 'attachment; filename="contracts.pdf"')
|
||||||
|
}
|
||||||
|
return contracts;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/cards')
|
||||||
|
@OpenAPI({ description: "Generate runner card pdfs from runner card objects.<br>You can choose your prefered locale by passing the 'locale' query-param." })
|
||||||
|
async generateCards(@Body({ validate: true, options: { limit: "500mb" } }) cards: RunnerCard | RunnerCard[], @Res() res: any, @QueryParam("locale") locale: string, @QueryParam("codeformat") codeformat: string, @QueryParam("download") download: boolean) {
|
||||||
|
if (!this.initialized) {
|
||||||
|
await this.pdf.init();
|
||||||
|
this.initialized = true;
|
||||||
|
}
|
||||||
|
if (!Array.isArray(cards)) {
|
||||||
|
cards = [cards];
|
||||||
|
}
|
||||||
|
cards = this.mapCardGroupNames(cards);
|
||||||
|
const contracts = await this.pdf.generateRunnerCards(cards, locale, codeformat);
|
||||||
|
res.setHeader('content-type', 'application/pdf');
|
||||||
|
if (download) {
|
||||||
|
res.setHeader('Content-Disposition', 'attachment; filename="cards.pdf"')
|
||||||
|
}
|
||||||
|
return contracts;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Post('/certificates')
|
||||||
|
@OpenAPI({ description: "Generate runner certificate pdfs from certificate runner objects.<br>You can choose your prefered locale by passing the 'locale' query-param.<br> If you provide more than 100 runenrs this could take a moment or two (we tested up to 1000 runners in about 70sec so far)." })
|
||||||
|
async generateCertificates(@Body({ validate: true, options: { limit: "500mb" } }) runners: CertificateRunner[], @Res() res: any, @QueryParam("locale") locale: string, @QueryParam("download") download: boolean) {
|
||||||
|
if (!this.initialized) {
|
||||||
|
await this.pdf.init();
|
||||||
|
this.initialized = true;
|
||||||
|
}
|
||||||
|
if (!Array.isArray(runners)) {
|
||||||
|
runners = [runners];
|
||||||
|
}
|
||||||
|
runners = this.mapCertificatRunnersGroupNames(runners)
|
||||||
|
const certificates = await this.pdf.generateRunnerCertficates(runners, locale);
|
||||||
|
res.setHeader('content-type', 'application/pdf');
|
||||||
|
if (download) {
|
||||||
|
res.setHeader('Content-Disposition', 'attachment; filename="certificates.pdf"')
|
||||||
|
}
|
||||||
|
return certificates;
|
||||||
|
}
|
||||||
|
|
||||||
|
private mapRunnerGroupNames(runners: Runner[]): Runner[] {
|
||||||
|
let response = new Array<Runner>();
|
||||||
|
for (let runner of runners) {
|
||||||
|
if (!runner.group.parentGroup) {
|
||||||
|
runner.group.fullName = runner.group.name;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
runner.group.fullName = `${runner.group.parentGroup.name}/${runner.group.name}`;
|
||||||
|
}
|
||||||
|
response.push(runner)
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
private mapCertificatRunnersGroupNames(runners: CertificateRunner[]): CertificateRunner[] {
|
||||||
|
let response = new Array<CertificateRunner>();
|
||||||
|
for (let runner of runners) {
|
||||||
|
if (!runner.group.parentGroup) {
|
||||||
|
runner.group.fullName = runner.group.name;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
runner.group.fullName = `${runner.group.parentGroup.name}/${runner.group.name}`;
|
||||||
|
}
|
||||||
|
runner.donationPerDistanceTotal = 0;
|
||||||
|
if (!Array.isArray(runner.distanceDonations)){
|
||||||
|
runner.distanceDonations = [].concat(runner.distanceDonations)
|
||||||
|
}
|
||||||
|
if (runner.distanceDonations.length > 0) {
|
||||||
|
runner.donationPerDistanceTotal += runner.distanceDonations.reduce(function (sum, current) {
|
||||||
|
return sum + current.amountPerDistance;
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
runner.donationTotal = 0;
|
||||||
|
if (runner.distanceDonations.length > 0) {
|
||||||
|
runner.donationTotal += runner.distanceDonations.reduce(function (sum, current) {
|
||||||
|
return sum + current.amount;
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
response.push(runner)
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
private mapCardGroupNames(cards: RunnerCard[]): RunnerCard[] {
|
||||||
|
let response = new Array<RunnerCard>();
|
||||||
|
for (let card of cards) {
|
||||||
|
if (!card.runner) {
|
||||||
|
card.runner = {
|
||||||
|
id: 0,
|
||||||
|
firstname: "Blank",
|
||||||
|
lastname: "Blank",
|
||||||
|
distance: 0,
|
||||||
|
group: {
|
||||||
|
id: 0,
|
||||||
|
name: "Blank",
|
||||||
|
fullName: "Blank"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!card.runner.group.parentGroup) {
|
||||||
|
card.runner.group.fullName = card.runner.group.name;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
card.runner.group.fullName = `${card.runner.group.parentGroup.name}/${card.runner.group.name}`;
|
||||||
|
}
|
||||||
|
response.push(card)
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
17
src/controllers/StatusController.ts
Normal file
17
src/controllers/StatusController.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { Get, JsonController } from 'routing-controllers';
|
||||||
|
import { OpenAPI } from 'routing-controllers-openapi';
|
||||||
|
import { config } from '../config';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The statuscontroller provides simple endpoints concerning basic information about the server.
|
||||||
|
*/
|
||||||
|
@JsonController()
|
||||||
|
export class StatusController {
|
||||||
|
@Get('/version')
|
||||||
|
@OpenAPI({ description: "A very basic endpoint that just returns the curent package version." })
|
||||||
|
getVersion() {
|
||||||
|
return {
|
||||||
|
"version": config.version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
src/errors/AddressErrors.ts
Normal file
57
src/errors/AddressErrors.ts
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import { IsString } from 'class-validator';
|
||||||
|
import { BadRequestError } from 'routing-controllers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error to throw when an address's postal code fails validation.
|
||||||
|
*/
|
||||||
|
export class AddressPostalCodeInvalidError extends BadRequestError {
|
||||||
|
@IsString()
|
||||||
|
name = "AddressPostalCodeInvalidError"
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
message = "The postal code you provided is invalid. \n Please check if your postal code follows the postal code validation guidelines."
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error to throw when an non-empty address's first line isn't set.
|
||||||
|
*/
|
||||||
|
export class AddressFirstLineEmptyError extends BadRequestError {
|
||||||
|
@IsString()
|
||||||
|
name = "AddressFirstLineEmptyError"
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
message = "You provided a empty first address line. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error to throw when an non-empty address's postal code isn't set.
|
||||||
|
*/
|
||||||
|
export class AddressPostalCodeEmptyError extends BadRequestError {
|
||||||
|
@IsString()
|
||||||
|
name = "AddressPostalCodeEmptyError"
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
message = "You provided a empty postal code. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error to throw when an non-empty address's city isn't set.
|
||||||
|
*/
|
||||||
|
export class AddressCityEmptyError extends BadRequestError {
|
||||||
|
@IsString()
|
||||||
|
name = "AddressCityEmptyError"
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
message = "You provided a empty city. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error to throw when an non-empty address's country isn't set.
|
||||||
|
*/
|
||||||
|
export class AddressCountryEmptyError extends BadRequestError {
|
||||||
|
@IsString()
|
||||||
|
name = "AddressCountryEmptyError"
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
message = "You provided a empty country. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country"
|
||||||
|
}
|
11
src/loaders/express.ts
Normal file
11
src/loaders/express.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { Application } from "express";
|
||||||
|
/**
|
||||||
|
* Loader for express related configurations.
|
||||||
|
* Configures proxy trusts, globally used middlewares and other express features.
|
||||||
|
*/
|
||||||
|
export default async (app: Application) => {
|
||||||
|
app.enable('trust proxy');
|
||||||
|
app.disable('x-powered-by');
|
||||||
|
app.disable('x-served-by');
|
||||||
|
return app;
|
||||||
|
};
|
13
src/loaders/index.ts
Normal file
13
src/loaders/index.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { Application } from "express";
|
||||||
|
import expressLoader from "./express";
|
||||||
|
import openapiLoader from "./openapi";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Index Loader that executes the other loaders in the right order.
|
||||||
|
* This basicly exists for abstraction and a overall better dev experience.
|
||||||
|
*/
|
||||||
|
export default async (app: Application) => {
|
||||||
|
await openapiLoader(app);
|
||||||
|
await expressLoader(app);
|
||||||
|
return app;
|
||||||
|
};
|
25
src/loaders/openapi.ts
Normal file
25
src/loaders/openapi.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import { validationMetadatasToSchemas } from "@odit/class-validator-jsonschema";
|
||||||
|
import express, { Application } from "express";
|
||||||
|
import path from 'path';
|
||||||
|
import { getMetadataArgsStorage } from "routing-controllers";
|
||||||
|
import { generateSpec } from '../apispec';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loader for everything openapi related - from creating the schema to serving it via a static route and swaggerUiExpress.
|
||||||
|
* All auth schema related stuff also has to be configured here
|
||||||
|
*/
|
||||||
|
export default async (app: Application) => {
|
||||||
|
const storage = getMetadataArgsStorage();
|
||||||
|
const schemas = validationMetadatasToSchemas({
|
||||||
|
refPointerPrefix: "#/components/schemas/",
|
||||||
|
});
|
||||||
|
|
||||||
|
//Spec creation based on the previously created schemas
|
||||||
|
const spec = generateSpec(storage, schemas);
|
||||||
|
app.get(["/docs/openapi.json", "/docs/swagger.json"], (req, res) => {
|
||||||
|
res.json(spec);
|
||||||
|
});
|
||||||
|
app.use('/docs', express.static(path.join(__dirname, '../static/docs'), { index: "index.html", extensions: ['html'] }));
|
||||||
|
app.use('/img', express.static(path.join(__dirname, '../static/img')));
|
||||||
|
return app;
|
||||||
|
};
|
29
src/locales/de.json
Normal file
29
src/locales/de.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"address": "Adresse",
|
||||||
|
"betrag-km": "Betrag/ km",
|
||||||
|
"city": "Stadt",
|
||||||
|
"date": "Datum",
|
||||||
|
"firstname": "Vorname",
|
||||||
|
"fuer-den-guten-zweck-zurueckgelegt": "für den guten Zweck zurückgelegt.",
|
||||||
|
"gesamt": "Gesamt",
|
||||||
|
"gesamtbetrag": "Gesamtbetrag",
|
||||||
|
"group": "Team/ Klasse",
|
||||||
|
"hat-beim-eventname": "hat beim {{eventname}}",
|
||||||
|
"house_number": "Hausnummer",
|
||||||
|
"id": "ID",
|
||||||
|
"lastname": "Nachname",
|
||||||
|
"location": "Ort",
|
||||||
|
"mit_unterstuetzung_von": "Mit Unterstützung von:",
|
||||||
|
"please_use_blockletters": "Bitte in DRUCKBUCHSTABEN schreiben",
|
||||||
|
"postalcode": "Postleitzahl",
|
||||||
|
"signature": "Unterschrift",
|
||||||
|
"sponsor": "Sponsor",
|
||||||
|
"sponsor-in": "Sponsor:in",
|
||||||
|
"sponsoring_address_condition": "Muss ausgefüllt werden, wenn Sie eine Spendenquittung benötigen - Spendenquittungen können erst ab einem Gesamtbetrag von {{sponsoring_receipt_minimum_amount}}{{currency_symbol}} ausgestellt werden",
|
||||||
|
"sponsoring_amount_per_distance": "mit einem Betrag von _____{{currency_symbol}} pro gelaufenem Kilometer zu unterstützen.",
|
||||||
|
"sponsoring_subtitle": "Ich bin/ Wir sind bereit anlässlich des {{eventname}}",
|
||||||
|
"sponsoring_title": "Sponsoringerklärung",
|
||||||
|
"sponsorings": "Sponsorings",
|
||||||
|
"street": "Straße",
|
||||||
|
"urkunde": "Urkunde"
|
||||||
|
}
|
29
src/locales/en.json
Normal file
29
src/locales/en.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"address": "Address",
|
||||||
|
"betrag-km": "Amount/ km",
|
||||||
|
"city": "City",
|
||||||
|
"date": "date",
|
||||||
|
"firstname": "First name",
|
||||||
|
"fuer-den-guten-zweck-zurueckgelegt": "for our good cause at the {{eventname}}",
|
||||||
|
"gesamt": "Combined",
|
||||||
|
"gesamtbetrag": "Total",
|
||||||
|
"group": "Team/ class",
|
||||||
|
"hat-beim-eventname": "Ran",
|
||||||
|
"house_number": "House number",
|
||||||
|
"id": "ID",
|
||||||
|
"lastname": "Last name",
|
||||||
|
"location": "Location",
|
||||||
|
"mit_unterstuetzung_von": "Supported by:",
|
||||||
|
"please_use_blockletters": "Please write in BLOCK LETTERS.",
|
||||||
|
"postalcode": "Postal code",
|
||||||
|
"signature": "Signature",
|
||||||
|
"sponsor": "sponsor",
|
||||||
|
"sponsor-in": "Donor",
|
||||||
|
"sponsoring_address_condition": "You have to provide an address if you want a donation receipt - Donation receipts can't be issued for total donation amounts under {{sponsoring_receipt_minimum_amount}}{{currency_symbol}}",
|
||||||
|
"sponsoring_amount_per_distance": "with the amount of _____{{currency_symbol}} per kilometer run.",
|
||||||
|
"sponsoring_subtitle": "On the occasion of the {{eventname}} I/We want to support",
|
||||||
|
"sponsoring_title": "Sponsoring contract",
|
||||||
|
"sponsorings": "Donations",
|
||||||
|
"street": "Street",
|
||||||
|
"urkunde": "Certificate"
|
||||||
|
}
|
14
src/middlewares/AuthChecker.ts
Normal file
14
src/middlewares/AuthChecker.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { Action } from "routing-controllers";
|
||||||
|
import { config } from '../config';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles authentication via jwt's (Bearer authorization header) for all api endpoints using the @Authorized decorator.
|
||||||
|
* @param action Routing-Controllers action object that provides request and response objects among other stuff.
|
||||||
|
* @param permissions The permissions that the endpoint using @Authorized requires.
|
||||||
|
*/
|
||||||
|
const AuthChecker = async (action: Action) => {
|
||||||
|
const provided_token = action.request.query.key;
|
||||||
|
return provided_token == config.api_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AuthChecker
|
14
src/middlewares/ErrorHandler.ts
Normal file
14
src/middlewares/ErrorHandler.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { ExpressErrorMiddlewareInterface, Middleware } from "routing-controllers";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Our Error handling middlware that returns our custom httperrors to the user.
|
||||||
|
*/
|
||||||
|
@Middleware({ type: "after" })
|
||||||
|
export class ErrorHandler implements ExpressErrorMiddlewareInterface {
|
||||||
|
public error(error: any, request: any, response: any, next: (err: any) => any) {
|
||||||
|
if (response.headersSent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
response.json(error);
|
||||||
|
}
|
||||||
|
}
|
50
src/models/Address.ts
Normal file
50
src/models/Address.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import {
|
||||||
|
IsString
|
||||||
|
} from "class-validator";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the Address class.
|
||||||
|
* Implemented this way to prevent any formatting differences.
|
||||||
|
*/
|
||||||
|
export class Address {
|
||||||
|
/**
|
||||||
|
* The address's first line.
|
||||||
|
* Containing the street and house number.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
address1?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The address's second line.
|
||||||
|
* Containing optional information.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
address2?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The address's postal code.
|
||||||
|
* This will get checked against the postal code syntax for the configured country.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
postalcode: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The address's city.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
city: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The address's country.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
country: string;
|
||||||
|
|
||||||
|
public reset() {
|
||||||
|
this.address1 = null;
|
||||||
|
this.address2 = null;
|
||||||
|
this.city = null;
|
||||||
|
this.country = null;
|
||||||
|
this.postalcode = null;
|
||||||
|
}
|
||||||
|
}
|
25
src/models/CertificateRunner.ts
Normal file
25
src/models/CertificateRunner.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import {
|
||||||
|
IsArray, IsNumber, IsOptional
|
||||||
|
} from "class-validator";
|
||||||
|
import { DistanceDonation } from './DistanceDonation';
|
||||||
|
import { Runner } from './Runner';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the certificate runner class (from which the runner certificates get generated).
|
||||||
|
*/
|
||||||
|
export class CertificateRunner extends Runner {
|
||||||
|
/**
|
||||||
|
* Array containing all distance donations associated with the runner.
|
||||||
|
*/
|
||||||
|
@IsArray()
|
||||||
|
distanceDonations: DistanceDonation[];
|
||||||
|
|
||||||
|
@IsNumber()
|
||||||
|
@IsOptional()
|
||||||
|
donationPerDistanceTotal?: number = 0;
|
||||||
|
|
||||||
|
@IsNumber()
|
||||||
|
@IsOptional()
|
||||||
|
donationTotal?: number = 0;
|
||||||
|
|
||||||
|
}
|
40
src/models/DistanceDonation.ts
Normal file
40
src/models/DistanceDonation.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { IsInt, IsNotEmpty, IsObject, IsPositive } from "class-validator";
|
||||||
|
import { Donation } from "./Donation";
|
||||||
|
import { Runner } from "./Runner";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the DistanceDonation class.
|
||||||
|
* For distanceDonations a donor pledges to donate a certain amount for each kilometer ran by a runner.
|
||||||
|
*/
|
||||||
|
export class DistanceDonation extends Donation {
|
||||||
|
/**
|
||||||
|
* The donation's associated runner.
|
||||||
|
* Used as the source of the donation's distance.
|
||||||
|
*/
|
||||||
|
@IsObject()
|
||||||
|
@IsNotEmpty()
|
||||||
|
runner: Runner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donation's amount donated per distance.
|
||||||
|
* The amount the donor set to be donated per kilometer that the runner ran.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
@IsPositive()
|
||||||
|
amountPerDistance: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donation's amount in cents (or whatever your currency's smallest unit is.).
|
||||||
|
* Get's calculated from the runner's distance ran and the amount donated per kilometer.
|
||||||
|
*/
|
||||||
|
public get amount(): number {
|
||||||
|
let calculatedAmount = 0;
|
||||||
|
try {
|
||||||
|
calculatedAmount = this.amountPerDistance * (this.runner.distance / 1000);
|
||||||
|
} catch (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
return calculatedAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
32
src/models/Donation.ts
Normal file
32
src/models/Donation.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import {
|
||||||
|
IsInt,
|
||||||
|
IsNotEmpty,
|
||||||
|
IsObject
|
||||||
|
} from "class-validator";
|
||||||
|
import { Donor } from './Donor';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the Donation base calss.
|
||||||
|
* A donation just associates a donor with a donation amount.
|
||||||
|
* The specifics of the amoun's determination has to be implemented in child classes.
|
||||||
|
*/
|
||||||
|
export abstract class Donation {
|
||||||
|
/**
|
||||||
|
* Autogenerated unique id (primary key).
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donations's donor.
|
||||||
|
*/
|
||||||
|
@IsNotEmpty()
|
||||||
|
@IsObject()
|
||||||
|
donor: Donor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donation's amount in cents (or whatever your currency's smallest unit is.).
|
||||||
|
* The exact implementation may differ for each type of donation.
|
||||||
|
*/
|
||||||
|
public abstract get amount(): number;
|
||||||
|
}
|
37
src/models/Donor.ts
Normal file
37
src/models/Donor.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import {
|
||||||
|
|
||||||
|
IsInt,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IsString
|
||||||
|
} from "class-validator";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the Donor class.
|
||||||
|
*/
|
||||||
|
export class Donor {
|
||||||
|
/**
|
||||||
|
* The donor's id.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donor's first name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
firstname: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donor's middle name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
middlename?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donor's last name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
lastname: string;
|
||||||
|
}
|
16
src/models/FixedDonation.ts
Normal file
16
src/models/FixedDonation.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { IsInt, IsPositive } from "class-validator";
|
||||||
|
import { Donation } from "./Donation";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the FixedDonation entity.
|
||||||
|
* In the past there was no easy way to track fixed donations (eg. for creating donation receipts).
|
||||||
|
*/
|
||||||
|
export class FixedDonation extends Donation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The donation's amount in cents (or whatever your currency's smallest unit is.).
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
@IsPositive()
|
||||||
|
amount: number;
|
||||||
|
}
|
69
src/models/Runner.ts
Normal file
69
src/models/Runner.ts
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import {
|
||||||
|
IsInt,
|
||||||
|
|
||||||
|
IsNotEmpty,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IsObject,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IsOptional,
|
||||||
|
|
||||||
|
IsPositive,
|
||||||
|
|
||||||
|
IsString,
|
||||||
|
ValidateNested
|
||||||
|
} from "class-validator";
|
||||||
|
import { RunnerGroup } from './RunnerGroup';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the runner class (from which the runner sponsoring contracts get generated).
|
||||||
|
*/
|
||||||
|
export class Runner {
|
||||||
|
/**
|
||||||
|
* The runner's id.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
@IsPositive()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The runner's first name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
@IsNotEmpty()
|
||||||
|
firstname: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The runner's middle name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
@IsOptional()
|
||||||
|
middlename?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The runner's last name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
@IsNotEmpty()
|
||||||
|
lastname: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The runner's group.
|
||||||
|
*/
|
||||||
|
@IsObject()
|
||||||
|
@ValidateNested()
|
||||||
|
group: RunnerGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The total distance ran by the runner.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
distance: number;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
console.log("called")
|
||||||
|
}
|
||||||
|
}
|
33
src/models/RunnerCard.ts
Normal file
33
src/models/RunnerCard.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import {
|
||||||
|
IsEAN,
|
||||||
|
IsInt,
|
||||||
|
IsNotEmpty,
|
||||||
|
IsObject,
|
||||||
|
IsString
|
||||||
|
} from "class-validator";
|
||||||
|
import { Runner } from './Runner';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the runner card class (used to create runner card pdfs).
|
||||||
|
*/
|
||||||
|
export class RunnerCard {
|
||||||
|
/**
|
||||||
|
* The cards's id.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The card's associated runner.
|
||||||
|
*/
|
||||||
|
@IsObject()
|
||||||
|
runner: Runner | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The card's code.
|
||||||
|
*/
|
||||||
|
@IsEAN()
|
||||||
|
@IsString()
|
||||||
|
@IsNotEmpty()
|
||||||
|
code: string;
|
||||||
|
}
|
30
src/models/RunnerGroup.ts
Normal file
30
src/models/RunnerGroup.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import { IsInt, IsNotEmpty, IsObject, IsOptional, IsPositive, IsString } from "class-validator";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the runner group class - a simplified version of the backend's ResponseRunnerTeam/-Organization
|
||||||
|
*/
|
||||||
|
export class RunnerGroup {
|
||||||
|
/**
|
||||||
|
* The group's id.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
@IsPositive()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The group's name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
@IsNotEmpty()
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The group's parent group.
|
||||||
|
* If it is set this implies that the object is a team.
|
||||||
|
*/
|
||||||
|
@IsObject()
|
||||||
|
@IsOptional()
|
||||||
|
parentGroup?: RunnerGroup;
|
||||||
|
|
||||||
|
fullName: string;
|
||||||
|
}
|
156
src/static/docs/index.html
Normal file
156
src/static/docs/index.html
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>API Docs</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg-color: #fff;
|
||||||
|
--bg-secondary-color: #f3f3f6;
|
||||||
|
--color-primary: #14854f;
|
||||||
|
--color-lightGrey: #d2d6dd;
|
||||||
|
--color-grey: #747681;
|
||||||
|
--color-darkGrey: #3f4144;
|
||||||
|
--color-error: #d43939;
|
||||||
|
--color-success: #28bd14;
|
||||||
|
--grid-maxWidth: 120rem;
|
||||||
|
--grid-gutter: 2rem;
|
||||||
|
--font-size: 1.6rem;
|
||||||
|
--font-color: #333;
|
||||||
|
--font-family-sans: -apple-system, BlinkMacSystemFont, Avenir, "Avenir Next", "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
||||||
|
--font-family-mono: monaco, "Consolas", "Lucida Console", monospace
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 62.5%;
|
||||||
|
line-height: 1.15;
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
-webkit-text-size-adjust: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
*,
|
||||||
|
:after,
|
||||||
|
:before {
|
||||||
|
-webkit-box-sizing: inherit;
|
||||||
|
box-sizing: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
line-height: 1.6;
|
||||||
|
font-size: var(--font-size);
|
||||||
|
color: var(--font-color);
|
||||||
|
font-family: Segoe UI, Helvetica Neue, sans-serif;
|
||||||
|
font-family: var(--font-family-sans);
|
||||||
|
margin: 0;
|
||||||
|
padding: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-weight: 500;
|
||||||
|
margin: .35em 0 .7em
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.5em
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--color-primary);
|
||||||
|
text-decoration: none
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover:not(.button) {
|
||||||
|
opacity: .75
|
||||||
|
}
|
||||||
|
|
||||||
|
input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=color]):not([type=button]):not([type=reset]):not(:disabled):hover {
|
||||||
|
border-color: var(--color-grey)
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-input-placeholder {
|
||||||
|
color: #bdbfc4
|
||||||
|
}
|
||||||
|
|
||||||
|
::-moz-placeholder {
|
||||||
|
color: #bdbfc4
|
||||||
|
}
|
||||||
|
|
||||||
|
:-ms-input-placeholder {
|
||||||
|
color: #bdbfc4
|
||||||
|
}
|
||||||
|
|
||||||
|
::-ms-input-placeholder {
|
||||||
|
color: #bdbfc4
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs a {
|
||||||
|
text-decoration: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs>a {
|
||||||
|
padding: 1rem 2rem;
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: 0 1 auto;
|
||||||
|
flex: 0 1 auto;
|
||||||
|
color: var(--color-darkGrey);
|
||||||
|
border-bottom: 2px solid var(--color-lightGrey);
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs>a:hover {
|
||||||
|
opacity: 1;
|
||||||
|
border-bottom: 2px solid var(--color-darkGrey)
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-vertical-align {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-center {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-pack: center;
|
||||||
|
-ms-flex-pack: center;
|
||||||
|
justify-content: center
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-center {
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="hero">
|
||||||
|
<div class="logo is-center is-vertical-align">
|
||||||
|
<h3>API Docs</h3>
|
||||||
|
</div>
|
||||||
|
<nav class="tabs is-center">
|
||||||
|
<a href="./redoc">ReDoc</a>
|
||||||
|
<a href="./swaggerui">SwaggerUI</a>
|
||||||
|
<a href="./rapidoc">RapiDoc</a>
|
||||||
|
<a href="./openapi.json">Raw Spec (json)</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
220
src/static/docs/rapidoc-min.js
vendored
Normal file
220
src/static/docs/rapidoc-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
12
src/static/docs/rapidoc.html
Normal file
12
src/static/docs/rapidoc.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<script type="module" src="./rapidoc-min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<rapi-doc
|
||||||
|
spec-url="/docs/openapi.json"
|
||||||
|
> </rapi-doc>
|
||||||
|
</body>
|
||||||
|
</html>
|
18
src/static/docs/redoc.html
Normal file
18
src/static/docs/redoc.html
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>ReDoc</title>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<redoc spec-url='/docs/openapi.json'></redoc>
|
||||||
|
<script src="./redoc.standalone.js"> </script>
|
||||||
|
</body>
|
||||||
|
</html>
|
103
src/static/docs/redoc.standalone.js
Normal file
103
src/static/docs/redoc.standalone.js
Normal file
File diff suppressed because one or more lines are too long
3
src/static/docs/swagger-ui-bundle.js
Normal file
3
src/static/docs/swagger-ui-bundle.js
Normal file
File diff suppressed because one or more lines are too long
3
src/static/docs/swagger-ui-standalone-preset.js
Normal file
3
src/static/docs/swagger-ui-standalone-preset.js
Normal file
File diff suppressed because one or more lines are too long
8895
src/static/docs/swagger-ui.css
Normal file
8895
src/static/docs/swagger-ui.css
Normal file
File diff suppressed because it is too large
Load Diff
58
src/static/docs/swaggerui.html
Normal file
58
src/static/docs/swaggerui.html
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<!-- HTML for static distribution bundle build -->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Swagger UI</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" >
|
||||||
|
<style>
|
||||||
|
html
|
||||||
|
{
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: -moz-scrollbars-vertical;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
*,
|
||||||
|
*:before,
|
||||||
|
*:after
|
||||||
|
{
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
body
|
||||||
|
{
|
||||||
|
margin:0;
|
||||||
|
background: #fafafa;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="swagger-ui"></div>
|
||||||
|
|
||||||
|
<script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
|
||||||
|
<script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
|
||||||
|
<script>
|
||||||
|
window.onload = function() {
|
||||||
|
// Begin Swagger UI call region
|
||||||
|
const ui = SwaggerUIBundle({
|
||||||
|
url: "/docs/openapi.json",
|
||||||
|
dom_id: '#swagger-ui',
|
||||||
|
deepLinking: true,
|
||||||
|
presets: [
|
||||||
|
SwaggerUIBundle.presets.apis,
|
||||||
|
SwaggerUIStandalonePreset
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
SwaggerUIBundle.plugins.DownloadUrl
|
||||||
|
],
|
||||||
|
layout: "StandaloneLayout"
|
||||||
|
})
|
||||||
|
// End Swagger UI call region
|
||||||
|
|
||||||
|
window.ui = ui
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
0
src/static/img/.gitkeep
Normal file
0
src/static/img/.gitkeep
Normal file
0
src/templates/.gitkeep
Normal file
0
src/templates/.gitkeep
Normal file
BIN
src/templates/certficate_background.png
Normal file
BIN
src/templates/certficate_background.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
BIN
src/templates/certificate_footer.png
Normal file
BIN
src/templates/certificate_footer.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
71
src/templates/runner_card.html
Normal file
71
src/templates/runner_card.html
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf8">
|
||||||
|
<title>Sponsoring contract</title>
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css">
|
||||||
|
<style>
|
||||||
|
.sheet {
|
||||||
|
margin: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
page-break-after: always;
|
||||||
|
padding: 1.2cm 2cm 1.2cm 2cm
|
||||||
|
}
|
||||||
|
|
||||||
|
body.A4 .sheet {
|
||||||
|
width: 210mm;
|
||||||
|
height: 296mm
|
||||||
|
}
|
||||||
|
|
||||||
|
.runnercard {
|
||||||
|
border: 1px solid;
|
||||||
|
height: 5.5cm;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="A4 landscape">
|
||||||
|
<div class="sheet">
|
||||||
|
<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;">{{../card_subtitle}}</p>
|
||||||
|
<p style="font-size: small;">{{__ "mit_unterstuetzung_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="{{--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="{{--bc this.code ../codeformat}}" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p>{{this.runner.lastname}}, {{this.runner.firstname}} {{this.runner.middlename}}</p>
|
||||||
|
<p>{{this.runner.group.fullName}}</p>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sheet">
|
||||||
|
<div class="columns is-multiline">
|
||||||
|
{{#each cards_swapped}}
|
||||||
|
<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="{{--sponsor this.id}}" />
|
||||||
|
</div>
|
||||||
|
<img style="object-fit: cover; max-height: 2.5cm; position: relative;" src="{{--bc this.code ../codeformat}}" />
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
102
src/templates/runner_certificate.html
Normal file
102
src/templates/runner_certificate.html
Normal file
File diff suppressed because one or more lines are too long
120
src/templates/sponsoring_contract.html
Normal file
120
src/templates/sponsoring_contract.html
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf8">
|
||||||
|
<title>Sponsoring contract</title>
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css">
|
||||||
|
<style>
|
||||||
|
.sheet {
|
||||||
|
margin: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
page-break-after: always;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.A5.landscape .sheet {
|
||||||
|
width: 210mm;
|
||||||
|
height: 147mm
|
||||||
|
}
|
||||||
|
|
||||||
|
.column {
|
||||||
|
margin-bottom: -20;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="A5 landscape">
|
||||||
|
{{#each runners}}
|
||||||
|
<div class="sheet">
|
||||||
|
<img id="header_img" width="100%" src="sponsoringheader.png" />
|
||||||
|
<div style=" padding: 0 1rem 0 1rem;">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-10">
|
||||||
|
<div class="columns" style="padding-bottom: 0;">
|
||||||
|
<div class="column is-two-fifths">
|
||||||
|
<p style="font-size: large; font-weight: bold;">{{__ "sponsoring_title"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<p style="font-size: x-small; vertical-align: revert; margin-top: auto;">{{__ "please_use_blockletters"}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p> {{__ "sponsoring_subtitle"}} </p>
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-9">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;">{{this.firstname}}
|
||||||
|
{{this.middlename}}</span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "firstname"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="column is-3">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;">{{this.id}}</span>
|
||||||
|
<p style="font-size: x-small; display: block;">ID</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<img style="vertical-align: revert; margin-top: auto; object-fit: cover; max-height: 2cm;"
|
||||||
|
src="{{--bc this.id ../codeformat}}" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="columns" style="padding-top: 1rem;">
|
||||||
|
<div class="column is-6">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;">{{this.lastname}}</span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "lastname"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="column is-6">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;">{{this.group.fullName}}</span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "group"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p style="margin-top: -0.5rem">{{__ "sponsoring_amount_per_distance"}}</p>
|
||||||
|
<div class="columns" style="margin-top: -1rem;">
|
||||||
|
<div class="column is-6">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "lastname"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="column is-6">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "firstname"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p style="font-size: medium; margin-top: -0.5rem;">{{__ "address"}} ({{__ "sponsor"}})</p>
|
||||||
|
<p style="font-size: x-small;">({{__ "sponsoring_address_condition"}})</p>
|
||||||
|
<div class="columns" style="margin-top: -1rem;">
|
||||||
|
<div class="column is-8">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "street"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="column is-4">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "house_number"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="columns" style="margin-top: -1rem;">
|
||||||
|
<div class="column is-4">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "postalcode"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="column is-8">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "city"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="columns" style="margin-top: -1rem;">
|
||||||
|
<div class="column is-7">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "location"}}, {{__ "date"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="column is-5">
|
||||||
|
<span style="border-bottom: 1px solid; width: 100%; display: block;"> </span>
|
||||||
|
<p style="font-size: x-small; display: block;">{{__ "signature"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p style="font-size: xx-small; overflow: hidden; height: 4rem; text-align: center;">{{../disclaimer}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
BIN
src/templates/sponsoringheader.png
Normal file
BIN
src/templates/sponsoringheader.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 KiB |
182
src/tests/speedtest.ts
Normal file
182
src/tests/speedtest.ts
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
import axios from "axios"
|
||||||
|
import faker from "faker"
|
||||||
|
import { config } from '../config'
|
||||||
|
import { CertificateRunner } from '../models/CertificateRunner'
|
||||||
|
import { DistanceDonation } from '../models/DistanceDonation'
|
||||||
|
import { Donor } from '../models/Donor'
|
||||||
|
import { Runner } from '../models/Runner'
|
||||||
|
import { RunnerCard } from '../models/RunnerCard'
|
||||||
|
import { RunnerGroup } from '../models/RunnerGroup'
|
||||||
|
|
||||||
|
const baseurl = "http://localhost:4010"
|
||||||
|
const key = config.api_key;
|
||||||
|
|
||||||
|
axios.interceptors.request.use((config) => {
|
||||||
|
config.headers['request-startTime'] = process.hrtime()
|
||||||
|
return config
|
||||||
|
})
|
||||||
|
|
||||||
|
axios.interceptors.response.use((response) => {
|
||||||
|
const start = response.config.headers['request-startTime']
|
||||||
|
const end = process.hrtime(start)
|
||||||
|
const milliseconds = Math.round((end[0] * 1000) + (end[1] / 1000000))
|
||||||
|
response.headers['request-duration'] = milliseconds
|
||||||
|
return response
|
||||||
|
})
|
||||||
|
|
||||||
|
function generateRunners(amount: number): Runner[] {
|
||||||
|
let runners: Runner[] = new Array<Runner>();
|
||||||
|
let group = new RunnerGroup();
|
||||||
|
let runner = new Runner();
|
||||||
|
for (var i = 0; i < amount; i++) {
|
||||||
|
group.name = faker.company.bsBuzz();
|
||||||
|
group.id = Math.floor(Math.random() * (9999999 - 1) + 1);
|
||||||
|
runner.firstname = faker.name.firstName();
|
||||||
|
runner.lastname = faker.name.lastName();
|
||||||
|
runner.id = Math.floor(Math.random() * (9999999 - 1) + 1);
|
||||||
|
runners.push(runner);
|
||||||
|
}
|
||||||
|
return runners;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateCards(amount: number): RunnerCard[] {
|
||||||
|
let cards: RunnerCard[] = new Array<RunnerCard>();
|
||||||
|
let card = new RunnerCard();
|
||||||
|
for (let runner of generateRunners(amount)) {
|
||||||
|
card.id = runner.id;
|
||||||
|
card.code = idToEan13(card.id);
|
||||||
|
card.runner = runner;
|
||||||
|
cards.push(card);
|
||||||
|
}
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateCertificateRunners(amount: number): CertificateRunner[] {
|
||||||
|
let runners: CertificateRunner[] = new Array<CertificateRunner>();
|
||||||
|
let group = new RunnerGroup();
|
||||||
|
let runner = new CertificateRunner();
|
||||||
|
let donor = new Donor();
|
||||||
|
let donation = new DistanceDonation();
|
||||||
|
for (var i = 0; i < amount; i++) {
|
||||||
|
group.name = faker.company.bsBuzz();
|
||||||
|
group.id = Math.floor(Math.random() * (9999999 - 1) + 1);
|
||||||
|
|
||||||
|
donor.firstname = faker.name.firstName();
|
||||||
|
donor.lastname = faker.name.lastName();
|
||||||
|
donor.id = Math.floor(Math.random() * (9999999 - 1) + 1);
|
||||||
|
|
||||||
|
runner.firstname = faker.name.firstName();
|
||||||
|
runner.lastname = faker.name.lastName();
|
||||||
|
runner.id = Math.floor(Math.random() * (9999999 - 1) + 1);
|
||||||
|
runner.distance = Math.floor(Math.random() * (9999999 - 1) + 1);
|
||||||
|
|
||||||
|
donation.id = Math.floor(Math.random() * (9999999 - 1) + 1);
|
||||||
|
donation.donor = donor;
|
||||||
|
donation.runner = runner;
|
||||||
|
donation.amountPerDistance = Math.floor(Math.random() * (10000 - 1) + 1);
|
||||||
|
|
||||||
|
runner.distanceDonations = [donation, donation]
|
||||||
|
runners.push(runner);
|
||||||
|
}
|
||||||
|
return runners;
|
||||||
|
}
|
||||||
|
|
||||||
|
function idToEan13(id): string {
|
||||||
|
const multiply = [1, 3];
|
||||||
|
id = id.toString();
|
||||||
|
|
||||||
|
if (id.length > 12) {
|
||||||
|
throw new Error("id too long");
|
||||||
|
}
|
||||||
|
while (id.length < 12) { id = '0' + id; }
|
||||||
|
|
||||||
|
let total = 0;
|
||||||
|
id.split('').forEach((letter, index) => {
|
||||||
|
total += parseInt(letter, 10) * multiply[index % 2];
|
||||||
|
});
|
||||||
|
const checkSum = (Math.ceil(total / 10) * 10) - total;
|
||||||
|
return id + checkSum.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function postContracts(runners: Runner[]): Promise<Measurement> {
|
||||||
|
const res = await axios.post(`${baseurl}/contracts?key=${key}`, runners);
|
||||||
|
return new Measurement("contract", runners.length, parseInt(res.headers['request-duration']))
|
||||||
|
}
|
||||||
|
|
||||||
|
async function postCards(cards: RunnerCard[]): Promise<Measurement> {
|
||||||
|
const res = await axios.post(`${baseurl}/cards?key=${key}`, cards);
|
||||||
|
return new Measurement("card", cards.length, parseInt(res.headers['request-duration']))
|
||||||
|
}
|
||||||
|
|
||||||
|
async function postCertificates(runners: CertificateRunner[]): Promise<Measurement> {
|
||||||
|
const res = await axios.post(`${baseurl}/certificates?key=${key}`, runners);
|
||||||
|
return new Measurement("certificate", runners.length, parseInt(res.headers['request-duration']))
|
||||||
|
}
|
||||||
|
|
||||||
|
async function testContracts(sizes): Promise<Measurement[]> {
|
||||||
|
let measurements = new Array<Measurement>();
|
||||||
|
console.log("#### Testing contracts ####");
|
||||||
|
|
||||||
|
for (let size of sizes) {
|
||||||
|
const m = await postContracts(generateRunners(size));
|
||||||
|
console.log(m.toString());
|
||||||
|
measurements.push(m);
|
||||||
|
}
|
||||||
|
return measurements;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function testCards(sizes): Promise<Measurement[]> {
|
||||||
|
let measurements = new Array<Measurement>();
|
||||||
|
console.log("#### Testing Cards ####");
|
||||||
|
|
||||||
|
for (let size of sizes) {
|
||||||
|
const m = await postCards(generateCards(size));
|
||||||
|
console.log(m.toString());
|
||||||
|
measurements.push(m);
|
||||||
|
}
|
||||||
|
return measurements;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function testCertificates(sizes): Promise<Measurement[]> {
|
||||||
|
let measurements = new Array<Measurement>();
|
||||||
|
console.log("#### Testing Certificates ####");
|
||||||
|
|
||||||
|
for (let size of sizes) {
|
||||||
|
const m = await postCertificates(generateCertificateRunners(size));
|
||||||
|
console.log(m.toString());
|
||||||
|
measurements.push(m);
|
||||||
|
}
|
||||||
|
return measurements;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const sizes = [1, 10, 50, 100]
|
||||||
|
console.log("########### Speedtest ###########");
|
||||||
|
console.log(`Document server version (according to the api): ${(await axios.get("http://localhost:4010/version")).data.version}`);
|
||||||
|
console.log("####### Running tests #######");
|
||||||
|
const contractResults = await testContracts(sizes);
|
||||||
|
const cardResults = await testCards(sizes);
|
||||||
|
const certificateResults = await testCertificates(sizes);
|
||||||
|
console.log("####### Results #######");
|
||||||
|
console.table(contractResults);
|
||||||
|
console.table(cardResults);
|
||||||
|
console.table(certificateResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
|
|
||||||
|
class Measurement {
|
||||||
|
public type: string;
|
||||||
|
public inputcount: number;
|
||||||
|
public responsetime: number;
|
||||||
|
|
||||||
|
constructor(type: string, input: number, time: number) {
|
||||||
|
this.type = type;
|
||||||
|
this.inputcount = input;
|
||||||
|
this.responsetime = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public toString(): string {
|
||||||
|
return `It took ${this.responsetime}ms to generate ${this.inputcount} pdfs for the type ${this.type}.`
|
||||||
|
}
|
||||||
|
}
|
19
tsconfig.json
Normal file
19
tsconfig.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2020",
|
||||||
|
"module": "commonjs",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"outDir": "./dist",
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"strict": false,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"sourceMap": false
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"node_modules",
|
||||||
|
]
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user