From e4398caebe5d2d44ee53a1ac9879721bde919832 Mon Sep 17 00:00:00 2001 From: xCyanGrizzly Date: Wed, 25 Mar 2026 22:21:52 +0100 Subject: [PATCH] feat: add PackageGroup schema for album-based file grouping Co-Authored-By: Claude Opus 4.6 (1M context) --- .../migration.sql | 30 +++++++++++++++++++ prisma/schema.prisma | 21 +++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 prisma/migrations/20260325212128_add_package_groups/migration.sql diff --git a/prisma/migrations/20260325212128_add_package_groups/migration.sql b/prisma/migrations/20260325212128_add_package_groups/migration.sql new file mode 100644 index 0000000..47166b6 --- /dev/null +++ b/prisma/migrations/20260325212128_add_package_groups/migration.sql @@ -0,0 +1,30 @@ +-- AlterTable +ALTER TABLE "packages" ADD COLUMN "packageGroupId" TEXT; + +-- CreateTable +CREATE TABLE "package_groups" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "mediaAlbumId" TEXT, + "sourceChannelId" TEXT NOT NULL, + "previewData" BYTEA, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "package_groups_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "package_groups_sourceChannelId_idx" ON "package_groups"("sourceChannelId"); + +-- CreateIndex +CREATE UNIQUE INDEX "package_groups_mediaAlbumId_sourceChannelId_key" ON "package_groups"("mediaAlbumId", "sourceChannelId"); + +-- CreateIndex +CREATE INDEX "packages_packageGroupId_idx" ON "packages"("packageGroupId"); + +-- AddForeignKey +ALTER TABLE "packages" ADD CONSTRAINT "packages_packageGroupId_fkey" FOREIGN KEY ("packageGroupId") REFERENCES "package_groups"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "package_groups" ADD CONSTRAINT "package_groups_sourceChannelId_fkey" FOREIGN KEY ("sourceChannelId") REFERENCES "telegram_channels"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8443799..fb6a8b2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -432,6 +432,7 @@ model TelegramChannel { accountMaps AccountChannelMap[] packages Package[] skippedPackages SkippedPackage[] + packageGroups PackageGroup[] @@index([type, isActive]) @@index([category]) @@ -474,10 +475,12 @@ model Package { tags String[] @default([]) previewData Bytes? // JPEG thumbnail from nearby Telegram photo (stored as raw bytes) previewMsgId BigInt? // Telegram message ID of the matched photo + packageGroupId String? indexedAt DateTime @default(now()) createdAt DateTime @default(now()) sourceChannel TelegramChannel @relation(fields: [sourceChannelId], references: [id]) + packageGroup PackageGroup? @relation(fields: [packageGroupId], references: [id], onDelete: SetNull) files PackageFile[] ingestionRun IngestionRun? @relation(fields: [ingestionRunId], references: [id]) ingestionRunId String? @@ -491,6 +494,7 @@ model Package { @@index([indexedAt]) @@index([archiveType]) @@index([creator]) + @@index([packageGroupId]) @@map("packages") } @@ -512,6 +516,23 @@ model PackageFile { @@map("package_files") } +model PackageGroup { + id String @id @default(cuid()) + name String + mediaAlbumId String? + sourceChannelId String + previewData Bytes? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + packages Package[] + sourceChannel TelegramChannel @relation(fields: [sourceChannelId], references: [id], onDelete: Cascade) + + @@unique([mediaAlbumId, sourceChannelId]) + @@index([sourceChannelId]) + @@map("package_groups") +} + model IngestionRun { id String @id @default(cuid()) accountId String