feat: progressive Level-Kurve + atomarer /auth/progress-Vertrag

- levelForEp/levelInfo (Level 1 bei 20 EP statt fixer 500/Level), src/lib/leveling.js
- /auth/me liefert level + ep_into_level + ep_to_next_level
- /auth/progress liefert prev_level, streak_increased, daily_ep, daily_goal_ep, goal_just_reached
  (CTE fängt die Pre-Update-Werte, damit Level-Up/Streak-Up atomar erkennbar sind)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 21:43:36 +02:00
parent 806e25c3ff
commit bb863640c0
2 changed files with 65 additions and 14 deletions

30
src/lib/leveling.js Normal file
View File

@@ -0,0 +1,30 @@
// Progressive Level-Kurve — Single Source of Truth fürs Backend.
// Kumulative EP, die für Level n nötig sind: 5·n·(n+3).
// Level 1 → 20 EP, Level 2 → 50, Level 3 → 90, Level 4 → 140, Level 5 → 200 …
// Früh schnelle Level (erste Level fallen in der ersten Session), danach sanft steiler.
function epForLevel(level) {
if (level <= 0) return 0;
return 5 * level * (level + 3);
}
// Höchstes n mit 5n²+15n ≤ ep → n ≤ (15 + √(225 + 20·ep)) / 10
function levelForEp(ep) {
const e = Math.max(0, ep || 0);
return Math.floor((-15 + Math.sqrt(225 + 20 * e)) / 10);
}
// Level + Fortschritt innerhalb des Levels (für Momentum-Anzeige im Client).
function levelInfo(ep) {
const e = Math.max(0, ep || 0);
const level = levelForEp(e);
const base = epForLevel(level);
const next = epForLevel(level + 1);
return {
level,
ep_into_level: e - base,
ep_to_next_level: next - e,
ep_for_next_level: next - base,
};
}
module.exports = { epForLevel, levelForEp, levelInfo };