WIP: Komoot import integration

Add Komoot API client, import logic, crypto helpers, integration routes,
DB schema changes, and i18n strings for the Komoot import feature.

Import processing runs as a durable pg-boss background job with retries
instead of blocking the HTTP request.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-04-13 20:10:00 +02:00
parent 32c5fbde8f
commit 5fd60ba07d
24 changed files with 982 additions and 51 deletions

View file

@ -34,6 +34,7 @@ services:
WAHOO_CLIENT_ID: ${WAHOO_CLIENT_ID:-}
WAHOO_CLIENT_SECRET: ${WAHOO_CLIENT_SECRET:-}
WAHOO_WEBHOOK_TOKEN: ${WAHOO_WEBHOOK_TOKEN:-}
INTEGRATION_SECRET: ${INTEGRATION_SECRET:-}
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:3000/api/health || exit 1"]
interval: 15s

View file

@ -12,9 +12,11 @@ DEPLOY_GHCR_TOKEN=ENC[AES256_GCM,data:cmyUDf24Mt5iS8rRwjpCMPfGBjKDXW4vXQjEqlO1KW
WAHOO_CLIENT_ID=ENC[AES256_GCM,data:RWyd1ocUcIeNk0vIqpb21IAJuIEc6M3g2IC8RmHeOozBpUWppOSB2ItLFg==,iv:CKKy/L9+VZSBEcPoOTEMZa6hWet0qA9kwD+byu2M3WE=,tag:3/qloZMHq3StT0KgtLgxvg==,type:str]
WAHOO_CLIENT_SECRET=ENC[AES256_GCM,data:1DGPQqjTZVoJmrgXcMav9y3NMe6+FPNvIqSYM1Q6cQDLLkrsGKzFLCYV6w==,iv:aHcjMvQaXln/5R30etnotdV1Yezpdlc2+bqpXT0ab2U=,tag:ZIzvRFecfU9XuetwCPrngQ==,type:str]
WAHOO_WEBHOOK_TOKEN=ENC[AES256_GCM,data:KQScuqVvDPMyv0rgUC0J225QH3VyL2i3R23PtiC9Ny2ceaD9,iv:jwFRtYLFqlEdbDaJ3WwD+puHMDUpv+8BWPpwnL6iDfQ=,tag:3CxS7Co3p5dfH1JQGpr8FQ==,type:str]
#ENC[AES256_GCM,data:LRTmhyVTtaW9Bu91y9NuDpfzzq5u1Bo=,iv:B6C1Bs7e+NlYRhKoo7NqobotOYbqFbyqQbMewxL7x2E=,tag:ELvgZywsgm3M1wogkKmoDg==,type:comment]
INTEGRATION_SECRET=ENC[AES256_GCM,data:21netnnucwUGnJV8HwOOEwEe8L0WCjVfqrOavxKhqUE3aaU/YC7htnkeTKUE9gcypym3Bhy8VpRswod5QgtGwg==,iv:WF31iJVFpc7qyB7gPqjhhnt1gI5MHl69BE6s6zqs4nw=,tag:Ffs8kYNk5sZNU2SS/lJAKA==,type:str]
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWblo1Rm9rUlFCQkVVRUVR\nSCtPR1kwMlFvRXplNmdxWVVSOEJzUVB3VlZBCk9Hb1FJSCs1R2llMkk4eGVydnlh\nUmJmU0Joa1pneEZSWFJ5L1VZRnNiZ0UKLS0tIG9aaUkzT0o5dERSekM0cjNxOXBM\nRVhnU1prNjFOa0RQdEVsSlB5QnZzMGcKFFPBeSgQozLR2zohwr/lYBRFzeAK8Hzd\nV635q8YQrXBt9ZUSYvy/b7Gse61+ynaqI7ukLfbc/cRNszQFSuMJyg==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_0__map_recipient=age1vukt8py0s2mm47fx6qh6vykckfkdqslf9w68ekytfzvc8xp7e3rqn6p64n
sops_lastmodified=2026-04-13T00:24:50Z
sops_mac=ENC[AES256_GCM,data:ZBfFnY6bO6lnZ3ktdfvuQ1qx+rt8w1aG7V5jCP6ary66ZVeXaQ3tsJaOf4X6iKWFEnlPeelgiUlR+rmg3LIJq5hF3oCjs9gmdp7k4rYNifc0J9fsmAGDZ54D7c0yIA612GU2Kqj4yLp94n5pGsmj0Vo1fb43Nwvkq8sBv61SJFQ=,iv:ScMUGHZ1JMm6mVtQ1IvZVHGB8JrCuu+ym9IfKKg8/ZQ=,tag:dexnswGG/sIpAWMySAFpNQ==,type:str]
sops_lastmodified=2026-04-13T08:37:13Z
sops_mac=ENC[AES256_GCM,data:R8li2YOW4GiZNfEvX5lzFTGHIJjTRMTUpy/8cHj1U3uJx4jPWeP+SGa09Yifbay6NqSQDGbj6xENNsrXRpPFy4v/0EyKJ8+Lx3PZCGdwjCA8rlVxIIX8lPaMd4+deG9YH0D/7QRZCTk7SMTiMnF5a3U78czmPzMrne757Ma2qB8=,iv:QBBan1uLW2LclRkFTiHwjDw+kGLD5S++pJKYe4PP3VU=,tag:fy9vOcpB/2MZGAdYrdphgg==,type:str]
sops_unencrypted_suffix=_unencrypted
sops_version=3.9.4
sops_version=3.12.2