Files
edueasy/app/api/pairing/route.ts
T

99 lines
2.8 KiB
TypeScript

import { NextResponse } from "next/server"
import { prisma } from "@/lib/db"
import { randomUUID } from "crypto"
export async function POST(request: Request) {
try {
const { deviceFingerprint, pairingCode, childId, action } = await request.json()
if (action === "generate") {
if (!childId) {
return NextResponse.json({ error: "childId required" }, { status: 400 })
}
const code = randomUUID().slice(0, 8).toUpperCase()
await prisma.pendingPairing.create({
data: {
code,
childId,
expiresAt: new Date(Date.now() + 10 * 60 * 1000),
},
})
return NextResponse.json({ pairingCode: code })
}
if (pairingCode) {
const pending = await prisma.pendingPairing.findUnique({
where: { code: pairingCode },
})
if (!pending || pending.expiresAt < new Date()) {
return NextResponse.json({ error: "Código inválido o expirado" }, { status: 404 })
}
const targetChildId = childId || pending.childId
if (!targetChildId) {
return NextResponse.json({ error: "Sin niño asociado" }, { status: 400 })
}
if (childId && !pending.childId) {
await prisma.pendingPairing.update({
where: { id: pending.id },
data: { childId },
})
}
const fp = deviceFingerprint || pending.deviceFingerprint
if (!fp) {
return NextResponse.json({ error: "Se requiere deviceFingerprint" }, { status: 400 })
}
const device = await prisma.device.create({
data: {
childId: targetChildId,
deviceFingerprint: fp,
role: "child",
},
include: { child: true },
})
await prisma.pendingPairing.delete({ where: { id: pending.id } })
return NextResponse.json({
success: true,
childId: device.childId,
childName: device.child.name,
})
}
if (deviceFingerprint) {
const existingDevice = await prisma.device.findFirst({
where: { deviceFingerprint },
})
if (existingDevice) {
return NextResponse.json({
paired: true,
childId: existingDevice.childId,
role: existingDevice.role,
})
}
const code = randomUUID().slice(0, 8).toUpperCase()
await prisma.pendingPairing.create({
data: {
code,
deviceFingerprint,
expiresAt: new Date(Date.now() + 10 * 60 * 1000),
},
})
return NextResponse.json({
paired: false,
pairingCode: code,
})
}
return NextResponse.json({ error: "Invalid request" }, { status: 400 })
} catch (error) {
console.error("Pairing error:", error)
return NextResponse.json({ error: "Internal error" }, { status: 500 })
}
}