diff --git a/server/src/queries/asset.edit.repository.sql b/server/src/queries/asset.edit.repository.sql index d11bc7fe70..0cf62882db 100644 --- a/server/src/queries/asset.edit.repository.sql +++ b/server/src/queries/asset.edit.repository.sql @@ -15,3 +15,5 @@ from "asset_edit" where "assetId" = $1 +order by + "sequence" asc diff --git a/server/src/repositories/asset-edit.repository.ts b/server/src/repositories/asset-edit.repository.ts index fdfbc4e1d8..088cb1ccff 100644 --- a/server/src/repositories/asset-edit.repository.ts +++ b/server/src/repositories/asset-edit.repository.ts @@ -12,14 +12,14 @@ export class AssetEditRepository { @GenerateSql({ params: [DummyValue.UUID], }) - async replaceAll(assetId: string, edits: AssetEditActionItem[]): Promise { - return await this.db.transaction().execute(async (trx) => { + replaceAll(assetId: string, edits: AssetEditActionItem[]): Promise { + return this.db.transaction().execute(async (trx) => { await trx.deleteFrom('asset_edit').where('assetId', '=', assetId).execute(); if (edits.length > 0) { return trx .insertInto('asset_edit') - .values(edits.map((edit) => ({ assetId, ...edit }))) + .values(edits.map((edit, i) => ({ assetId, sequence: i, ...edit }))) .returning(['action', 'parameters']) .execute() as Promise; } @@ -31,11 +31,12 @@ export class AssetEditRepository { @GenerateSql({ params: [DummyValue.UUID], }) - async getAll(assetId: string): Promise { + getAll(assetId: string): Promise { return this.db .selectFrom('asset_edit') .select(['action', 'parameters']) .where('assetId', '=', assetId) + .orderBy('sequence', 'asc') .execute() as Promise; } } diff --git a/server/src/schema/migrations/1769105700133-AddAssetEditSequence.ts b/server/src/schema/migrations/1769105700133-AddAssetEditSequence.ts new file mode 100644 index 0000000000..40c1723cd6 --- /dev/null +++ b/server/src/schema/migrations/1769105700133-AddAssetEditSequence.ts @@ -0,0 +1,14 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + await sql`DELETE FROM "asset_edit";`.execute(db); + await sql`ALTER TABLE "asset_edit" ADD "sequence" integer NOT NULL;`.execute(db); + await sql`ALTER TABLE "asset_edit" ADD CONSTRAINT "asset_edit_assetId_sequence_uq" UNIQUE ("assetId", "sequence");`.execute( + db, + ); +} + +export async function down(db: Kysely): Promise { + await sql`ALTER TABLE "asset_edit" DROP CONSTRAINT "asset_edit_assetId_sequence_uq";`.execute(db); + await sql`ALTER TABLE "asset_edit" DROP COLUMN "sequence";`.execute(db); +} diff --git a/server/src/schema/tables/asset-edit.table.ts b/server/src/schema/tables/asset-edit.table.ts index ad0b443b69..886b62dc0b 100644 --- a/server/src/schema/tables/asset-edit.table.ts +++ b/server/src/schema/tables/asset-edit.table.ts @@ -9,6 +9,7 @@ import { Generated, PrimaryGeneratedColumn, Table, + Unique, } from 'src/sql-tools'; @Table('asset_edit') @@ -19,6 +20,7 @@ import { referencingOldTableAs: 'deleted_edit', when: 'pg_trigger_depth() = 0', }) +@Unique({ columns: ['assetId', 'sequence'] }) export class AssetEditTable { @PrimaryGeneratedColumn() id!: Generated; @@ -31,4 +33,7 @@ export class AssetEditTable { @Column({ type: 'jsonb' }) parameters!: AssetEditActionParameter[T]; + + @Column({ type: 'integer' }) + sequence!: number; }