diff --git a/web/astro.config.mjs b/web/astro.config.mjs index afa4e31..24cd6af 100644 --- a/web/astro.config.mjs +++ b/web/astro.config.mjs @@ -177,6 +177,12 @@ export default defineConfig({ url: true, optional: false, }), + LOGS_UI_URL: envField.string({ + context: 'server', + access: 'secret', + url: true, + optional: true, + }), RELEASE_NUMBER: envField.number({ context: 'server', diff --git a/web/src/pages/admin/index.astro b/web/src/pages/admin/index.astro index e7cebeb..8e7012d 100644 --- a/web/src/pages/admin/index.astro +++ b/web/src/pages/admin/index.astro @@ -1,6 +1,6 @@ --- import { Icon } from 'astro-icon/components' -import { DATABASE_UI_URL } from 'astro:env/server' +import { DATABASE_UI_URL, LOGS_UI_URL } from 'astro:env/server' import BaseLayout from '../../layouts/BaseLayout.astro' import { cn } from '../../lib/cn' @@ -81,6 +81,18 @@ const adminLinks: AdminLink[] = [ base: 'text-gray-300', }, }, + ...(LOGS_UI_URL + ? [ + { + icon: 'ri:menu-search-line', + title: 'Logs', + href: LOGS_UI_URL, + classNames: { + base: 'text-cyan-300', + }, + }, + ] + : []), ] --- @@ -93,25 +105,27 @@ const adminLinks: AdminLink[] = [ diff --git a/web/src/pages/admin/users/index.astro b/web/src/pages/admin/users/index.astro index eda4e3b..4d8d42f 100644 --- a/web/src/pages/admin/users/index.astro +++ b/web/src/pages/admin/users/index.astro @@ -19,7 +19,7 @@ import type { Prisma } from '@prisma/client' const { data: filters } = zodParseQueryParamsStoringErrors( { - 'sort-by': z.enum(['name', 'role', 'createdAt', 'karma']).default('createdAt'), + 'sort-by': z.enum(['name', 'role', 'lastLoginAt', 'karma', 'createdAt']).default('createdAt'), 'sort-order': z.enum(['asc', 'desc']).default('desc'), search: z.string().optional(), role: z.enum(['user', 'admin', 'moderator', 'verified', 'spammer']).optional(), @@ -29,7 +29,10 @@ const { data: filters } = zodParseQueryParamsStoringErrors( // Set up Prisma orderBy with correct typing const prismaOrderBy = - filters['sort-by'] === 'name' || filters['sort-by'] === 'createdAt' || filters['sort-by'] === 'karma' + filters['sort-by'] === 'name' || + filters['sort-by'] === 'createdAt' || + filters['sort-by'] === 'lastLoginAt' || + filters['sort-by'] === 'karma' ? { [filters['sort-by'] === 'karma' ? 'totalKarma' : filters['sort-by']]: filters['sort-order'] === 'asc' ? 'asc' : 'desc', @@ -86,6 +89,7 @@ const dbUsers = await prisma.user.findMany({ totalKarma: true, createdAt: true, updatedAt: true, + lastLoginAt: true, internalNotes: { select: { id: true, @@ -218,16 +222,29 @@ const makeSortUrl = (sortBy: NonNullable<(typeof filters)['sort-by']>) => {
Last login
++ { + formatDateShort(user.lastLoginAt, { + prefix: false, + hourPrecision: true, + caseType: 'sentence', + }) + } +
+