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>
133 lines
4.0 KiB
SQL
133 lines
4.0 KiB
SQL
-- 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;
|