mirror of
https://github.com/immich-app/immich
synced 2025-11-14 17:36:12 +00:00
feat: updateId uuidv7 column for all entities with updatedAt (#16353)
This commit is contained in:
parent
128d653fc6
commit
967c69317b
18 changed files with 222 additions and 4 deletions
134
server/src/migrations/1740586617223-AddUpdateIdColumns.ts
Normal file
134
server/src/migrations/1740586617223-AddUpdateIdColumns.ts
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||
|
||||
export class AddUpdateIdColumns1740586617223 implements MigrationInterface {
|
||||
name = 'AddUpdateIdColumns1740586617223'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
create or replace function immich_uuid_v7(p_timestamp timestamp with time zone default clock_timestamp())
|
||||
returns uuid
|
||||
as $$
|
||||
select encode(
|
||||
set_bit(
|
||||
set_bit(
|
||||
overlay(uuid_send(gen_random_uuid())
|
||||
placing substring(int8send(floor(extract(epoch from p_timestamp) * 1000)::bigint) from 3)
|
||||
from 1 for 6
|
||||
),
|
||||
52, 1
|
||||
),
|
||||
53, 1
|
||||
),
|
||||
'hex')::uuid;
|
||||
$$
|
||||
language SQL
|
||||
volatile;
|
||||
`)
|
||||
await queryRunner.query(`
|
||||
CREATE OR REPLACE FUNCTION updated_at() RETURNS TRIGGER
|
||||
LANGUAGE plpgsql
|
||||
as $$
|
||||
BEGIN
|
||||
return new;
|
||||
END;
|
||||
$$;
|
||||
`)
|
||||
await queryRunner.query(`ALTER TABLE "person" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "asset_files" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "libraries" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "tags" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "assets" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "users" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "albums" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "sessions" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "session_sync_checkpoints" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "partners" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "memories" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "api_keys" ADD "updateId" uuid`);
|
||||
await queryRunner.query(`ALTER TABLE "activity" ADD "updateId" uuid`);
|
||||
|
||||
await queryRunner.query(`UPDATE "person" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "asset_files" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "libraries" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "tags" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "assets" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "users" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "albums" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "sessions" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "session_sync_checkpoints" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "partners" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "memories" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "api_keys" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
await queryRunner.query(`UPDATE "activity" SET "updateId" = immich_uuid_v7("updatedAt")`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "person" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "asset_files" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "libraries" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "tags" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "assets" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "albums" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "session_sync_checkpoints" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "partners" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "memories" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "api_keys" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
await queryRunner.query(`ALTER TABLE "activity" ALTER COLUMN "updateId" SET NOT NULL, ALTER COLUMN "updateId" SET DEFAULT immich_uuid_v7()`);
|
||||
|
||||
await queryRunner.query(`CREATE INDEX "IDX_person_update_id" ON "person" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_asset_files_update_id" ON "asset_files" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_libraries_update_id" ON "libraries" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_tags_update_id" ON "tags" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_assets_update_id" ON "assets" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_users_update_id" ON "users" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_albums_update_id" ON "albums" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_sessions_update_id" ON "sessions" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_session_sync_checkpoints_update_id" ON "session_sync_checkpoints" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_partners_update_id" ON "partners" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_memories_update_id" ON "memories" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_api_keys_update_id" ON "api_keys" ("updateId")`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_activity_update_id" ON "activity" ("updateId")`);
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE OR REPLACE FUNCTION updated_at() RETURNS TRIGGER
|
||||
LANGUAGE plpgsql
|
||||
as $$
|
||||
DECLARE
|
||||
clock_timestamp TIMESTAMP := clock_timestamp();
|
||||
BEGIN
|
||||
new."updatedAt" = clock_timestamp;
|
||||
new."updateId" = immich_uuid_v7(clock_timestamp);
|
||||
return new;
|
||||
END;
|
||||
$$;
|
||||
`)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "activity" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "api_keys" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "memories" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "partners" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "session_sync_checkpoints" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "sessions" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "albums" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "assets" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "tags" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "libraries" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "asset_files" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`ALTER TABLE "person" DROP COLUMN "updateId"`);
|
||||
await queryRunner.query(`DROP FUNCTION immich_uuid_v7`);
|
||||
await queryRunner.query(`
|
||||
CREATE OR REPLACE FUNCTION updated_at() RETURNS TRIGGER
|
||||
LANGUAGE plpgsql
|
||||
as $$
|
||||
BEGIN
|
||||
new."updatedAt" = now();
|
||||
return new;
|
||||
END;
|
||||
$$;
|
||||
`)
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue