fp/services/our/scripts/2025-08-12-migrate-from-v1.ts.prompt
2025-08-12 21:43:26 -08:00

269 lines
6.5 KiB
Plaintext

// 2025-08-12-migrate-from-futureporn.ts
//
// we are migrating from v1 futureporn.net (a strapi site) to v2 future.porn (a fastify site with prisma)
//
//
// the idea is to read a local backup of the strapi site from a .sql
// and use the data contained within to populate the database on the v2 site using prisma.
//
// here's the schema from the v1 site
```sql
CREATE TABLE "public"."b2_files" (
"id" SERIAL,
"url" VARCHAR(255) NULL,
"key" VARCHAR(255) NULL,
"upload_id" VARCHAR(255) NULL,
"created_at" TIMESTAMP NULL,
"updated_at" TIMESTAMP NULL,
"created_by_id" INTEGER NULL,
"updated_by_id" INTEGER NULL,
"cdn_url" VARCHAR(255) NULL,
CONSTRAINT "b2_files_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "public"."mux_assets" (
"id" SERIAL,
"playback_id" VARCHAR(255) NULL,
"asset_id" VARCHAR(255) NULL,
"created_at" TIMESTAMP NULL,
"updated_at" TIMESTAMP NULL,
"created_by_id" INTEGER NULL,
"updated_by_id" INTEGER NULL,
"deletion_queued_at" TIMESTAMP NULL,
CONSTRAINT "mux_assets_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "public"."vods" (
"id" SERIAL,
"video_src_hash" VARCHAR(255) NULL,
"video_720_hash" VARCHAR(255) NULL,
"video_480_hash" VARCHAR(255) NULL,
"video_360_hash" VARCHAR(255) NULL,
"video_240_hash" VARCHAR(255) NULL,
"thin_hash" VARCHAR(255) NULL,
"thicc_hash" VARCHAR(255) NULL,
"announce_title" VARCHAR(255) NULL,
"announce_url" VARCHAR(255) NULL,
"note" TEXT NULL,
"date" TIMESTAMP NULL,
"spoilers" TEXT NULL,
"created_at" TIMESTAMP NULL,
"updated_at" TIMESTAMP NULL,
"published_at" TIMESTAMP NULL,
"created_by_id" INTEGER NULL,
"updated_by_id" INTEGER NULL,
"title" VARCHAR(255) NULL,
"chat_log" TEXT NULL,
"date_2" VARCHAR(255) NULL,
"cuid" VARCHAR(255) NULL,
"archive_status" VARCHAR(255) NULL,
CONSTRAINT "vods_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "public"."vods_mux_asset_links" (
"id" SERIAL,
"vod_id" INTEGER NULL,
"mux_asset_id" INTEGER NULL,
CONSTRAINT "vods_mux_asset_links_pkey" PRIMARY KEY ("id"),
CONSTRAINT "vods_mux_asset_links_unique" UNIQUE ("vod_id", "mux_asset_id")
);
CREATE TABLE "public"."vods_thumbnail_links" (
"id" SERIAL,
"vod_id" INTEGER NULL,
"b_2_file_id" INTEGER NULL,
CONSTRAINT "vods_thumbnail_links_pkey" PRIMARY KEY ("id"),
CONSTRAINT "vods_thumbnail_links_unique" UNIQUE ("vod_id", "b_2_file_id")
);
CREATE TABLE "public"."vods_video_src_b_2_links" (
"id" SERIAL,
"vod_id" INTEGER NULL,
"b_2_file_id" INTEGER NULL,
CONSTRAINT "vods_video_src_b_2_links_pkey" PRIMARY KEY ("id"),
CONSTRAINT "vods_video_src_b_2_links_unique" UNIQUE ("vod_id", "b_2_file_id")
);
CREATE TABLE "public"."vods_vtuber_links" (
"id" SERIAL,
"vod_id" INTEGER NULL,
"vtuber_id" INTEGER NULL,
"vod_order" DOUBLE PRECISION NULL,
CONSTRAINT "vods_vtuber_links_pkey" PRIMARY KEY ("id"),
CONSTRAINT "vods_vtuber_links_unique" UNIQUE ("vod_id", "vtuber_id")
);
CREATE TABLE "public"."vtubers" (
"id" SERIAL,
"chaturbate" VARCHAR(255) NULL,
"twitter" VARCHAR(255) NULL,
"patreon" VARCHAR(255) NULL,
"twitch" VARCHAR(255) NULL,
"tiktok" VARCHAR(255) NULL,
"onlyfans" VARCHAR(255) NULL,
"youtube" VARCHAR(255) NULL,
"linktree" VARCHAR(255) NULL,
"carrd" VARCHAR(255) NULL,
"fansly" VARCHAR(255) NULL,
"pornhub" VARCHAR(255) NULL,
"discord" VARCHAR(255) NULL,
"reddit" VARCHAR(255) NULL,
"throne" VARCHAR(255) NULL,
"instagram" VARCHAR(255) NULL,
"facebook" VARCHAR(255) NULL,
"merch" VARCHAR(255) NULL,
"slug" VARCHAR(255) NULL,
"image" VARCHAR(255) NULL,
"display_name" VARCHAR(255) NULL,
"description_1" TEXT NULL,
"description_2" TEXT NULL,
"created_at" TIMESTAMP NULL,
"updated_at" TIMESTAMP NULL,
"published_at" TIMESTAMP NULL,
"created_by_id" INTEGER NULL,
"updated_by_id" INTEGER NULL,
"theme_color" VARCHAR(255) NULL,
"image_blur" VARCHAR(255) NULL,
CONSTRAINT "vtubers_pkey" PRIMARY KEY ("id")
);
```
// here's the schema from the v2 site
```prisma
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
binaryTargets = ["native", "debian-openssl-3.0.x"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(uuid())
patreonId String @unique
patreonFullName String?
imageUrl String?
roles Role[]
vods Vod[]
Vtuber Vtuber[]
}
enum RoleName {
user
supporterTier1
supporterTier2
supporterTier3
supporterTier4
supporterTier5
supporterTier6
moderator
admin
}
model Role {
id String @id @default(cuid(2))
name String @unique
users User[]
}
model RateLimiterFlexible {
key String @id
points Int
expire DateTime?
}
model Stream {
id String @id @default(cuid(2))
date DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
announcementUrl String?
vods Vod[]
@@map("stream_entity")
}
enum VodStatus {
ordering
pending
approved
rejected
processing
processed
}
model Vod {
id String @id @default(cuid(2))
streamId String?
stream Stream? @relation(fields: [streamId], references: [id])
uploaderId String // previously in Upload
uploader User @relation(fields: [uploaderId], references: [id])
streamDate DateTime
notes String?
segmentKeys Json?
sourceVideo String?
hlsPlaylist String?
thumbnail String?
asrVttKey String?
slvttSheetKeys Json?
slvttVTTKey String?
magnetLink String?
status VodStatus @default(pending)
sha256sum String?
cidv1 String?
funscript String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
vtubers Vtuber[]
}
model Vtuber {
id String @id @default(cuid(2))
image String?
slug String?
displayName String?
chaturbate String?
twitter String?
patreon String?
twitch String?
tiktok String?
onlyfans String?
youtube String?
linktree String?
carrd String?
fansly String?
pornhub String?
discord String?
reddit String?
throne String?
instagram String?
facebook String?
merch String?
description String?
themeColor String?
fanslyId String?
chaturbateId String?
twitterId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
vods Vod[]
uploaderId String
uploader User @relation(fields: [uploaderId], references: [id])
}
```