feat: bootstrap taller-turnos project

Estructura inicial con Next.js 14, PostgreSQL/Prisma 7, autenticación por
magic link (clientes) y JWT (admins), lógica de scheduling con 4 slots
paralelos y API routes completas para cliente y panel admin.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Beldor
2026-06-18 11:51:19 -03:00
parent 4fde77e3ed
commit 93ad1cb8c1
28 changed files with 2626 additions and 23 deletions
+43
View File
@@ -0,0 +1,43 @@
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { verificarSesion } from "@/lib/auth-admin";
export async function GET(req: NextRequest) {
const sesion = await verificarSesion("admin_session");
if (!sesion) return NextResponse.json({ error: "No autorizado" }, { status: 401 });
const { searchParams } = new URL(req.url);
const autoId = searchParams.get("autoId");
if (!autoId) return NextResponse.json({ error: "autoId requerido" }, { status: 400 });
const historial = await prisma.historialServicio.findMany({
where: { autoId },
include: { admin: { select: { nombre: true } }, tipoServicio: { select: { nombre: true } } },
orderBy: { fechaRealizado: "desc" },
});
return NextResponse.json(historial);
}
export async function POST(req: NextRequest) {
const sesion = await verificarSesion("admin_session");
if (!sesion) return NextResponse.json({ error: "No autorizado" }, { status: 401 });
const { autoId, tipoServicioId, descripcion, observaciones, fechaRealizado } = await req.json();
if (!autoId || !descripcion || !fechaRealizado)
return NextResponse.json({ error: "Datos incompletos" }, { status: 400 });
const registro = await prisma.historialServicio.create({
data: {
autoId,
adminId: sesion.sub,
tipoServicioId: tipoServicioId || null,
descripcion,
observaciones: observaciones || null,
fechaRealizado: new Date(fechaRealizado),
},
include: { admin: { select: { nombre: true } }, tipoServicio: { select: { nombre: true } } },
});
return NextResponse.json(registro, { status: 201 });
}