✅ FASE 4 COMPLETADA: Pagos y Monetización con MercadoPago
Implementados 4 módulos con agent swarm: 1. MERCADOPAGO INTEGRADO - SDK oficial de MercadoPago - Crear preferencias de pago - Webhooks para notificaciones - Reembolsos y cancelaciones - Estados: PENDING, PROCESSING, COMPLETED, REFUNDED 2. SISTEMA DE BONOS Y PACKS - Pack 5, Pack 10, Pack Mensual - Compra online con MP - Uso FIFO automático - Control de expiración - Aplicación en reservas 3. SUSCRIPCIONES/MEMBRESÍAS - Planes: Básico, Premium, Anual VIP - Beneficios: descuentos, reservas gratis, prioridad - Cobro recurrente vía MP - Estados: ACTIVE, PAUSED, CANCELLED - Aplicación automática en reservas 4. CLASES CON PROFESORES - Registro de coaches con verificación - Tipos: Individual, Grupal, Clínica - Horarios y disponibilidad - Reservas con pago integrado - Sistema de reseñas Endpoints nuevos: - /payments/* - Pagos MercadoPago - /bonus-packs/*, /bonuses/* - Bonos - /subscription-plans/*, /subscriptions/* - Suscripciones - /coaches/* - Profesores - /classes/*, /class-enrollments/* - Clases Variables de entorno: - MERCADOPAGO_ACCESS_TOKEN - MERCADOPAGO_PUBLIC_KEY - MERCADOPAGO_WEBHOOK_SECRET Datos de prueba: - 3 Bonus Packs - 3 Planes de suscripción - 1 Coach verificado (admin) - 3 Clases disponibles
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "payments" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL,
|
||||
"referenceId" TEXT NOT NULL,
|
||||
"amount" INTEGER NOT NULL,
|
||||
"currency" TEXT NOT NULL DEFAULT 'ARS',
|
||||
"provider" TEXT NOT NULL DEFAULT 'MERCADOPAGO',
|
||||
"providerPaymentId" TEXT,
|
||||
"providerPreferenceId" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"paymentMethod" TEXT,
|
||||
"installments" INTEGER,
|
||||
"metadata" TEXT,
|
||||
"paidAt" DATETIME,
|
||||
"refundedAt" DATETIME,
|
||||
"refundAmount" INTEGER,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "payments_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "bonus_packs" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"name" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"numberOfBookings" INTEGER NOT NULL,
|
||||
"price" INTEGER NOT NULL,
|
||||
"validityDays" INTEGER NOT NULL,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_bonuses" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"bonusPackId" TEXT NOT NULL,
|
||||
"totalBookings" INTEGER NOT NULL,
|
||||
"usedBookings" INTEGER NOT NULL DEFAULT 0,
|
||||
"remainingBookings" INTEGER NOT NULL,
|
||||
"purchaseDate" DATETIME NOT NULL,
|
||||
"expirationDate" DATETIME NOT NULL,
|
||||
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
|
||||
"paymentId" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "user_bonuses_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "user_bonuses_bonusPackId_fkey" FOREIGN KEY ("bonusPackId") REFERENCES "bonus_packs" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "bonus_usages" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userBonusId" TEXT NOT NULL,
|
||||
"bookingId" TEXT NOT NULL,
|
||||
"usedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "bonus_usages_userBonusId_fkey" FOREIGN KEY ("userBonusId") REFERENCES "user_bonuses" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "bonus_usages_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "bookings" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "subscription_plans" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"name" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"type" TEXT NOT NULL,
|
||||
"price" INTEGER NOT NULL,
|
||||
"features" TEXT,
|
||||
"benefits" TEXT NOT NULL,
|
||||
"mercadoPagoPlanId" TEXT,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_subscriptions" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"planId" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"startDate" DATETIME,
|
||||
"endDate" DATETIME,
|
||||
"currentPeriodStart" DATETIME,
|
||||
"currentPeriodEnd" DATETIME,
|
||||
"cancelAtPeriodEnd" BOOLEAN NOT NULL DEFAULT false,
|
||||
"mercadoPagoSubscriptionId" TEXT,
|
||||
"paymentMethodId" TEXT,
|
||||
"lastPaymentDate" DATETIME,
|
||||
"nextPaymentDate" DATETIME,
|
||||
"freeBookingsUsed" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "user_subscriptions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "user_subscriptions_planId_fkey" FOREIGN KEY ("planId") REFERENCES "subscription_plans" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "payments_providerPreferenceId_key" ON "payments"("providerPreferenceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "payments_userId_idx" ON "payments"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "payments_status_idx" ON "payments"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "payments_type_referenceId_idx" ON "payments"("type", "referenceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "payments_providerPaymentId_idx" ON "payments"("providerPaymentId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "payments_providerPreferenceId_idx" ON "payments"("providerPreferenceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "payments_createdAt_idx" ON "payments"("createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "bonus_packs_isActive_idx" ON "bonus_packs"("isActive");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_bonuses_userId_idx" ON "user_bonuses"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_bonuses_status_idx" ON "user_bonuses"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_bonuses_expirationDate_idx" ON "user_bonuses"("expirationDate");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_bonuses_userId_status_idx" ON "user_bonuses"("userId", "status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "bonus_usages_userBonusId_idx" ON "bonus_usages"("userBonusId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "bonus_usages_usedAt_idx" ON "bonus_usages"("usedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "bonus_usages_bookingId_key" ON "bonus_usages"("bookingId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "subscription_plans_type_idx" ON "subscription_plans"("type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "subscription_plans_isActive_idx" ON "subscription_plans"("isActive");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_userId_idx" ON "user_subscriptions"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_planId_idx" ON "user_subscriptions"("planId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_status_idx" ON "user_subscriptions"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_mercadoPagoSubscriptionId_idx" ON "user_subscriptions"("mercadoPagoSubscriptionId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_subscriptions_userId_status_key" ON "user_subscriptions"("userId", "status");
|
||||
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- You are about to drop the `subscription_plans` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `user_subscriptions` table. If the table is not empty, all the data it contains will be lost.
|
||||
|
||||
*/
|
||||
-- DropTable
|
||||
PRAGMA foreign_keys=off;
|
||||
DROP TABLE "subscription_plans";
|
||||
PRAGMA foreign_keys=on;
|
||||
|
||||
-- DropTable
|
||||
PRAGMA foreign_keys=off;
|
||||
DROP TABLE "user_subscriptions";
|
||||
PRAGMA foreign_keys=on;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "coaches" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"bio" TEXT,
|
||||
"specialties" TEXT,
|
||||
"certifications" TEXT,
|
||||
"yearsExperience" INTEGER NOT NULL DEFAULT 0,
|
||||
"hourlyRate" INTEGER NOT NULL DEFAULT 0,
|
||||
"photoUrl" TEXT,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"isVerified" BOOLEAN NOT NULL DEFAULT false,
|
||||
"rating" REAL,
|
||||
"reviewCount" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "coaches_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "coach_availabilities" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"coachId" TEXT NOT NULL,
|
||||
"dayOfWeek" INTEGER NOT NULL,
|
||||
"startTime" TEXT NOT NULL,
|
||||
"endTime" TEXT NOT NULL,
|
||||
"isAvailable" BOOLEAN NOT NULL DEFAULT true,
|
||||
CONSTRAINT "coach_availabilities_coachId_fkey" FOREIGN KEY ("coachId") REFERENCES "coaches" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "classes" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"coachId" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"type" TEXT NOT NULL DEFAULT 'INDIVIDUAL',
|
||||
"maxStudents" INTEGER NOT NULL DEFAULT 1,
|
||||
"price" INTEGER NOT NULL DEFAULT 0,
|
||||
"duration" INTEGER NOT NULL DEFAULT 60,
|
||||
"levelRequired" TEXT,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "classes_coachId_fkey" FOREIGN KEY ("coachId") REFERENCES "coaches" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "class_bookings" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"classId" TEXT NOT NULL,
|
||||
"coachId" TEXT NOT NULL,
|
||||
"courtId" TEXT,
|
||||
"date" DATETIME NOT NULL,
|
||||
"startTime" TEXT NOT NULL,
|
||||
"students" TEXT NOT NULL DEFAULT '[]',
|
||||
"maxStudents" INTEGER NOT NULL DEFAULT 1,
|
||||
"enrolledStudents" INTEGER NOT NULL DEFAULT 0,
|
||||
"status" TEXT NOT NULL DEFAULT 'AVAILABLE',
|
||||
"price" INTEGER NOT NULL DEFAULT 0,
|
||||
"paymentId" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "class_bookings_classId_fkey" FOREIGN KEY ("classId") REFERENCES "classes" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "class_bookings_coachId_fkey" FOREIGN KEY ("coachId") REFERENCES "coaches" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT "class_bookings_courtId_fkey" FOREIGN KEY ("courtId") REFERENCES "courts" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "student_enrollments" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"classBookingId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"paymentId" TEXT,
|
||||
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"enrolledAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"cancelledAt" DATETIME,
|
||||
CONSTRAINT "student_enrollments_classBookingId_fkey" FOREIGN KEY ("classBookingId") REFERENCES "class_bookings" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "student_enrollments_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "coach_reviews" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"coachId" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"rating" INTEGER NOT NULL,
|
||||
"comment" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "coach_reviews_coachId_fkey" FOREIGN KEY ("coachId") REFERENCES "coaches" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "coach_reviews_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "coaches_userId_key" ON "coaches"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coaches_isActive_idx" ON "coaches"("isActive");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coaches_isVerified_idx" ON "coaches"("isVerified");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coaches_userId_idx" ON "coaches"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coach_availabilities_coachId_idx" ON "coach_availabilities"("coachId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coach_availabilities_coachId_dayOfWeek_idx" ON "coach_availabilities"("coachId", "dayOfWeek");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coach_availabilities_dayOfWeek_idx" ON "coach_availabilities"("dayOfWeek");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "classes_coachId_idx" ON "classes"("coachId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "classes_type_idx" ON "classes"("type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "classes_isActive_idx" ON "classes"("isActive");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "class_bookings_classId_idx" ON "class_bookings"("classId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "class_bookings_coachId_idx" ON "class_bookings"("coachId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "class_bookings_courtId_idx" ON "class_bookings"("courtId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "class_bookings_date_idx" ON "class_bookings"("date");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "class_bookings_status_idx" ON "class_bookings"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "student_enrollments_userId_idx" ON "student_enrollments"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "student_enrollments_status_idx" ON "student_enrollments"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "student_enrollments_classBookingId_idx" ON "student_enrollments"("classBookingId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "student_enrollments_classBookingId_userId_key" ON "student_enrollments"("classBookingId", "userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coach_reviews_coachId_idx" ON "coach_reviews"("coachId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coach_reviews_userId_idx" ON "coach_reviews"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "coach_reviews_rating_idx" ON "coach_reviews"("rating");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "coach_reviews_coachId_userId_key" ON "coach_reviews"("coachId", "userId");
|
||||
@@ -0,0 +1,57 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "subscription_plans" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"name" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"type" TEXT NOT NULL,
|
||||
"price" INTEGER NOT NULL,
|
||||
"features" TEXT,
|
||||
"benefits" TEXT NOT NULL,
|
||||
"mercadoPagoPlanId" TEXT,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "user_subscriptions" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"planId" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"startDate" DATETIME,
|
||||
"endDate" DATETIME,
|
||||
"currentPeriodStart" DATETIME,
|
||||
"currentPeriodEnd" DATETIME,
|
||||
"cancelAtPeriodEnd" BOOLEAN NOT NULL DEFAULT false,
|
||||
"mercadoPagoSubscriptionId" TEXT,
|
||||
"paymentMethodId" TEXT,
|
||||
"lastPaymentDate" DATETIME,
|
||||
"nextPaymentDate" DATETIME,
|
||||
"freeBookingsUsed" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "user_subscriptions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "user_subscriptions_planId_fkey" FOREIGN KEY ("planId") REFERENCES "subscription_plans" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "subscription_plans_type_idx" ON "subscription_plans"("type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "subscription_plans_isActive_idx" ON "subscription_plans"("isActive");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_userId_idx" ON "user_subscriptions"("userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_planId_idx" ON "user_subscriptions"("planId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_status_idx" ON "user_subscriptions"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "user_subscriptions_mercadoPagoSubscriptionId_idx" ON "user_subscriptions"("mercadoPagoSubscriptionId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "user_subscriptions_userId_status_key" ON "user_subscriptions"("userId", "status");
|
||||
Reference in New Issue
Block a user