mirror of
https://github.com/immich-app/immich
synced 2025-11-07 17:27:20 +00:00
fix: tag clean up query and add tests (#22633)
* fix delete empty tags query * rewrite as a single statement * create tag service medium test * single tag exists, connected to one asset, and is not deleted * do not delete parent tag if children have an asset * hierarchical tag tests * fix query to match 3 test * remove transaction and format:fix * remove transaction and format:fix * simplify query, handle nested empty tag * unused helper --------- Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
This commit is contained in:
parent
74a9be4a0e
commit
9d639607c7
3 changed files with 171 additions and 17 deletions
|
|
@ -39,6 +39,7 @@ import { StorageRepository } from 'src/repositories/storage.repository';
|
|||
import { SyncCheckpointRepository } from 'src/repositories/sync-checkpoint.repository';
|
||||
import { SyncRepository } from 'src/repositories/sync.repository';
|
||||
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
|
||||
import { TagRepository } from 'src/repositories/tag.repository';
|
||||
import { TelemetryRepository } from 'src/repositories/telemetry.repository';
|
||||
import { UserRepository } from 'src/repositories/user.repository';
|
||||
import { VersionHistoryRepository } from 'src/repositories/version-history.repository';
|
||||
|
|
@ -52,6 +53,8 @@ import { MemoryTable } from 'src/schema/tables/memory.table';
|
|||
import { PersonTable } from 'src/schema/tables/person.table';
|
||||
import { SessionTable } from 'src/schema/tables/session.table';
|
||||
import { StackTable } from 'src/schema/tables/stack.table';
|
||||
import { TagAssetTable } from 'src/schema/tables/tag-asset.table';
|
||||
import { TagTable } from 'src/schema/tables/tag.table';
|
||||
import { UserTable } from 'src/schema/tables/user.table';
|
||||
import { BASE_SERVICE_DEPENDENCIES, BaseService } from 'src/services/base.service';
|
||||
import { SyncService } from 'src/services/sync.service';
|
||||
|
|
@ -240,6 +243,18 @@ export class MediumTestContext<S extends BaseService = BaseService> {
|
|||
user,
|
||||
};
|
||||
}
|
||||
|
||||
async newTagAsset(tagBulkAssets: { tagIds: string[]; assetIds: string[] }) {
|
||||
const tagsAssets: Insertable<TagAssetTable>[] = [];
|
||||
for (const tagsId of tagBulkAssets.tagIds) {
|
||||
for (const assetsId of tagBulkAssets.assetIds) {
|
||||
tagsAssets.push({ tagsId, assetsId });
|
||||
}
|
||||
}
|
||||
|
||||
const result = await this.get(TagRepository).upsertAssetIds(tagsAssets);
|
||||
return { tagsAssets, result };
|
||||
}
|
||||
}
|
||||
|
||||
export class SyncTestContext extends MediumTestContext<SyncService> {
|
||||
|
|
@ -318,6 +333,10 @@ const newRealRepository = <T>(key: ClassConstructor<T>, db: Kysely<DB>): T => {
|
|||
return new key(LoggingRepository.create());
|
||||
}
|
||||
|
||||
case TagRepository: {
|
||||
return new key(db, LoggingRepository.create());
|
||||
}
|
||||
|
||||
case LoggingRepository as unknown as ClassConstructor<LoggingRepository>: {
|
||||
return new key() as unknown as T;
|
||||
}
|
||||
|
|
@ -345,7 +364,8 @@ const newMockRepository = <T>(key: ClassConstructor<T>) => {
|
|||
case SyncCheckpointRepository:
|
||||
case SystemMetadataRepository:
|
||||
case UserRepository:
|
||||
case VersionHistoryRepository: {
|
||||
case VersionHistoryRepository:
|
||||
case TagRepository: {
|
||||
return automock(key);
|
||||
}
|
||||
|
||||
|
|
@ -567,6 +587,23 @@ const memoryInsert = (memory: Partial<Insertable<MemoryTable>> = {}) => {
|
|||
return { ...defaults, ...memory, id };
|
||||
};
|
||||
|
||||
const tagInsert = (tag: Partial<Insertable<TagTable>>) => {
|
||||
const id = tag.id || newUuid();
|
||||
|
||||
const defaults: Insertable<TagTable> = {
|
||||
id,
|
||||
userId: '',
|
||||
value: '',
|
||||
createdAt: newDate(),
|
||||
updatedAt: newDate(),
|
||||
color: '',
|
||||
parentId: null,
|
||||
updateId: newUuid(),
|
||||
};
|
||||
|
||||
return { ...defaults, ...tag, id };
|
||||
};
|
||||
|
||||
class CustomWritable extends Writable {
|
||||
private data = '';
|
||||
|
||||
|
|
@ -619,4 +656,5 @@ export const mediumFactory = {
|
|||
memoryInsert,
|
||||
loginDetails,
|
||||
loginResponse,
|
||||
tagInsert,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue