SPB Git
1.1 KB · 11 lines typescript
1import { and, eq, isNull, desc } from "drizzle-orm";2import { db, schema } from "@/db";3import { requireUser, jsonError } from "@/lib/auth/guard";4import { revokeSession, revokeOtherSessions } from "@/lib/auth/session";5export async function GET() {6  try { const s = await requireUser(); const rows = await db.select({ id: schema.sessions.id, ip: schema.sessions.ip, userAgent: schema.sessions.userAgent, createdAt: schema.sessions.createdAt, lastSeenAt: schema.sessions.lastSeenAt }).from(schema.sessions).where(and(eq(schema.sessions.userId, s.id), isNull(schema.sessions.revokedAt))).orderBy(desc(schema.sessions.lastSeenAt)); return Response.json(rows.map((r) => ({ ...r, current: r.id === s.sessionId }))); } catch (e) { return jsonError(e); }7}8export async function DELETE(req: Request) {9  try { const s = await requireUser(req); const { id, others } = await req.json(); if (others) await revokeOtherSessions(s.id, s.sessionId); else if (id && id !== s.sessionId) await revokeSession(String(id)); return Response.json({ ok: true }); } catch (e) { return jsonError(e); }10}11
Files · laptop-initial-20261102
Menu

Theme