feat: Initial Diabetix application commit
- Add authentication with NextAuth v5 (credentials + email verification) - Implement dashboard with glycemia tracking and AI analysis - Add PDF report generation for Premium users - Implement Stripe integration for Premium subscriptions - Add responsive UI with Tailwind CSS and shadcn components - Database schema with Prisma ORM and PostgreSQL support - Real-time glycemia visualization with Recharts - Mobile-optimized entry form - User profile management with medical information - Subscription lifecycle management (create, cancel, webhook) - Email notifications with Resend - Feature gates for Free vs Premium plans Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- The primary key for the `DailyAnalysis` table will be changed. If it partially fails, the table could be left without primary key constraint.
|
||||
- The primary key for the `Patient` table will be changed. If it partially fails, the table could be left without primary key constraint.
|
||||
- Added the required column `userId` to the `DailyAnalysis` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `userId` to the `Patient` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `userId` to the `Reading` table without a default value. This is not possible if the table is not empty.
|
||||
|
||||
*/
|
||||
-- CreateTable
|
||||
CREATE TABLE "User" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"email" TEXT NOT NULL,
|
||||
"emailVerified" DATETIME,
|
||||
"name" TEXT NOT NULL,
|
||||
"passwordHash" TEXT NOT NULL,
|
||||
"plan" TEXT NOT NULL DEFAULT 'FREE',
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "VerifyToken" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"token" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"expiresAt" DATETIME NOT NULL,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "VerifyToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- RedefineTables
|
||||
PRAGMA defer_foreign_keys=ON;
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE "new_DailyAnalysis" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"content" TEXT NOT NULL,
|
||||
"generatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "DailyAnalysis_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_DailyAnalysis" ("content", "generatedAt", "id") SELECT "content", "generatedAt", "id" FROM "DailyAnalysis";
|
||||
DROP TABLE "DailyAnalysis";
|
||||
ALTER TABLE "new_DailyAnalysis" RENAME TO "DailyAnalysis";
|
||||
CREATE UNIQUE INDEX "DailyAnalysis_userId_key" ON "DailyAnalysis"("userId");
|
||||
CREATE TABLE "new_Patient" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"userId" TEXT NOT NULL,
|
||||
"firstName" TEXT NOT NULL,
|
||||
"lastName" TEXT NOT NULL,
|
||||
"email" TEXT,
|
||||
"birthDate" DATETIME,
|
||||
"heightCm" INTEGER,
|
||||
"weightKg" REAL,
|
||||
"sex" TEXT,
|
||||
"diabetesType" TEXT,
|
||||
"treatment" TEXT,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "Patient_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_Patient" ("birthDate", "diabetesType", "email", "firstName", "heightCm", "id", "lastName", "sex", "treatment", "updatedAt", "weightKg") SELECT "birthDate", "diabetesType", "email", "firstName", "heightCm", "id", "lastName", "sex", "treatment", "updatedAt", "weightKg" FROM "Patient";
|
||||
DROP TABLE "Patient";
|
||||
ALTER TABLE "new_Patient" RENAME TO "Patient";
|
||||
CREATE UNIQUE INDEX "Patient_userId_key" ON "Patient"("userId");
|
||||
CREATE TABLE "new_Reading" (
|
||||
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"userId" TEXT NOT NULL,
|
||||
"measuredAt" DATETIME NOT NULL,
|
||||
"moment" TEXT NOT NULL,
|
||||
"value" REAL NOT NULL,
|
||||
"notes" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "Reading_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
INSERT INTO "new_Reading" ("createdAt", "id", "measuredAt", "moment", "notes", "value") SELECT "createdAt", "id", "measuredAt", "moment", "notes", "value" FROM "Reading";
|
||||
DROP TABLE "Reading";
|
||||
ALTER TABLE "new_Reading" RENAME TO "Reading";
|
||||
CREATE INDEX "Reading_userId_measuredAt_idx" ON "Reading"("userId", "measuredAt");
|
||||
PRAGMA foreign_keys=ON;
|
||||
PRAGMA defer_foreign_keys=OFF;
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "VerifyToken_token_key" ON "VerifyToken"("token");
|
||||
Reference in New Issue
Block a user