From f30d671b0f33f6476da66c3bc9202689603914ee Mon Sep 17 00:00:00 2001 From: Remi <73385395+itsrubberduck@users.noreply.github.com> Date: Thu, 18 Sep 2025 23:28:02 +0200 Subject: [PATCH] Persist learn progress per user --- app/middleware/require-auth.ts | 21 ++++ app/pages/learn.vue | 197 ++++++++++++++++++++++----------- server/api/atc/say.post.ts | 7 +- server/api/learn/state.get.ts | 24 ++++ server/api/learn/state.put.ts | 110 ++++++++++++++++++ server/models/LearnProfile.ts | 34 ++++++ shared/learn/config.ts | 38 +++++++ 7 files changed, 365 insertions(+), 66 deletions(-) create mode 100644 app/middleware/require-auth.ts create mode 100644 server/api/learn/state.get.ts create mode 100644 server/api/learn/state.put.ts create mode 100644 server/models/LearnProfile.ts create mode 100644 shared/learn/config.ts diff --git a/app/middleware/require-auth.ts b/app/middleware/require-auth.ts new file mode 100644 index 0000000..0859a5e --- /dev/null +++ b/app/middleware/require-auth.ts @@ -0,0 +1,21 @@ +import { defineNuxtRouteMiddleware, navigateTo } from '#app' +import { useAuthStore } from '~/stores/auth' + +export default defineNuxtRouteMiddleware(async (to) => { + const auth = useAuthStore() + + if (!auth.accessToken) { + await auth.tryRefresh().catch(() => false) + } + + if (!auth.initialized) { + await auth.fetchUser().catch(() => null) + } else if (!auth.user) { + await auth.fetchUser().catch(() => null) + } + + if (!auth.user) { + const redirect = encodeURIComponent(to.fullPath || '/') + return navigateTo(`/login?redirect=${redirect}`) + } +}) diff --git a/app/pages/learn.vue b/app/pages/learn.vue index 2502c45..8c7359c 100644 --- a/app/pages/learn.vue +++ b/app/pages/learn.vue @@ -413,8 +413,12 @@