From 213065b86c2fa5edc68196eac34ca43ad7f466b2 Mon Sep 17 00:00:00 2001 From: Jonas Gerg Date: Thu, 30 Apr 2026 22:39:04 +0200 Subject: [PATCH] feat: implement unauthorized error handling and login popup --- package.json | 2 +- .../kotlin/de/walamana/plugins/Security.kt | 2 +- .../main/kotlin/de/walamana/views/PlanView.kt | 15 ++++++----- public/src/App.vue | 5 ++++ public/src/components/LoginPanel.vue | 15 ++++++++++- public/src/services/LoginService.ts | 9 +++++++ public/src/services/api.ts | 14 +++++++++-- public/src/views/PlanView.vue | 25 ++++++++++++++----- 8 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 public/src/services/LoginService.ts diff --git a/package.json b/package.json index 6258afb..311175d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,6 @@ "license": "ISC", "dependencies": { "dropzone-vue3": "^1.0.2", - "rxjs": "^7.8.1", + "rxjs": "^7.8.1" } } diff --git a/private/minis-backend/src/main/kotlin/de/walamana/plugins/Security.kt b/private/minis-backend/src/main/kotlin/de/walamana/plugins/Security.kt index df7d904..a92c6b8 100644 --- a/private/minis-backend/src/main/kotlin/de/walamana/plugins/Security.kt +++ b/private/minis-backend/src/main/kotlin/de/walamana/plugins/Security.kt @@ -59,7 +59,7 @@ fun Payload.mid() = getClaim("id").asInt() object Security { - fun DEFAULT_EXPIRY() = Date(System.currentTimeMillis() + 1000 * 60 * 60); + fun DEFAULT_EXPIRY() = Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 14); suspend fun authenticateUser(application: Application, username: String, password: String): Ministrant? { println("Username $username password $password") diff --git a/private/minis-backend/src/main/kotlin/de/walamana/views/PlanView.kt b/private/minis-backend/src/main/kotlin/de/walamana/views/PlanView.kt index adf463f..cede922 100644 --- a/private/minis-backend/src/main/kotlin/de/walamana/views/PlanView.kt +++ b/private/minis-backend/src/main/kotlin/de/walamana/views/PlanView.kt @@ -3,6 +3,7 @@ package de.walamana.views import de.walamana.models.GottesdienstGroup import de.walamana.models.GottesdienstGroupDao import de.walamana.models.GottesdienstGroups +import de.walamana.plugins.getJWTEnvironment import de.walamana.service.PlanDao import io.ktor.server.application.* import io.ktor.server.auth.* @@ -14,12 +15,14 @@ import io.ktor.server.util.* fun Route.configurePlanRoutes() { route("/plan") { - get { - val principal = call.principal() - val isAnonymous = principal == null - val id = call.parameters.getOrFail("id").toInt() - val plan = PlanDao.constructPlan(id, isAnonymous = isAnonymous); - call.respond(plan) + authenticate { + get { + val principal = call.principal() + val isAnonymous = principal == null + val id = call.parameters.getOrFail("id").toInt() + val plan = PlanDao.constructPlan(id, isAnonymous = isAnonymous); + call.respond(plan) + } } } route("/groups") { diff --git a/public/src/App.vue b/public/src/App.vue index 49326a3..f900d66 100644 --- a/public/src/App.vue +++ b/public/src/App.vue @@ -5,6 +5,7 @@ import LoginPanel from "@/components/LoginPanel.vue"; import {onMounted, ref} from "vue"; import {Auth} from "@/services/auth"; import DialogHost from "@/components/dialog/DialogHost.vue"; +import {LoginService} from "@/services/LoginService"; let showPopup = ref(false) let loggedIn = ref(false) @@ -25,6 +26,10 @@ onMounted(() => { Auth.checkForToken() }) +LoginService.subject.subscribe(() => { + showPopup.value = true +}) +