// @ts-nocheck import { mutation, query } from "./_generated/server"; import { v } from "convex/values"; export const ensureAdminUser = mutation({ args: { email: v.string(), name: v.optional(v.string()), }, handler: async (ctx, args) => { const existing = await ctx.db .query("adminUsers") .withIndex("by_email", (q) => q.eq("email", args.email)) .unique(); const now = Date.now(); if (existing) { await ctx.db.patch(existing._id, { active: true, name: args.name ?? existing.name, updatedAt: now, lastLoginAt: now, }); return await ctx.db.get(existing._id); } const id = await ctx.db.insert("adminUsers", { email: args.email, name: args.name, role: "admin", active: true, createdAt: now, updatedAt: now, lastLoginAt: now, }); return await ctx.db.get(id); }, }); export const createSession = mutation({ args: { email: v.string(), tokenHash: v.string(), expiresAt: v.number(), }, handler: async (ctx, args) => { const user = await ctx.db .query("adminUsers") .withIndex("by_email", (q) => q.eq("email", args.email)) .unique(); if (!user) { throw new Error("Admin user not found"); } const id = await ctx.db.insert("adminSessions", { adminUserId: user._id, tokenHash: args.tokenHash, expiresAt: args.expiresAt, createdAt: Date.now(), }); return { sessionId: id, user }; }, }); export const destroySession = mutation({ args: { tokenHash: v.string(), }, handler: async (ctx, args) => { const session = await ctx.db .query("adminSessions") .withIndex("by_tokenHash", (q) => q.eq("tokenHash", args.tokenHash)) .unique(); if (session) { await ctx.db.delete(session._id); } return { success: true }; }, }); export const validateSession = query({ args: { tokenHash: v.string(), }, handler: async (ctx, args) => { const session = await ctx.db .query("adminSessions") .withIndex("by_tokenHash", (q) => q.eq("tokenHash", args.tokenHash)) .unique(); if (!session || session.expiresAt < Date.now()) { return null; } const user = await ctx.db.get(session.adminUserId); if (!user || !user.active) { return null; } return { user: { id: user._id, email: user.email, name: user.name, role: user.role, }, sessionId: session._id, expiresAt: session.expiresAt, }; }, });