mirror of
https://github.com/immich-app/immich.git
synced 2024-11-24 08:52:28 +02:00
fix(server): remove offline assets from trash (#12199)
* use port not taken by immich-dev for e2e * remove offline files from trash
This commit is contained in:
parent
28bc7f318e
commit
39141d3f1c
@ -635,10 +635,11 @@ describe('/libraries', () => {
|
|||||||
it('should remove offline files', async () => {
|
it('should remove offline files', async () => {
|
||||||
const library = await utils.createLibrary(admin.accessToken, {
|
const library = await utils.createLibrary(admin.accessToken, {
|
||||||
ownerId: admin.userId,
|
ownerId: admin.userId,
|
||||||
importPaths: [`${testAssetDirInternal}/temp/offline2`],
|
importPaths: [`${testAssetDirInternal}/temp/offline`],
|
||||||
});
|
});
|
||||||
|
|
||||||
utils.createImageFile(`${testAssetDir}/temp/offline2/assetA.png`);
|
utils.createImageFile(`${testAssetDir}/temp/offline/online.png`);
|
||||||
|
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||||
|
|
||||||
await scan(admin.accessToken, library.id);
|
await scan(admin.accessToken, library.id);
|
||||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||||
@ -646,9 +647,9 @@ describe('/libraries', () => {
|
|||||||
const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, {
|
const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, {
|
||||||
libraryId: library.id,
|
libraryId: library.id,
|
||||||
});
|
});
|
||||||
expect(initialAssets.count).toBe(1);
|
expect(initialAssets.count).toBe(2);
|
||||||
|
|
||||||
utils.removeImageFile(`${testAssetDir}/temp/offline2/assetA.png`);
|
utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||||
|
|
||||||
await scan(admin.accessToken, library.id);
|
await scan(admin.accessToken, library.id);
|
||||||
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||||
@ -669,7 +670,54 @@ describe('/libraries', () => {
|
|||||||
|
|
||||||
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
|
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
|
||||||
|
|
||||||
expect(assets.count).toBe(0);
|
expect(assets.count).toBe(1);
|
||||||
|
|
||||||
|
utils.removeImageFile(`${testAssetDir}/temp/offline/online.png`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should remove offline files from trash', async () => {
|
||||||
|
const library = await utils.createLibrary(admin.accessToken, {
|
||||||
|
ownerId: admin.userId,
|
||||||
|
importPaths: [`${testAssetDirInternal}/temp/offline`],
|
||||||
|
});
|
||||||
|
|
||||||
|
utils.createImageFile(`${testAssetDir}/temp/offline/online.png`);
|
||||||
|
utils.createImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||||
|
|
||||||
|
await scan(admin.accessToken, library.id);
|
||||||
|
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||||
|
|
||||||
|
const { assets: initialAssets } = await utils.metadataSearch(admin.accessToken, {
|
||||||
|
libraryId: library.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(initialAssets.count).toBe(2);
|
||||||
|
utils.removeImageFile(`${testAssetDir}/temp/offline/offline.png`);
|
||||||
|
|
||||||
|
await scan(admin.accessToken, library.id);
|
||||||
|
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||||
|
|
||||||
|
const { assets: offlineAssets } = await utils.metadataSearch(admin.accessToken, {
|
||||||
|
libraryId: library.id,
|
||||||
|
isOffline: true,
|
||||||
|
});
|
||||||
|
expect(offlineAssets.count).toBe(1);
|
||||||
|
|
||||||
|
const { status } = await request(app)
|
||||||
|
.post(`/libraries/${library.id}/removeOffline`)
|
||||||
|
.set('Authorization', `Bearer ${admin.accessToken}`)
|
||||||
|
.send();
|
||||||
|
expect(status).toBe(204);
|
||||||
|
await utils.waitForQueueFinish(admin.accessToken, 'library');
|
||||||
|
await utils.waitForQueueFinish(admin.accessToken, 'backgroundTask');
|
||||||
|
|
||||||
|
const { assets } = await utils.metadataSearch(admin.accessToken, { libraryId: library.id });
|
||||||
|
|
||||||
|
expect(assets.count).toBe(1);
|
||||||
|
expect(assets.items[0].isOffline).toBe(false);
|
||||||
|
expect(assets.items[0].originalPath).toEqual(`${testAssetDirInternal}/temp/offline/online.png`);
|
||||||
|
|
||||||
|
utils.removeImageFile(`${testAssetDir}/temp/offline/online.png`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not remove online files', async () => {
|
it('should not remove online files', async () => {
|
||||||
|
@ -169,7 +169,12 @@ export interface IAssetRepository {
|
|||||||
order?: FindOptionsOrder<AssetEntity>,
|
order?: FindOptionsOrder<AssetEntity>,
|
||||||
): Promise<AssetEntity | null>;
|
): Promise<AssetEntity | null>;
|
||||||
getWithout(pagination: PaginationOptions, property: WithoutProperty): Paginated<AssetEntity>;
|
getWithout(pagination: PaginationOptions, property: WithoutProperty): Paginated<AssetEntity>;
|
||||||
getWith(pagination: PaginationOptions, property: WithProperty, libraryId?: string): Paginated<AssetEntity>;
|
getWith(
|
||||||
|
pagination: PaginationOptions,
|
||||||
|
property: WithProperty,
|
||||||
|
libraryId?: string,
|
||||||
|
withDeleted?: boolean,
|
||||||
|
): Paginated<AssetEntity>;
|
||||||
getRandom(userId: string, count: number): Promise<AssetEntity[]>;
|
getRandom(userId: string, count: number): Promise<AssetEntity[]>;
|
||||||
getFirstAssetForAlbumId(albumId: string): Promise<AssetEntity | null>;
|
getFirstAssetForAlbumId(albumId: string): Promise<AssetEntity | null>;
|
||||||
getLastUpdatedAssetForAlbumId(albumId: string): Promise<AssetEntity | null>;
|
getLastUpdatedAssetForAlbumId(albumId: string): Promise<AssetEntity | null>;
|
||||||
|
@ -527,7 +527,12 @@ export class AssetRepository implements IAssetRepository {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getWith(pagination: PaginationOptions, property: WithProperty, libraryId?: string): Paginated<AssetEntity> {
|
getWith(
|
||||||
|
pagination: PaginationOptions,
|
||||||
|
property: WithProperty,
|
||||||
|
libraryId?: string,
|
||||||
|
withDeleted = false,
|
||||||
|
): Paginated<AssetEntity> {
|
||||||
let where: FindOptionsWhere<AssetEntity> | FindOptionsWhere<AssetEntity>[] = {};
|
let where: FindOptionsWhere<AssetEntity> | FindOptionsWhere<AssetEntity>[] = {};
|
||||||
|
|
||||||
switch (property) {
|
switch (property) {
|
||||||
@ -557,6 +562,7 @@ export class AssetRepository implements IAssetRepository {
|
|||||||
|
|
||||||
return paginate(this.repository, pagination, {
|
return paginate(this.repository, pagination, {
|
||||||
where,
|
where,
|
||||||
|
withDeleted,
|
||||||
order: {
|
order: {
|
||||||
// Ensures correct order when paginating
|
// Ensures correct order when paginating
|
||||||
createdAt: 'ASC',
|
createdAt: 'ASC',
|
||||||
|
@ -581,7 +581,7 @@ export class LibraryService {
|
|||||||
this.logger.debug(`Removing offline assets for library ${job.id}`);
|
this.logger.debug(`Removing offline assets for library ${job.id}`);
|
||||||
|
|
||||||
const assetPagination = usePagination(JOBS_LIBRARY_PAGINATION_SIZE, (pagination) =>
|
const assetPagination = usePagination(JOBS_LIBRARY_PAGINATION_SIZE, (pagination) =>
|
||||||
this.assetRepository.getWith(pagination, WithProperty.IS_OFFLINE, job.id),
|
this.assetRepository.getWith(pagination, WithProperty.IS_OFFLINE, job.id, true),
|
||||||
);
|
);
|
||||||
|
|
||||||
let offlineAssets = 0;
|
let offlineAssets = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user