From c4b5952788976cc50ac0281e8f1f21c3264ccbd1 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 17 Jan 2023 21:17:00 +0100 Subject: [PATCH] migrate galleries to notes/clips --- .../migration/1673892262930-remove-groups.js | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 packages/backend/migration/1673892262930-remove-groups.js diff --git a/packages/backend/migration/1673892262930-remove-groups.js b/packages/backend/migration/1673892262930-remove-groups.js new file mode 100644 index 000000000..9779dd6e0 --- /dev/null +++ b/packages/backend/migration/1673892262930-remove-groups.js @@ -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 '' || "gallery_post"."title" || E'\\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`); + } +}