fix(server): bulk edit rating (#21839)

This commit is contained in:
Jason Rasmussen 2025-09-15 23:50:27 -04:00 committed by GitHub
parent a7addfece8
commit 9e0553e0c4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 48 additions and 39 deletions

View file

@ -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,

View file

@ -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);
} }
} }