forked from FoundKeyGang/FoundKey
migrate galleries to notes/clips
This commit is contained in:
parent
2bbb85b472
commit
c4b5952788
1 changed files with 65 additions and 0 deletions
65
packages/backend/migration/1673892262930-remove-groups.js
Normal file
65
packages/backend/migration/1673892262930-remove-groups.js
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
import { genId } from '../built/misc/gen-id.js';
|
||||||
|
|
||||||
|
export class removeGroups1673892262930 {
|
||||||
|
name = 'removeGroups1673892262930';
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
// migrate gallery posts into notes, keeping the ids
|
||||||
|
await queryRunner.query(`
|
||||||
|
INSERT INTO "note" (
|
||||||
|
"id", "createdAt", "text", "cw", "userId", "visibility", "fileIds", "attachedFileTypes", "tags"
|
||||||
|
)
|
||||||
|
WITH "file_types" ("id", "types") AS (
|
||||||
|
SELECT "gallery_post"."id", ARRAY_AGG("drive_file"."type")
|
||||||
|
FROM "gallery_post"
|
||||||
|
JOIN "drive_file" ON "drive_file"."id" = ANY("gallery_post"."fileIds")
|
||||||
|
GROUP BY "gallery_post"."id"
|
||||||
|
)
|
||||||
|
SELECT "gallery_post"."id", "gallery_post"."createdAt",
|
||||||
|
CASE
|
||||||
|
WHEN "gallery_post"."title" IS NULL THEN "gallery_post"."description"
|
||||||
|
ELSE '<b>' || "gallery_post"."title" || E'</b>\\n\\n' || "gallery_post"."description"
|
||||||
|
END,
|
||||||
|
CASE
|
||||||
|
WHEN "gallery_post"."isSensitive" THEN 'NSFW'
|
||||||
|
ELSE NULL
|
||||||
|
END,
|
||||||
|
"gallery_post"."userId", 'home', "gallery_post"."fileIds", "file_types"."types", "gallery_post"."tags"
|
||||||
|
FROM "gallery_post"
|
||||||
|
JOIN "file_types" ON "gallery_post"."id" = "file_types"."id"
|
||||||
|
`);
|
||||||
|
// make a clip for each users gallery
|
||||||
|
await queryRunner.query(`SELECT DISTINCT "userId" FROM "gallery_post"`).then(userIds =>
|
||||||
|
Promise.all(userIds.map(({ userId }) => {
|
||||||
|
const clipId = genId();
|
||||||
|
|
||||||
|
// generate the clip itself
|
||||||
|
return queryRunner.query(`INSERT INTO "clip" ("id", "createdAt", "userId", "name", "isPublic") VALUES ($1, now(), $2, 'Gallery', true)`, [clipId, userId])
|
||||||
|
// and add all the previous gallery posts to it
|
||||||
|
// to not have to use genId for each gallery post, we just prepend a zero, something that could never be generated by genId
|
||||||
|
.then(() => queryRunner.query(`INSERT INTO "clip_note" ("id", "noteId", "clipId") SELECT '0' || "id", "id", $1 FROM "gallery_post" WHERE "userId" = $2`, [clipId, userId]));
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
|
||||||
|
await queryRunner.query(`DROP TABLE "gallery_like"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "gallery_post"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
// can only restore the table structure
|
||||||
|
await queryRunner.query(`CREATE TABLE "gallery_post" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "title" character varying(256) NOT NULL, "description" character varying(2048), "userId" character varying(32) NOT NULL, "fileIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "isSensitive" boolean NOT NULL DEFAULT false, "likedCount" integer NOT NULL DEFAULT '0', "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_8e90d7b6015f2c4518881b14753" PRIMARY KEY ("id")); COMMENT ON COLUMN "gallery_post"."createdAt" IS 'The created date of the GalleryPost.'; COMMENT ON COLUMN "gallery_post"."updatedAt" IS 'The updated date of the GalleryPost.'; COMMENT ON COLUMN "gallery_post"."userId" IS 'The ID of author.'; COMMENT ON COLUMN "gallery_post"."isSensitive" IS 'Whether the post is sensitive.'`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8f1a239bd077c8864a20c62c2c" ON "gallery_post" ("createdAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f631d37835adb04792e361807c" ON "gallery_post" ("updatedAt") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_985b836dddd8615e432d7043dd" ON "gallery_post" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_3ca50563facd913c425e7a89ee" ON "gallery_post" ("fileIds") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f2d744d9a14d0dfb8b96cb7fc5" ON "gallery_post" ("isSensitive") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_1a165c68a49d08f11caffbd206" ON "gallery_post" ("likedCount") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_05cca34b985d1b8edc1d1e28df" ON "gallery_post" ("tags") `);
|
||||||
|
await queryRunner.query(`CREATE TABLE "gallery_like" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "postId" character varying(32) NOT NULL, CONSTRAINT "PK_853ab02be39b8de45cd720cc15f" PRIMARY KEY ("id"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_8fd5215095473061855ceb948c" ON "gallery_like" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_df1b5f4099e99fb0bc5eae53b6" ON "gallery_like" ("userId", "postId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "gallery_post" ADD CONSTRAINT "FK_985b836dddd8615e432d7043ddb" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "gallery_like" ADD CONSTRAINT "FK_8fd5215095473061855ceb948cf" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "gallery_like" ADD CONSTRAINT "FK_b1cb568bfe569e47b7051699fc8" FOREIGN KEY ("postId") REFERENCES "gallery_post"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue