- API REST completa con Node.js + Express + TypeScript - Autenticación JWT con roles (Player/Admin) - CRUD completo de canchas - Sistema de reservas con validaciones - Base de datos SQLite con Prisma ORM - Notificaciones por email (Nodemailer) - Seed de datos de prueba - Documentación de arquitectura Endpoints implementados: - Auth: register, login, refresh, me - Courts: CRUD + disponibilidad - Bookings: CRUD + confirmación/cancelación Credenciales de prueba: - admin@padel.com / admin123 - user@padel.com / user123
83 lines
2.7 KiB
SQL
83 lines
2.7 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"email" TEXT NOT NULL,
|
|
"password" TEXT NOT NULL,
|
|
"firstName" TEXT NOT NULL,
|
|
"lastName" TEXT NOT NULL,
|
|
"phone" TEXT,
|
|
"avatarUrl" TEXT,
|
|
"role" TEXT NOT NULL DEFAULT 'PLAYER',
|
|
"playerLevel" TEXT NOT NULL DEFAULT 'BEGINNER',
|
|
"handPreference" TEXT NOT NULL DEFAULT 'RIGHT',
|
|
"positionPreference" TEXT NOT NULL DEFAULT 'BOTH',
|
|
"bio" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"isVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"lastLogin" DATETIME,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "courts" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"type" TEXT NOT NULL DEFAULT 'PANORAMIC',
|
|
"isIndoor" BOOLEAN NOT NULL DEFAULT false,
|
|
"hasLighting" BOOLEAN NOT NULL DEFAULT true,
|
|
"hasParking" BOOLEAN NOT NULL DEFAULT false,
|
|
"pricePerHour" INTEGER NOT NULL DEFAULT 2000,
|
|
"imageUrl" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "court_schedules" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"dayOfWeek" INTEGER NOT NULL,
|
|
"openTime" TEXT NOT NULL,
|
|
"closeTime" TEXT NOT NULL,
|
|
"priceOverride" INTEGER,
|
|
"courtId" TEXT NOT NULL,
|
|
CONSTRAINT "court_schedules_courtId_fkey" FOREIGN KEY ("courtId") REFERENCES "courts" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "bookings" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"date" DATETIME NOT NULL,
|
|
"startTime" TEXT NOT NULL,
|
|
"endTime" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
"totalPrice" INTEGER NOT NULL,
|
|
"notes" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
"courtId" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "bookings_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
|
|
CONSTRAINT "bookings_courtId_fkey" FOREIGN KEY ("courtId") REFERENCES "courts" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "courts_name_key" ON "courts"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "court_schedules_courtId_dayOfWeek_key" ON "court_schedules"("courtId", "dayOfWeek");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "bookings_userId_idx" ON "bookings"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "bookings_courtId_idx" ON "bookings"("courtId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "bookings_date_idx" ON "bookings"("date");
|