diff --git a/app/pages/admin/entities/new.vue b/app/pages/admin/entities/new.vue index 9ec2cae5..9104b695 100644 --- a/app/pages/admin/entities/new.vue +++ b/app/pages/admin/entities/new.vue @@ -7,7 +7,7 @@ useHead({ title: 'New entity - admin - Daniel Roe' }) type EntityValue = Omit async function save (value: EntityValue) { - await $fetch('/api/admin/entities', { method: 'POST', body: value }) + await authorisedApi('/api/admin/entities', { method: 'POST', body: value }) await navigateTo('/admin/entities') } diff --git a/app/pages/admin/invites/new.vue b/app/pages/admin/invites/new.vue index 775595d9..248bca61 100644 --- a/app/pages/admin/invites/new.vue +++ b/app/pages/admin/invites/new.vue @@ -9,7 +9,7 @@ interface InviteValue { } async function save (value: InviteValue) { - await $fetch('/api/admin/invites', { method: 'POST', body: value }) + await authorisedApi('/api/admin/invites', { method: 'POST', body: value }) await navigateTo('/admin/invites') } diff --git a/app/pages/admin/location.vue b/app/pages/admin/location.vue index b7852cd2..dd5c263a 100644 --- a/app/pages/admin/location.vue +++ b/app/pages/admin/location.vue @@ -16,7 +16,7 @@ interface LocationEntry { const { data, refresh, loading } = useAdminFetch('/api/admin/location') async function save (value: LocationValue) { - await $fetch('/api/admin/location', { + await authorisedApi('/api/admin/location', { method: 'PUT', body: value, }) diff --git a/app/pages/admin/projects/categories/new.vue b/app/pages/admin/projects/categories/new.vue index eaf283e5..b91f5110 100644 --- a/app/pages/admin/projects/categories/new.vue +++ b/app/pages/admin/projects/categories/new.vue @@ -7,7 +7,7 @@ useHead({ title: 'New project category - admin - Daniel Roe' }) type ProjectCategoryValue = Omit async function save (value: ProjectCategoryValue) { - await $fetch('/api/admin/project-categories', { method: 'POST', body: value }) + await authorisedApi('/api/admin/project-categories', { method: 'POST', body: value }) await navigateTo('/admin/projects') } diff --git a/app/pages/admin/projects/items/new.vue b/app/pages/admin/projects/items/new.vue index 39f02f01..e814a06d 100644 --- a/app/pages/admin/projects/items/new.vue +++ b/app/pages/admin/projects/items/new.vue @@ -7,7 +7,7 @@ useHead({ title: 'New project - admin - Daniel Roe' }) type ProjectValue = Omit async function save (value: ProjectValue) { - await $fetch('/api/admin/projects', { method: 'POST', body: value }) + await authorisedApi('/api/admin/projects', { method: 'POST', body: value }) await navigateTo('/admin/projects') } diff --git a/app/pages/admin/talk-groups/new.vue b/app/pages/admin/talk-groups/new.vue index 6ccad753..f1bbf511 100644 --- a/app/pages/admin/talk-groups/new.vue +++ b/app/pages/admin/talk-groups/new.vue @@ -7,7 +7,7 @@ useHead({ title: 'New talk group - admin - Daniel Roe' }) type TalkGroupValue = Omit async function save (value: TalkGroupValue) { - await $fetch('/api/admin/talk-groups', { method: 'POST', body: value }) + await authorisedApi('/api/admin/talk-groups', { method: 'POST', body: value }) await navigateTo('/admin/talks') } diff --git a/app/pages/admin/uses/categories/new.vue b/app/pages/admin/uses/categories/new.vue index 00119e2c..ec5857a9 100644 --- a/app/pages/admin/uses/categories/new.vue +++ b/app/pages/admin/uses/categories/new.vue @@ -7,7 +7,7 @@ useHead({ title: 'New uses category - admin - Daniel Roe' }) type UsesCategoryValue = Omit async function save (value: UsesCategoryValue) { - await $fetch('/api/admin/uses-categories', { method: 'POST', body: value }) + await authorisedApi('/api/admin/uses-categories', { method: 'POST', body: value }) await navigateTo('/admin/uses') } diff --git a/app/pages/admin/uses/items/new.vue b/app/pages/admin/uses/items/new.vue index f4db2d5f..3f53ebad 100644 --- a/app/pages/admin/uses/items/new.vue +++ b/app/pages/admin/uses/items/new.vue @@ -7,7 +7,7 @@ useHead({ title: 'New uses item - admin - Daniel Roe' }) type UsesItemValue = Omit async function save (value: UsesItemValue) { - await $fetch('/api/admin/uses-items', { method: 'POST', body: value }) + await authorisedApi('/api/admin/uses-items', { method: 'POST', body: value }) await navigateTo('/admin/uses') } diff --git a/app/plugins/unauthorised.client.ts b/app/plugins/unauthorised.client.ts deleted file mode 100644 index 44e0137f..00000000 --- a/app/plugins/unauthorised.client.ts +++ /dev/null @@ -1,16 +0,0 @@ -export default defineNuxtPlugin({ - enforce: 'pre', - setup () { - globalThis.$fetch = globalThis.$fetch.create({ - onResponseError ({ request, response }) { - if (!isUnauthorised(response)) return - - const url = typeof request === 'string' ? request : request instanceof Request ? request.url : String(request) - const path = new URL(url, window.location.origin).pathname - - if (path.startsWith('/api/admin/')) redirectToLogin() - else if (path.startsWith('/api/')) useNuxtApp().$auth?.logout() - }, - }) - }, -}) diff --git a/app/utils/unauthorised.ts b/app/utils/unauthorised.ts index 2215f0f6..faa30ee1 100644 --- a/app/utils/unauthorised.ts +++ b/app/utils/unauthorised.ts @@ -1,3 +1,5 @@ +import { $fetch } from 'ofetch' + /** * Sends the browser back through `/login` when the admin OAuth session is * gone, instead of leaving the page rendering empty state. A full page load @@ -14,3 +16,15 @@ export function isUnauthorised (error: unknown) { const code = statusCode ?? status return code === 401 || code === 403 } + +export const authorisedApi = $fetch.create({ + onResponseError ({ request, response }) { + if (!isUnauthorised(response)) return + + const url = typeof request === 'string' ? request : request instanceof Request ? request.url : String(request) + const path = new URL(url, window.location.origin).pathname + + if (path.startsWith('/api/admin/')) redirectToLogin() + else if (path.startsWith('/api/')) useNuxtApp().$auth?.logout() + }, +})