Skip to content
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,7 @@ yarn.lock
*.sw?
landing/*
.env
.pnpm-store/
.pnpm-store/
.seeded
*.md
/docs/*
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
-- CreateEnum
CREATE TYPE "BackupStatus" AS ENUM ('success', 'failed', 'running', 'pending');

-- CreateTable
CREATE TABLE "backup_schedules" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"schedule" TEXT NOT NULL,
"enabled" BOOLEAN NOT NULL DEFAULT true,
"lastRun" TIMESTAMP(3),
"nextRun" TIMESTAMP(3),
"status" "BackupStatus" NOT NULL DEFAULT 'pending',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "backup_schedules_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "backup_files" (
"id" TEXT NOT NULL,
"scheduleId" TEXT,
"filename" TEXT NOT NULL,
"filepath" TEXT NOT NULL,
"size" BIGINT NOT NULL,
"status" "BackupStatus" NOT NULL DEFAULT 'success',
"type" TEXT NOT NULL DEFAULT 'full',
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

CONSTRAINT "backup_files_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE INDEX "backup_files_scheduleId_idx" ON "backup_files"("scheduleId");

-- CreateIndex
CREATE INDEX "backup_files_createdAt_idx" ON "backup_files"("createdAt");

-- AddForeignKey
ALTER TABLE "backup_files" ADD CONSTRAINT "backup_files_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "backup_schedules"("id") ON DELETE SET NULL ON UPDATE CASCADE;
44 changes: 44 additions & 0 deletions apps/api/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -462,3 +462,47 @@ model PerformanceMetric {
@@index([domain, timestamp])
@@index([timestamp])
}

enum BackupStatus {
success
failed
running
pending
}

model BackupSchedule {
id String @id @default(cuid())
name String
schedule String // Cron expression
enabled Boolean @default(true)
lastRun DateTime?
nextRun DateTime?
status BackupStatus @default(pending)

backups BackupFile[]

createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

@@map("backup_schedules")
}

model BackupFile {
id String @id @default(cuid())
scheduleId String?
schedule BackupSchedule? @relation(fields: [scheduleId], references: [id], onDelete: SetNull)

filename String
filepath String
size BigInt // Size in bytes
status BackupStatus @default(success)
type String @default("full") // full, incremental, manual

metadata Json? // Additional metadata (domains count, rules count, etc.)

createdAt DateTime @default(now())

@@index([scheduleId])
@@index([createdAt])
@@map("backup_files")
}
Loading