Add stale invite expiry action
All checks were successful
Template Compliance / compliance (push) Successful in 5s

This commit is contained in:
ToxicCrzay270
2026-06-11 22:54:14 +02:00
parent 928a3815ed
commit d5ab61c0c2
2 changed files with 21 additions and 1 deletions

View File

@@ -12,7 +12,7 @@ import { requireInitialSetup } from "@/lib/setup";
import { DataTable, EmptyState, MetricTile, PageHeader, Panel, StatusDot, Tabs } from "@/components/ui";
import { getAppSettings, type AppSettings } from "@/lib/settings";
import { updateInstanceSettings, updateSecuritySettings } from "@/lib/settings-actions";
import { banUser, createInstanceInvite, disableUser, enableUser, grantAdminRole, removeUserFriendships, revokeAdminRole, revokeInvite } from "@/lib/admin-actions";
import { banUser, createInstanceInvite, disableUser, enableUser, expireStaleInvites, grantAdminRole, removeUserFriendships, revokeAdminRole, revokeInvite } from "@/lib/admin-actions";
import { deleteRoom } from "@/lib/room-actions";
import { isInviteExpired } from "@/lib/invites";
@@ -340,6 +340,8 @@ function InvitesPanel({
}>;
rooms: Array<{ id: string; name: string; slug: string }>;
}) {
const expiredInviteCount = invites.filter((invite) => invite.status === "ACTIVE" && isInviteExpired(invite.expiresAt)).length;
return (
<div className="split-grid">
<Panel title="Create Invite" eyebrow="Access">
@@ -361,6 +363,11 @@ function InvitesPanel({
</form>
</Panel>
<Panel title="Invites" eyebrow={`${invites.length} recent`}>
{expiredInviteCount > 0 ? (
<form action={expireStaleInvites} className="inline-form">
<button className="button compact-button" type="submit">Mark {expiredInviteCount} expired</button>
</form>
) : null}
{invites.length === 0 ? (
<EmptyState title="No invites yet" description="Create an invite to allow registration or room access workflows." />
) : (

View File

@@ -125,6 +125,19 @@ export async function revokeInvite(formData: FormData) {
revalidateAdmin();
}
export async function expireStaleInvites() {
const admin = await requireAdmin();
const result = await prisma.invite.updateMany({
where: {
status: "ACTIVE",
expiresAt: { lt: new Date() }
},
data: { status: "EXPIRED" }
});
await audit(admin.id, "admin.invites.expire", { expiredInvites: result.count });
revalidateAdmin();
}
async function audit(actorId: string, action: string, metadata: Prisma.InputJsonObject) {
await prisma.auditEvent.create({ data: { actorId, action, metadata } });
}