mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 10:37:11 -04:00 
			
		
		
		
	fix(server): Allow negative rating (for rejected images) (#15699)
Allow negative rating (for rejected images)
This commit is contained in:
		
							parent
							
								
									f44669447f
								
							
						
					
					
						commit
						fe1e09e51f
					
				| @ -701,6 +701,20 @@ describe('/asset', () => { | |||||||
|       expect(status).toEqual(200); |       expect(status).toEqual(200); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     it('should set the negative rating', async () => { | ||||||
|  |       const { status, body } = await request(app) | ||||||
|  |         .put(`/assets/${user1Assets[0].id}`) | ||||||
|  |         .set('Authorization', `Bearer ${user1.accessToken}`) | ||||||
|  |         .send({ rating: -1 }); | ||||||
|  |       expect(body).toMatchObject({ | ||||||
|  |         id: user1Assets[0].id, | ||||||
|  |         exifInfo: expect.objectContaining({ | ||||||
|  |           rating: -1, | ||||||
|  |         }), | ||||||
|  |       }); | ||||||
|  |       expect(status).toEqual(200); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|     it('should reject invalid rating', async () => { |     it('should reject invalid rating', async () => { | ||||||
|       for (const test of [{ rating: 7 }, { rating: 3.5 }, { rating: null }]) { |       for (const test of [{ rating: 7 }, { rating: 3.5 }, { rating: null }]) { | ||||||
|         const { status, body } = await request(app) |         const { status, body } = await request(app) | ||||||
|  | |||||||
| @ -67,7 +67,7 @@ class AssetBulkUpdateDto { | |||||||
|   /// |   /// | ||||||
|   num? longitude; |   num? longitude; | ||||||
| 
 | 
 | ||||||
|   /// Minimum value: 0 |   /// Minimum value: -1 | ||||||
|   /// Maximum value: 5 |   /// Maximum value: 5 | ||||||
|   /// |   /// | ||||||
|   /// Please note: This property should have been non-nullable! Since the specification file |   /// Please note: This property should have been non-nullable! Since the specification file | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								mobile/openapi/lib/model/update_asset_dto.dart
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								mobile/openapi/lib/model/update_asset_dto.dart
									
									
									
										generated
									
									
									
								
							| @ -73,7 +73,7 @@ class UpdateAssetDto { | |||||||
|   /// |   /// | ||||||
|   num? longitude; |   num? longitude; | ||||||
| 
 | 
 | ||||||
|   /// Minimum value: 0 |   /// Minimum value: -1 | ||||||
|   /// Maximum value: 5 |   /// Maximum value: 5 | ||||||
|   /// |   /// | ||||||
|   /// Please note: This property should have been non-nullable! Since the specification file |   /// Please note: This property should have been non-nullable! Since the specification file | ||||||
|  | |||||||
| @ -7951,7 +7951,7 @@ | |||||||
|           }, |           }, | ||||||
|           "rating": { |           "rating": { | ||||||
|             "maximum": 5, |             "maximum": 5, | ||||||
|             "minimum": 0, |             "minimum": -1, | ||||||
|             "type": "number" |             "type": "number" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
| @ -12780,7 +12780,7 @@ | |||||||
|           }, |           }, | ||||||
|           "rating": { |           "rating": { | ||||||
|             "maximum": 5, |             "maximum": 5, | ||||||
|             "minimum": 0, |             "minimum": -1, | ||||||
|             "type": "number" |             "type": "number" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|  | |||||||
| @ -52,7 +52,7 @@ export class UpdateAssetBase { | |||||||
|   @Optional() |   @Optional() | ||||||
|   @IsInt() |   @IsInt() | ||||||
|   @Max(5) |   @Max(5) | ||||||
|   @Min(0) |   @Min(-1) | ||||||
|   rating?: number; |   rating?: number; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1162,6 +1162,17 @@ describe(MetadataService.name, () => { | |||||||
|         }), |         }), | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
|  |     it('should handle valid negative rating value', async () => { | ||||||
|  |       assetMock.getByIds.mockResolvedValue([assetStub.image]); | ||||||
|  |       mockReadTags({ Rating: -1 }); | ||||||
|  | 
 | ||||||
|  |       await sut.handleMetadataExtraction({ id: assetStub.image.id }); | ||||||
|  |       expect(assetMock.upsertExif).toHaveBeenCalledWith( | ||||||
|  |         expect.objectContaining({ | ||||||
|  |           rating: -1, | ||||||
|  |         }), | ||||||
|  |       ); | ||||||
|  |     }); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   describe('handleQueueSidecar', () => { |   describe('handleQueueSidecar', () => { | ||||||
|  | |||||||
| @ -204,7 +204,7 @@ export class MetadataService extends BaseService { | |||||||
|       // comments
 |       // comments
 | ||||||
|       description: String(exifTags.ImageDescription || exifTags.Description || '').trim(), |       description: String(exifTags.ImageDescription || exifTags.Description || '').trim(), | ||||||
|       profileDescription: exifTags.ProfileDescription || null, |       profileDescription: exifTags.ProfileDescription || null, | ||||||
|       rating: validateRange(exifTags.Rating, 0, 5), |       rating: validateRange(exifTags.Rating, -1, 5), | ||||||
| 
 | 
 | ||||||
|       // grouping
 |       // grouping
 | ||||||
|       livePhotoCID: (exifTags.ContentIdentifier || exifTags.MediaGroupUUID) ?? null, |       livePhotoCID: (exifTags.ContentIdentifier || exifTags.MediaGroupUUID) ?? null, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user