From 599da0e348d17b33b2158dea1f42866d41f450b6 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Thu, 7 Nov 2024 23:23:49 +1100 Subject: [PATCH] feat(invitations): completed admin UI, with minor changes to backend --- components/icons/SimpleAuthenticationLogo.vue | 11 + nuxt.config.ts | 5 + pages/admin/auth/index.vue | 128 +++++ pages/admin/auth/simple/index.vue | 508 ++++++++++++++++++ pages/register.vue | 2 +- .../api/v1/admin/auth/invitation/index.get.ts | 2 + server/api/v1/auth/signup/simple.get.ts | 2 + server/tasks/cleanup/invitations.ts | 20 + 8 files changed, 677 insertions(+), 1 deletion(-) create mode 100644 components/icons/SimpleAuthenticationLogo.vue create mode 100644 pages/admin/auth/index.vue create mode 100644 pages/admin/auth/simple/index.vue create mode 100644 server/tasks/cleanup/invitations.ts diff --git a/components/icons/SimpleAuthenticationLogo.vue b/components/icons/SimpleAuthenticationLogo.vue new file mode 100644 index 0000000..25c7f2e --- /dev/null +++ b/components/icons/SimpleAuthenticationLogo.vue @@ -0,0 +1,11 @@ + diff --git a/nuxt.config.ts b/nuxt.config.ts index b380415..5f28cc7 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -24,6 +24,11 @@ export default defineNuxtConfig({ nitro: { experimental: { websocket: true, + tasks: true, + }, + + scheduledTasks: { + "0 * * * *": ["cleanup:invitations"], }, }, diff --git a/pages/admin/auth/index.vue b/pages/admin/auth/index.vue new file mode 100644 index 0000000..e867279 --- /dev/null +++ b/pages/admin/auth/index.vue @@ -0,0 +1,128 @@ + + + diff --git a/pages/admin/auth/simple/index.vue b/pages/admin/auth/simple/index.vue new file mode 100644 index 0000000..d832b90 --- /dev/null +++ b/pages/admin/auth/simple/index.vue @@ -0,0 +1,508 @@ + + + diff --git a/pages/register.vue b/pages/register.vue index a5473fb..75bc264 100644 --- a/pages/register.vue +++ b/pages/register.vue @@ -202,7 +202,7 @@ const invitation = await useFetch( `/api/v1/auth/signup/simple?id=${encodeURIComponent(invitationId)}` ); -const email = ref(invitation.data.value?.username); +const email = ref(invitation.data.value?.email); const displayName = ref(""); const username = ref(invitation.data.value?.username); const password = ref(""); diff --git a/server/api/v1/admin/auth/invitation/index.get.ts b/server/api/v1/admin/auth/invitation/index.get.ts index 18fe930..0b7efb4 100644 --- a/server/api/v1/admin/auth/invitation/index.get.ts +++ b/server/api/v1/admin/auth/invitation/index.get.ts @@ -4,6 +4,8 @@ export default defineEventHandler(async (h3) => { const user = await h3.context.session.getAdminUser(h3); if (!user) throw createError({ statusCode: 403 }); + await runTask("cleanup:invitations"); + const invitations = await prisma.invitation.findMany({}); return invitations; }); diff --git a/server/api/v1/auth/signup/simple.get.ts b/server/api/v1/auth/signup/simple.get.ts index b9ac8db..82bff3a 100644 --- a/server/api/v1/auth/signup/simple.get.ts +++ b/server/api/v1/auth/signup/simple.get.ts @@ -9,6 +9,8 @@ export default defineEventHandler(async (h3) => { statusMessage: "id required in fetching invitation", }); + await runTask("cleanup:invitations"); + const invitation = await prisma.invitation.findUnique({ where: { id: id } }); if (!invitation) throw createError({ diff --git a/server/tasks/cleanup/invitations.ts b/server/tasks/cleanup/invitations.ts new file mode 100644 index 0000000..8e960cb --- /dev/null +++ b/server/tasks/cleanup/invitations.ts @@ -0,0 +1,20 @@ +import prisma from "~/server/internal/db/database"; + +export default defineTask({ + meta: { + name: "cleanup:invitations", + }, + async run({}) { + const now = new Date(); + + await prisma.invitation.deleteMany({ + where: { + expires: { + lt: now, + }, + }, + }); + + return { result: true }; + }, +});