mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
fix(server): add ocr audit table to migration & fix queries
This commit is contained in:
+15
-15
@@ -438,21 +438,21 @@ export const columns = {
|
|||||||
'asset_exif.fps',
|
'asset_exif.fps',
|
||||||
],
|
],
|
||||||
syncAssetOcr: [
|
syncAssetOcr: [
|
||||||
'id',
|
'asset_ocr.id',
|
||||||
'assetId',
|
'asset_ocr.assetId',
|
||||||
'x1',
|
'asset_ocr.x1',
|
||||||
'y1',
|
'asset_ocr.y1',
|
||||||
'x2',
|
'asset_ocr.x2',
|
||||||
'y2',
|
'asset_ocr.y2',
|
||||||
'x3',
|
'asset_ocr.x3',
|
||||||
'y3',
|
'asset_ocr.y3',
|
||||||
'x4',
|
'asset_ocr.x4',
|
||||||
'y4',
|
'asset_ocr.y4',
|
||||||
'text',
|
'asset_ocr.text',
|
||||||
'boxScore',
|
'asset_ocr.boxScore',
|
||||||
'textScore',
|
'asset_ocr.textScore',
|
||||||
'updateId',
|
'asset_ocr.updateId',
|
||||||
'isVisible',
|
'asset_ocr.isVisible',
|
||||||
],
|
],
|
||||||
exif: [
|
exif: [
|
||||||
'asset_exif.assetId',
|
'asset_exif.assetId',
|
||||||
|
|||||||
@@ -779,7 +779,7 @@ class AssetOcrSync extends BaseSync {
|
|||||||
@GenerateSql({ params: [dummyQueryOptions, DummyValue.UUID], stream: true })
|
@GenerateSql({ params: [dummyQueryOptions, DummyValue.UUID], stream: true })
|
||||||
getDeletes(options: SyncQueryOptions, userId: string) {
|
getDeletes(options: SyncQueryOptions, userId: string) {
|
||||||
return this.auditQuery('asset_ocr_audit', options)
|
return this.auditQuery('asset_ocr_audit', options)
|
||||||
.select(['asset_ocr_audit.id', 'assetId', 'deletedAt'])
|
.select(['asset_ocr_audit.id', 'asset_ocr_audit.assetId', 'asset_ocr_audit.deletedAt'])
|
||||||
.leftJoin('asset', 'asset.id', 'asset_ocr_audit.assetId')
|
.leftJoin('asset', 'asset.id', 'asset_ocr_audit.assetId')
|
||||||
.where('asset.ownerId', '=', userId)
|
.where('asset.ownerId', '=', userId)
|
||||||
.stream();
|
.stream();
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ export class ImmichDatabase {
|
|||||||
AssetMetadataAuditTable,
|
AssetMetadataAuditTable,
|
||||||
AssetJobStatusTable,
|
AssetJobStatusTable,
|
||||||
AssetOcrTable,
|
AssetOcrTable,
|
||||||
|
AssetOcrAuditTable,
|
||||||
AssetTable,
|
AssetTable,
|
||||||
AssetFileTable,
|
AssetFileTable,
|
||||||
AuditTable,
|
AuditTable,
|
||||||
|
|||||||
+9
@@ -25,6 +25,14 @@ export async function up(db: Kysely<any>): Promise<void> {
|
|||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
END
|
END
|
||||||
$$;`.execute(db);
|
$$;`.execute(db);
|
||||||
|
await sql`CREATE TABLE "asset_ocr_audit" (
|
||||||
|
"id" uuid NOT NULL DEFAULT immich_uuid_v7(),
|
||||||
|
"assetId" uuid NOT NULL,
|
||||||
|
"deletedAt" timestamp with time zone NOT NULL DEFAULT clock_timestamp(),
|
||||||
|
CONSTRAINT "asset_ocr_audit_pkey" PRIMARY KEY ("id")
|
||||||
|
);`.execute(db);
|
||||||
|
await sql`CREATE INDEX "asset_ocr_audit_assetId_idx" ON "asset_ocr_audit" ("assetId");`.execute(db);
|
||||||
|
await sql`CREATE INDEX "asset_ocr_audit_deletedAt_idx" ON "asset_ocr_audit" ("deletedAt");`.execute(db);
|
||||||
await sql`ALTER TABLE "asset_ocr" ADD "updateId" uuid NOT NULL DEFAULT immich_uuid_v7();`.execute(db);
|
await sql`ALTER TABLE "asset_ocr" ADD "updateId" uuid NOT NULL DEFAULT immich_uuid_v7();`.execute(db);
|
||||||
await sql`CREATE INDEX "asset_ocr_updateId_idx" ON "asset_ocr" ("updateId");`.execute(db);
|
await sql`CREATE INDEX "asset_ocr_updateId_idx" ON "asset_ocr" ("updateId");`.execute(db);
|
||||||
await sql`CREATE OR REPLACE TRIGGER "asset_ocr_delete_audit"
|
await sql`CREATE OR REPLACE TRIGGER "asset_ocr_delete_audit"
|
||||||
@@ -56,6 +64,7 @@ AS $function$
|
|||||||
await sql`DROP TRIGGER "asset_ocr_delete_audit" ON "asset_ocr";`.execute(db);
|
await sql`DROP TRIGGER "asset_ocr_delete_audit" ON "asset_ocr";`.execute(db);
|
||||||
await sql`DROP INDEX "asset_ocr_updateId_idx";`.execute(db);
|
await sql`DROP INDEX "asset_ocr_updateId_idx";`.execute(db);
|
||||||
await sql`ALTER TABLE "asset_ocr" DROP COLUMN "updateId";`.execute(db);
|
await sql`ALTER TABLE "asset_ocr" DROP COLUMN "updateId";`.execute(db);
|
||||||
|
await sql`DROP TABLE "asset_ocr_audit";`.execute(db);
|
||||||
await sql`DROP FUNCTION asset_ocr_delete_audit;`.execute(db);
|
await sql`DROP FUNCTION asset_ocr_delete_audit;`.execute(db);
|
||||||
await sql`UPDATE "migration_overrides" SET "value" = '{"sql":"CREATE OR REPLACE FUNCTION asset_edit_delete()\\n RETURNS TRIGGER\\n LANGUAGE PLPGSQL\\n AS $$\\n BEGIN\\n UPDATE asset\\n SET \\"isEdited\\" = false\\n FROM deleted_edit\\n WHERE asset.id = deleted_edit.\\"assetId\\" AND asset.\\"isEdited\\" \\n AND NOT EXISTS (SELECT FROM asset_edit edit WHERE edit.\\"assetId\\" = asset.id);\\n RETURN NULL;\\n END\\n $$;","name":"asset_edit_delete","type":"function"}'::jsonb WHERE "name" = 'function_asset_edit_delete';`.execute(db);
|
await sql`UPDATE "migration_overrides" SET "value" = '{"sql":"CREATE OR REPLACE FUNCTION asset_edit_delete()\\n RETURNS TRIGGER\\n LANGUAGE PLPGSQL\\n AS $$\\n BEGIN\\n UPDATE asset\\n SET \\"isEdited\\" = false\\n FROM deleted_edit\\n WHERE asset.id = deleted_edit.\\"assetId\\" AND asset.\\"isEdited\\" \\n AND NOT EXISTS (SELECT FROM asset_edit edit WHERE edit.\\"assetId\\" = asset.id);\\n RETURN NULL;\\n END\\n $$;","name":"asset_edit_delete","type":"function"}'::jsonb WHERE "name" = 'function_asset_edit_delete';`.execute(db);
|
||||||
await sql`DELETE FROM "migration_overrides" WHERE "name" = 'function_asset_ocr_delete_audit';`.execute(db);
|
await sql`DELETE FROM "migration_overrides" WHERE "name" = 'function_asset_ocr_delete_audit';`.execute(db);
|
||||||
@@ -2,6 +2,7 @@ import { BadRequestException, ForbiddenException, Injectable } from '@nestjs/com
|
|||||||
import { Insertable } from 'kysely';
|
import { Insertable } from 'kysely';
|
||||||
import { DateTime, Duration } from 'luxon';
|
import { DateTime, Duration } from 'luxon';
|
||||||
import { Writable } from 'node:stream';
|
import { Writable } from 'node:stream';
|
||||||
|
import { ConnectableObservable } from 'rxjs';
|
||||||
import { AUDIT_LOG_MAX_DURATION } from 'src/constants';
|
import { AUDIT_LOG_MAX_DURATION } from 'src/constants';
|
||||||
import { OnJob } from 'src/decorators';
|
import { OnJob } from 'src/decorators';
|
||||||
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
|
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
@@ -81,6 +82,7 @@ export const SYNC_TYPES_ORDER = [
|
|||||||
SyncRequestType.AlbumToAssetsV1,
|
SyncRequestType.AlbumToAssetsV1,
|
||||||
SyncRequestType.AssetExifsV1,
|
SyncRequestType.AssetExifsV1,
|
||||||
SyncRequestType.AlbumAssetExifsV1,
|
SyncRequestType.AlbumAssetExifsV1,
|
||||||
|
SyncRequestType.AssetOcrV1,
|
||||||
SyncRequestType.PartnerAssetExifsV1,
|
SyncRequestType.PartnerAssetExifsV1,
|
||||||
SyncRequestType.MemoriesV1,
|
SyncRequestType.MemoriesV1,
|
||||||
SyncRequestType.MemoryToAssetsV1,
|
SyncRequestType.MemoryToAssetsV1,
|
||||||
|
|||||||
Reference in New Issue
Block a user