feat(db): Prisma-Datenmodell fuer Projekte, Notizen und Git-Verbindungen
Vier Tabellen in PostgreSQL: - Project: Stammdaten, Status, Prioritaet, Fortschritt, Tags, Akzentfarbe und die optionale Repo-Verknuepfung - Note: beliebig viele Notizen je Projekt, anpinnbar, Cascade-Delete - GitConnection: ein Eintrag je Git-System inkl. verschluesseltem Token - RepoSnapshot: zwischengespeicherter Repo-Stand, damit das Dashboard auch ohne Netz oder bei erreichtem Rate-Limit Daten zeigt ProjectStatus deckt den Lebenszyklus von der Idee bis zum Archiv ab. Branch-, Tag- und Commit-Listen liegen als JSONB, damit providerspezifische Felder nicht verloren gehen. Enthaelt die Initial-Migration (haendisch gepflegt, damit "prisma migrate deploy" im Container ohne Shadow-Datenbank durchlaeuft) und einen idempotenten Seed mit drei Beispielprojekten. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ProjectStatus" AS ENUM ('IDEA', 'OPEN', 'PLANNING', 'IN_DEVELOPMENT', 'DONE', 'ARCHIVED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "GitProvider" AS ENUM ('GITHUB', 'GITLAB', 'GITEA');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "GitConnection" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"provider" "GitProvider" NOT NULL,
|
||||
"baseUrl" TEXT NOT NULL,
|
||||
"username" TEXT,
|
||||
"tokenCipher" TEXT,
|
||||
"tokenHint" TEXT,
|
||||
"lastCheckedAt" TIMESTAMP(3),
|
||||
"lastCheckOk" BOOLEAN,
|
||||
"lastCheckMessage" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "GitConnection_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Project" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"slug" TEXT NOT NULL,
|
||||
"summary" TEXT,
|
||||
"description" TEXT,
|
||||
"status" "ProjectStatus" NOT NULL DEFAULT 'IDEA',
|
||||
"priority" INTEGER NOT NULL DEFAULT 2,
|
||||
"progress" INTEGER NOT NULL DEFAULT 0,
|
||||
"accent" TEXT NOT NULL DEFAULT 'violet',
|
||||
"tags" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
||||
"favorite" BOOLEAN NOT NULL DEFAULT false,
|
||||
"repoUrl" TEXT,
|
||||
"repoOwner" TEXT,
|
||||
"repoName" TEXT,
|
||||
"defaultBranch" TEXT,
|
||||
"connectionId" TEXT,
|
||||
"lastSyncedAt" TIMESTAMP(3),
|
||||
"syncError" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Note" (
|
||||
"id" TEXT NOT NULL,
|
||||
"projectId" TEXT NOT NULL,
|
||||
"title" TEXT,
|
||||
"content" TEXT NOT NULL,
|
||||
"pinned" BOOLEAN NOT NULL DEFAULT false,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Note_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "RepoSnapshot" (
|
||||
"id" TEXT NOT NULL,
|
||||
"projectId" TEXT NOT NULL,
|
||||
"fullName" TEXT,
|
||||
"description" TEXT,
|
||||
"defaultBranch" TEXT,
|
||||
"htmlUrl" TEXT,
|
||||
"visibility" TEXT,
|
||||
"stars" INTEGER NOT NULL DEFAULT 0,
|
||||
"forks" INTEGER NOT NULL DEFAULT 0,
|
||||
"openIssues" INTEGER NOT NULL DEFAULT 0,
|
||||
"openPullRequests" INTEGER NOT NULL DEFAULT 0,
|
||||
"sizeKb" INTEGER NOT NULL DEFAULT 0,
|
||||
"lastCommitSha" TEXT,
|
||||
"lastCommitMessage" TEXT,
|
||||
"lastCommitAuthor" TEXT,
|
||||
"lastCommitAt" TIMESTAMP(3),
|
||||
"latestTag" TEXT,
|
||||
"latestRelease" TEXT,
|
||||
"latestReleaseAt" TIMESTAMP(3),
|
||||
"branchCount" INTEGER NOT NULL DEFAULT 0,
|
||||
"tagCount" INTEGER NOT NULL DEFAULT 0,
|
||||
"branches" JSONB NOT NULL DEFAULT '[]',
|
||||
"tags" JSONB NOT NULL DEFAULT '[]',
|
||||
"commits" JSONB NOT NULL DEFAULT '[]',
|
||||
"releases" JSONB NOT NULL DEFAULT '[]',
|
||||
"languages" JSONB NOT NULL DEFAULT '{}',
|
||||
"pushedAt" TIMESTAMP(3),
|
||||
"fetchedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "RepoSnapshot_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "GitConnection_name_key" ON "GitConnection"("name");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "GitConnection_provider_idx" ON "GitConnection"("provider");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Project_slug_key" ON "Project"("slug");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Project_status_idx" ON "Project"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Project_connectionId_idx" ON "Project"("connectionId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Project_updatedAt_idx" ON "Project"("updatedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Note_projectId_idx" ON "Note"("projectId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Note_pinned_idx" ON "Note"("pinned");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "RepoSnapshot_projectId_key" ON "RepoSnapshot"("projectId");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Project" ADD CONSTRAINT "Project_connectionId_fkey" FOREIGN KEY ("connectionId") REFERENCES "GitConnection"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Note" ADD CONSTRAINT "Note_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "RepoSnapshot" ADD CONSTRAINT "RepoSnapshot_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
Reference in New Issue
Block a user