mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	fix(server): Correctly set album start and end dates (#4698)
* fix(server): Correctly set album start and end dates Currently, the query that retrieves album assets uses `ORDER BY assets.fileCreatedAt DESC`, which makes the existing logic return the start/end dates reversed (with `startDate` being taken from the first asset in the array). Instead of using the index-based approach, this change iterates through assets to get the min/max `fileCreatedAt`. This will avoid any future issues, if the query ordering changes, or becomes customizable (e.g. in case the user prefers to visualize older assets first). * fix: Maintain constant cost and only swap variables if needed
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							87a0ba3db3
						
					
				
				
					commit
					b6f18cbe81
				
			
							
								
								
									
										16
									
								
								server/src/domain/album/album-response.dto.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								server/src/domain/album/album-response.dto.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| import { albumStub } from '@test'; | ||||
| import { mapAlbum } from './album-response.dto'; | ||||
|  | ||||
| describe('mapAlbum', () => { | ||||
|   it('should set start and end dates', () => { | ||||
|     const dto = mapAlbum(albumStub.twoAssets, false); | ||||
|     expect(dto.startDate).toEqual(new Date('2023-02-22T05:06:29.716Z')); | ||||
|     expect(dto.endDate).toEqual(new Date('2023-02-23T05:06:29.716Z')); | ||||
|   }); | ||||
|  | ||||
|   it('should not set start and end dates for empty assets', () => { | ||||
|     const dto = mapAlbum(albumStub.empty, false); | ||||
|     expect(dto.startDate).toBeUndefined(); | ||||
|     expect(dto.endDate).toBeUndefined(); | ||||
|   }); | ||||
| }); | ||||
| @@ -36,6 +36,15 @@ export const mapAlbum = (entity: AlbumEntity, withAssets: boolean): AlbumRespons | ||||
|   const hasSharedLink = entity.sharedLinks?.length > 0; | ||||
|   const hasSharedUser = sharedUsers.length > 0; | ||||
|  | ||||
|   let startDate = assets.at(0)?.fileCreatedAt || undefined; | ||||
|   let endDate = assets.at(-1)?.fileCreatedAt || undefined; | ||||
|   // Swap dates if start date is greater than end date. | ||||
|   if (startDate && endDate && startDate > endDate) { | ||||
|     const temp = startDate; | ||||
|     startDate = endDate; | ||||
|     endDate = temp; | ||||
|   } | ||||
|  | ||||
|   return { | ||||
|     albumName: entity.albumName, | ||||
|     description: entity.description, | ||||
| @@ -48,8 +57,8 @@ export const mapAlbum = (entity: AlbumEntity, withAssets: boolean): AlbumRespons | ||||
|     sharedUsers, | ||||
|     shared: hasSharedUser || hasSharedLink, | ||||
|     hasSharedLink, | ||||
|     startDate: assets.at(0)?.fileCreatedAt || undefined, | ||||
|     endDate: assets.at(-1)?.fileCreatedAt || undefined, | ||||
|     startDate, | ||||
|     endDate, | ||||
|     assets: (withAssets ? assets : []).map((asset) => mapAsset(asset)), | ||||
|     assetCount: entity.assets?.length || 0, | ||||
|   }; | ||||
|   | ||||
| @@ -277,7 +277,7 @@ describe(MetadataService.name, () => { | ||||
|         id: assetStub.withLocation.id, | ||||
|         duration: null, | ||||
|         fileCreatedAt: assetStub.withLocation.createdAt, | ||||
|         localDateTime: new Date('2023-02-23T05:06:29.716Z'), | ||||
|         localDateTime: new Date('2023-02-22T05:06:29.716Z'), | ||||
|       }); | ||||
|     }); | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								server/test/fixtures/asset.stub.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								server/test/fixtures/asset.stub.ts
									
									
									
									
										vendored
									
									
								
							| @@ -434,8 +434,8 @@ export const assetStub = { | ||||
|   withLocation: Object.freeze<AssetEntity>({ | ||||
|     id: 'asset-with-favorite-id', | ||||
|     deviceAssetId: 'device-asset-id', | ||||
|     fileModifiedAt: new Date('2023-02-23T05:06:29.716Z'), | ||||
|     fileCreatedAt: new Date('2023-02-23T05:06:29.716Z'), | ||||
|     fileModifiedAt: new Date('2023-02-22T05:06:29.716Z'), | ||||
|     fileCreatedAt: new Date('2023-02-22T05:06:29.716Z'), | ||||
|     owner: userStub.user1, | ||||
|     ownerId: 'user-id', | ||||
|     deviceId: 'device-id', | ||||
| @@ -447,9 +447,9 @@ export const assetStub = { | ||||
|     webpPath: null, | ||||
|     thumbhash: null, | ||||
|     encodedVideoPath: null, | ||||
|     createdAt: new Date('2023-02-23T05:06:29.716Z'), | ||||
|     updatedAt: new Date('2023-02-23T05:06:29.716Z'), | ||||
|     localDateTime: new Date('2023-02-23T05:06:29.716Z'), | ||||
|     createdAt: new Date('2023-02-22T05:06:29.716Z'), | ||||
|     updatedAt: new Date('2023-02-22T05:06:29.716Z'), | ||||
|     localDateTime: new Date('2023-02-22T05:06:29.716Z'), | ||||
|     isFavorite: false, | ||||
|     isArchived: false, | ||||
|     isReadOnly: false, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user