From 8f7dec8ba6b2f9bde01afd0a110596ebbd43e0ed Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Fri, 15 Aug 2025 19:20:48 +0100 Subject: Implement OIDC --- web/composables/fetch-favourites.ts | 2 +- web/composables/fetch-login.ts | 25 +++ web/composables/fetch-schedule.ts | 7 +- web/nuxt.config.ts | 2 +- web/pages/agenda.vue | 5 +- web/pages/login.vue | 193 ----------------------- web/pages/login/[[provider]].vue | 302 ++++++++++++++++++++++++++++++++++++ web/stores/login-options.ts | 22 +++ web/web.go | 16 +- 9 files changed, 366 insertions(+), 208 deletions(-) create mode 100644 web/composables/fetch-login.ts delete mode 100644 web/pages/login.vue create mode 100644 web/pages/login/[[provider]].vue create mode 100644 web/stores/login-options.ts (limited to 'web') diff --git a/web/composables/fetch-favourites.ts b/web/composables/fetch-favourites.ts index 97b443a..e586d5b 100644 --- a/web/composables/fetch-favourites.ts +++ b/web/composables/fetch-favourites.ts @@ -1,4 +1,4 @@ -export default function useFetchFavourites() { +export default function() { const favouritesStore = useFavouritesStore(); const errorStore = useErrorStore(); const config = useRuntimeConfig(); diff --git a/web/composables/fetch-login.ts b/web/composables/fetch-login.ts new file mode 100644 index 0000000..707a04f --- /dev/null +++ b/web/composables/fetch-login.ts @@ -0,0 +1,25 @@ +import { useLoginOptionsStore } from "~/stores/login-options"; + +export default function() { + const loginOptionsStore = useLoginOptionsStore(); + const errorStore = useErrorStore(); + const config = useRuntimeConfig(); + + loginOptionsStore.setStatus('pending') + + $fetch(config.public.baseURL + '/login', { + method: 'GET', + server: false, + lazy: true, + onResponse: ({ response }) => { + if (!response.ok) { + errorStore.setError(response._data.message || 'An unknown error occurred'); + } + + if (response._data) { + loginOptionsStore.setLoginOptions((response._data as any).data.options); + loginOptionsStore.setStatus('idle') + } + }, + }); +} \ No newline at end of file diff --git a/web/composables/fetch-schedule.ts b/web/composables/fetch-schedule.ts index c061d92..a0e6fec 100644 --- a/web/composables/fetch-schedule.ts +++ b/web/composables/fetch-schedule.ts @@ -1,4 +1,4 @@ -export default function useFetchFavourites() { +export default function() { const scheduleStore = useScheduleStore(); const errorStore = useErrorStore(); const config = useRuntimeConfig(); @@ -10,7 +10,7 @@ export default function useFetchFavourites() { onResponse: ({ response }) => { if (!response.ok) { if (response.status === 401) { - navigateTo({ name: 'login', state: { error: 'Sorry, your session has expired' } }); + navigateTo({ path: '/login', state: { error: 'Sorry, your session has expired' } }); } else { errorStore.setError(response._data.message || 'An unknown error occurred'); } @@ -18,9 +18,6 @@ export default function useFetchFavourites() { if (response._data) { scheduleStore.setSchedule((response._data as any).data.schedule); - errorStore.setError("Schedule set"); - } else { - errorStore.setError("Invalid response returned by server"); } }, }); diff --git a/web/nuxt.config.ts b/web/nuxt.config.ts index dc76af0..d5762e7 100644 --- a/web/nuxt.config.ts +++ b/web/nuxt.config.ts @@ -15,7 +15,7 @@ try { export default defineNuxtConfig({ compatibilityDate: "2024-11-01", devtools: { enabled: true }, - ssr: true, + ssr: false, css: ["~/assets/css/main.css"], runtimeConfig: { diff --git a/web/pages/agenda.vue b/web/pages/agenda.vue index 5e0c643..9b55c9b 100644 --- a/web/pages/agenda.vue +++ b/web/pages/agenda.vue @@ -14,9 +14,6 @@ const favouriteEvents = computed(() => { const calendarStatus = ref('pending' as 'pending' | 'idle'); const calendarLink = ref('') -const calendarLinkWithPageProtocol = computed(() => { - return window.location.protocol + '//' + calendarLink.value; -}); const refConfirmDeleteDialog = ref(); @@ -97,7 +94,7 @@ function deleteCalendar() {