mirror of
https://github.com/immich-app/immich
synced 2025-10-17 18:19:27 +00:00
fix(server): bulk edit rating (#21839)
This commit is contained in:
parent
a7addfece8
commit
9e0553e0c4
2 changed files with 48 additions and 39 deletions
|
|
@ -420,7 +420,7 @@ describe(AssetService.name, () => {
|
||||||
ids: ['asset-1'],
|
ids: ['asset-1'],
|
||||||
latitude: 0,
|
latitude: 0,
|
||||||
longitude: 0,
|
longitude: 0,
|
||||||
visibility: undefined,
|
visibility: AssetVisibility.Archive,
|
||||||
isFavorite: false,
|
isFavorite: false,
|
||||||
duplicateId: undefined,
|
duplicateId: undefined,
|
||||||
rating: undefined,
|
rating: undefined,
|
||||||
|
|
|
||||||
|
|
@ -115,23 +115,36 @@ export class AssetService extends BaseService {
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateAll(auth: AuthDto, dto: AssetBulkUpdateDto): Promise<void> {
|
async updateAll(auth: AuthDto, dto: AssetBulkUpdateDto): Promise<void> {
|
||||||
const { ids, description, dateTimeOriginal, dateTimeRelative, timeZone, latitude, longitude, ...options } = dto;
|
const {
|
||||||
|
ids,
|
||||||
|
isFavorite,
|
||||||
|
visibility,
|
||||||
|
dateTimeOriginal,
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
rating,
|
||||||
|
description,
|
||||||
|
duplicateId,
|
||||||
|
dateTimeRelative,
|
||||||
|
timeZone,
|
||||||
|
} = dto;
|
||||||
await this.requireAccess({ auth, permission: Permission.AssetUpdate, ids });
|
await this.requireAccess({ auth, permission: Permission.AssetUpdate, ids });
|
||||||
|
|
||||||
const staticValuesChanged =
|
const assetDto = { isFavorite, visibility, duplicateId };
|
||||||
description !== undefined || dateTimeOriginal !== undefined || latitude !== undefined || longitude !== undefined;
|
const exifDto = { latitude, longitude, rating, description, dateTimeOriginal };
|
||||||
|
|
||||||
if (staticValuesChanged) {
|
const isExifChanged = Object.values(exifDto).some((v) => v !== undefined);
|
||||||
await this.assetRepository.updateAllExif(ids, { description, dateTimeOriginal, latitude, longitude });
|
if (isExifChanged) {
|
||||||
|
await this.assetRepository.updateAllExif(ids, exifDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
const assets =
|
const assets =
|
||||||
(dateTimeRelative !== undefined && dateTimeRelative !== 0) || timeZone !== undefined
|
(dateTimeRelative !== undefined && dateTimeRelative !== 0) || timeZone !== undefined
|
||||||
? await this.assetRepository.updateDateTimeOriginal(ids, dateTimeRelative, timeZone)
|
? await this.assetRepository.updateDateTimeOriginal(ids, dateTimeRelative, timeZone)
|
||||||
: null;
|
: undefined;
|
||||||
|
|
||||||
const dateTimesWithTimezone =
|
const dateTimesWithTimezone = assets
|
||||||
assets?.map((asset) => {
|
? assets.map((asset) => {
|
||||||
const isoString = asset.dateTimeOriginal?.toISOString();
|
const isoString = asset.dateTimeOriginal?.toISOString();
|
||||||
let dateTime = isoString ? DateTime.fromISO(isoString) : null;
|
let dateTime = isoString ? DateTime.fromISO(isoString) : null;
|
||||||
|
|
||||||
|
|
@ -143,31 +156,27 @@ export class AssetService extends BaseService {
|
||||||
assetId: asset.assetId,
|
assetId: asset.assetId,
|
||||||
dateTimeOriginal: dateTime?.toISO() ?? null,
|
dateTimeOriginal: dateTime?.toISO() ?? null,
|
||||||
};
|
};
|
||||||
}) ?? null;
|
})
|
||||||
|
: ids.map((id) => ({ assetId: id, dateTimeOriginal }));
|
||||||
|
|
||||||
if (staticValuesChanged || dateTimesWithTimezone) {
|
if (dateTimesWithTimezone.length > 0) {
|
||||||
const entries: JobItem[] = (dateTimesWithTimezone ?? ids).map((entry: any) => ({
|
await this.jobRepository.queueAll(
|
||||||
|
dateTimesWithTimezone.map(({ assetId: id, dateTimeOriginal }) => ({
|
||||||
name: JobName.SidecarWrite,
|
name: JobName.SidecarWrite,
|
||||||
data: {
|
data: {
|
||||||
id: entry.assetId ?? entry,
|
...exifDto,
|
||||||
description,
|
id,
|
||||||
dateTimeOriginal: entry.dateTimeOriginal ?? dateTimeOriginal,
|
dateTimeOriginal: dateTimeOriginal ?? undefined,
|
||||||
latitude,
|
|
||||||
longitude,
|
|
||||||
},
|
},
|
||||||
}));
|
})),
|
||||||
await this.jobRepository.queueAll(entries);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
const isAssetChanged = Object.values(assetDto).some((v) => v !== undefined);
|
||||||
options.visibility !== undefined ||
|
if (isAssetChanged) {
|
||||||
options.isFavorite !== undefined ||
|
await this.assetRepository.updateAll(ids, assetDto);
|
||||||
options.duplicateId !== undefined ||
|
|
||||||
options.rating !== undefined
|
|
||||||
) {
|
|
||||||
await this.assetRepository.updateAll(ids, options);
|
|
||||||
|
|
||||||
if (options.visibility === AssetVisibility.Locked) {
|
if (visibility === AssetVisibility.Locked) {
|
||||||
await this.albumRepository.removeAssetsFromAll(ids);
|
await this.albumRepository.removeAssetsFromAll(ids);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue