From faabda4446322ffd5d8f325a02acf2a63185842c Mon Sep 17 00:00:00 2001 From: Jonathan Jogenfors Date: Mon, 31 Mar 2025 16:16:30 +0200 Subject: [PATCH] fix(server): multiple exclusion patterns (#17221) --- e2e/src/api/specs/library.e2e-spec.ts | 79 ++++++++++++++++++++- server/src/repositories/asset.repository.ts | 2 +- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/e2e/src/api/specs/library.e2e-spec.ts b/e2e/src/api/specs/library.e2e-spec.ts index e08079ebf3e..59ff74cc430 100644 --- a/e2e/src/api/specs/library.e2e-spec.ts +++ b/e2e/src/api/specs/library.e2e-spec.ts @@ -329,7 +329,7 @@ describe('/libraries', () => { const library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId, importPaths: [`${testAssetDirInternal}/temp`], - exclusionPatterns: ['**/directoryA'], + exclusionPatterns: ['**/directoryA/**'], }); await utils.scan(admin.accessToken, library.id); @@ -337,7 +337,82 @@ describe('/libraries', () => { const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id }); expect(assets.count).toBe(1); - expect(assets.items[0].originalPath.includes('directoryB')); + + expect(assets.items).toEqual( + expect.arrayContaining([ + expect.objectContaining({ originalPath: expect.stringContaining('directoryB/assetB.png') }), + ]), + ); + }); + + it('should scan external library with multiple exclusion patterns', async () => { + const library = await utils.createLibrary(admin.accessToken, { + ownerId: admin.userId, + importPaths: [`${testAssetDirInternal}/temp`], + exclusionPatterns: ['**/directoryA/**', '**/directoryB/**'], + }); + + await utils.scan(admin.accessToken, library.id); + + const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id }); + + expect(assets.count).toBe(0); + + expect(assets.items).toEqual([]); + }); + + it('should remove assets covered by a new exclusion pattern', async () => { + const library = await utils.createLibrary(admin.accessToken, { + ownerId: admin.userId, + importPaths: [`${testAssetDirInternal}/temp`], + }); + + await utils.scan(admin.accessToken, library.id); + + { + const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id }); + + expect(assets.count).toBe(2); + + expect(assets.items).toEqual( + expect.arrayContaining([ + expect.objectContaining({ originalPath: expect.stringContaining('directoryA/assetA.png') }), + expect.objectContaining({ originalPath: expect.stringContaining('directoryB/assetB.png') }), + ]), + ); + } + + await utils.updateLibrary(admin.accessToken, library.id, { + exclusionPatterns: ['**/directoryA/**'], + }); + + await utils.scan(admin.accessToken, library.id); + + { + const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id }); + + expect(assets.count).toBe(1); + + expect(assets.items).toEqual( + expect.arrayContaining([ + expect.objectContaining({ originalPath: expect.stringContaining('directoryB/assetB.png') }), + ]), + ); + } + + await utils.updateLibrary(admin.accessToken, library.id, { + exclusionPatterns: ['**/directoryA/**', '**/directoryB/**'], + }); + + await utils.scan(admin.accessToken, library.id); + + { + const { assets } = await utils.searchAssets(admin.accessToken, { libraryId: library.id }); + + expect(assets.count).toBe(0); + + expect(assets.items).toEqual([]); + } }); it('should scan multiple import paths', async () => { diff --git a/server/src/repositories/asset.repository.ts b/server/src/repositories/asset.repository.ts index 9fd1ce6b842..35a5ab21a92 100644 --- a/server/src/repositories/asset.repository.ts +++ b/server/src/repositories/asset.repository.ts @@ -1053,7 +1053,7 @@ export class AssetRepository { .where((eb) => eb.or([ eb.not(eb.or(paths.map((path) => eb('originalPath', 'like', path)))), - eb('originalPath', 'like', exclusions.join('|')), + eb.or(exclusions.map((path) => eb('originalPath', 'like', path))), ]), ) .executeTakeFirstOrThrow();