| |
| CREATE TABLE "User" ( |
| "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, |
| "email" TEXT NOT NULL, |
| "passwordHash" TEXT NOT NULL, |
| "role" TEXT NOT NULL DEFAULT 'user', |
| "isActive" BOOLEAN NOT NULL DEFAULT true, |
| "telegramChatId" TEXT, |
| "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| "updatedAt" DATETIME NOT NULL |
| ); |
|
|
| |
| CREATE TABLE "Market" ( |
| "id" TEXT NOT NULL PRIMARY KEY, |
| "question" TEXT NOT NULL, |
| "category" TEXT, |
| "countryCode" TEXT, |
| "yesPrice" REAL, |
| "noPrice" REAL, |
| "volumeEur" REAL, |
| "liquidityEur" REAL, |
| "status" TEXT NOT NULL DEFAULT 'active', |
| "closesAt" DATETIME, |
| "lastSynced" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP |
| ); |
|
|
| |
| CREATE TABLE "AISignal" ( |
| "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, |
| "marketId" TEXT NOT NULL, |
| "signal" TEXT NOT NULL, |
| "confidence" REAL NOT NULL, |
| "summary" TEXT, |
| "keyRisk" TEXT, |
| "newsCount" INTEGER NOT NULL DEFAULT 0, |
| "modelVersion" TEXT NOT NULL DEFAULT 'Qwen3-8B', |
| "generatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| CONSTRAINT "AISignal_marketId_fkey" FOREIGN KEY ("marketId") REFERENCES "Market" ("id") ON DELETE CASCADE ON UPDATE CASCADE |
| ); |
|
|
| |
| CREATE TABLE "Position" ( |
| "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, |
| "userId" INTEGER NOT NULL, |
| "marketId" TEXT NOT NULL, |
| "outcome" TEXT NOT NULL, |
| "amountEur" REAL NOT NULL, |
| "entryPrice" REAL NOT NULL, |
| "currentPrice" REAL, |
| "pnl" REAL NOT NULL DEFAULT 0, |
| "kellyFraction" REAL, |
| "status" TEXT NOT NULL DEFAULT 'open', |
| "openedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| "closedAt" DATETIME, |
| CONSTRAINT "Position_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE, |
| CONSTRAINT "Position_marketId_fkey" FOREIGN KEY ("marketId") REFERENCES "Market" ("id") ON DELETE CASCADE ON UPDATE CASCADE |
| ); |
|
|
| |
| CREATE TABLE "Watchlist" ( |
| "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, |
| "userId" INTEGER NOT NULL, |
| "marketId" TEXT NOT NULL, |
| "alertThreshold" REAL, |
| "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| CONSTRAINT "Watchlist_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE, |
| CONSTRAINT "Watchlist_marketId_fkey" FOREIGN KEY ("marketId") REFERENCES "Market" ("id") ON DELETE CASCADE ON UPDATE CASCADE |
| ); |
|
|
| |
| CREATE TABLE "Alert" ( |
| "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, |
| "userId" INTEGER NOT NULL, |
| "marketId" TEXT NOT NULL, |
| "type" TEXT NOT NULL, |
| "message" TEXT NOT NULL, |
| "sentAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| CONSTRAINT "Alert_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE, |
| CONSTRAINT "Alert_marketId_fkey" FOREIGN KEY ("marketId") REFERENCES "Market" ("id") ON DELETE CASCADE ON UPDATE CASCADE |
| ); |
|
|
| |
| CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); |
|
|
| |
| CREATE INDEX "AISignal_marketId_generatedAt_idx" ON "AISignal"("marketId", "generatedAt"); |
|
|
| |
| CREATE INDEX "Position_userId_status_idx" ON "Position"("userId", "status"); |
|
|
| |
| CREATE INDEX "Position_marketId_idx" ON "Position"("marketId"); |
|
|
| |
| CREATE INDEX "Watchlist_userId_idx" ON "Watchlist"("userId"); |
|
|
| |
| CREATE UNIQUE INDEX "Watchlist_userId_marketId_key" ON "Watchlist"("userId", "marketId"); |
|
|
| |
| CREATE INDEX "Alert_userId_sentAt_idx" ON "Alert"("userId", "sentAt"); |
|
|
| |
| CREATE INDEX "Alert_marketId_idx" ON "Alert"("marketId"); |
|
|