0
Fork 0
mirror of https://github.com/immich-app/immich.git synced 2024-12-31 00:43:56 -05:00

feat(server): validate rating (#12855)

* feat(server): validate exif rating tag

* fix(server): change allowed range for rating

* refactor: better readibility

* docs: comments

* remove log line
This commit is contained in:
Nuno Antunes 2024-09-23 08:50:18 +01:00 committed by GitHub
parent 147747de32
commit b1cdf73a24
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 37 additions and 1 deletions

View file

@ -1107,6 +1107,30 @@ describe(MetadataService.name, () => {
}),
);
});
it('should handle invalid rating value', async () => {
assetMock.getByIds.mockResolvedValue([assetStub.image]);
metadataMock.readTags.mockResolvedValue({ Rating: 6 });
await sut.handleMetadataExtraction({ id: assetStub.image.id });
expect(assetMock.upsertExif).toHaveBeenCalledWith(
expect.objectContaining({
rating: null,
}),
);
});
it('should handle valid rating value', async () => {
assetMock.getByIds.mockResolvedValue([assetStub.image]);
metadataMock.readTags.mockResolvedValue({ Rating: 5 });
await sut.handleMetadataExtraction({ id: assetStub.image.id });
expect(assetMock.upsertExif).toHaveBeenCalledWith(
expect.objectContaining({
rating: 5,
}),
);
});
});
describe('handleQueueSidecar', () => {

View file

@ -83,6 +83,18 @@ const validate = <T>(value: T): NonNullable<T> | null => {
return value ?? null;
};
const validateRange = (value: number | undefined, min: number, max: number): NonNullable<number> | null => {
// reutilizes the validate function
const val = validate(value);
// check if the value is within the range
if (val == null || val < min || val > max) {
return null;
}
return val;
};
@Injectable()
export class MetadataService {
private storageCore: StorageCore;
@ -261,7 +273,7 @@ export class MetadataService {
// comments
description: String(exifTags.ImageDescription || exifTags.Description || '').trim(),
profileDescription: exifTags.ProfileDescription || null,
rating: exifTags.Rating ?? null,
rating: validateRange(exifTags.Rating, 0, 5),
// grouping
livePhotoCID: (exifTags.ContentIdentifier || exifTags.MediaGroupUUID) ?? null,