From da580d4685eabd82472b00aa5bba691b5ef7eaec Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Tue, 28 Jan 2025 21:33:38 +0100 Subject: [PATCH] fix: show local dates for range in album summary (#15654) * fix(web): show local dates for range in album summary * fix(server): show local dates for range in album summary --- server/src/dtos/album-response.dto.spec.ts | 4 ++-- server/src/dtos/album.dto.ts | 5 ++--- server/src/queries/album.repository.sql | 4 ++-- server/src/repositories/album.repository.ts | 4 ++-- server/src/services/metadata.service.spec.ts | 4 ++-- server/src/utils/date-time.ts | 5 ----- server/test/fixtures/asset.stub.ts | 4 ++-- server/test/fixtures/shared-link.stub.ts | 2 +- web/src/lib/components/album-page/album-summary.svelte | 5 ++++- 9 files changed, 17 insertions(+), 20 deletions(-) delete mode 100644 server/src/utils/date-time.ts diff --git a/server/src/dtos/album-response.dto.spec.ts b/server/src/dtos/album-response.dto.spec.ts index 2a6d59abf3602..dd8642598f5f4 100644 --- a/server/src/dtos/album-response.dto.spec.ts +++ b/server/src/dtos/album-response.dto.spec.ts @@ -4,8 +4,8 @@ import { albumStub } from 'test/fixtures/album.stub'; 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')); + expect(dto.startDate).toEqual(new Date('2020-12-31T23:59:00.000Z')); + expect(dto.endDate).toEqual(new Date('2025-01-01T01:02:03.456Z')); }); it('should not set start and end dates for empty assets', () => { diff --git a/server/src/dtos/album.dto.ts b/server/src/dtos/album.dto.ts index 2f99b958c4178..14db0ab1e8e82 100644 --- a/server/src/dtos/album.dto.ts +++ b/server/src/dtos/album.dto.ts @@ -7,7 +7,6 @@ import { AuthDto } from 'src/dtos/auth.dto'; import { UserResponseDto, mapUser } from 'src/dtos/user.dto'; import { AlbumEntity } from 'src/entities/album.entity'; import { AlbumUserRole, AssetOrder } from 'src/enum'; -import { getAssetDateTime } from 'src/utils/date-time'; import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation'; export class AlbumInfoDto { @@ -165,8 +164,8 @@ export const mapAlbum = (entity: AlbumEntity, withAssets: boolean, auth?: AuthDt const hasSharedLink = entity.sharedLinks?.length > 0; const hasSharedUser = sharedUsers.length > 0; - let startDate = getAssetDateTime(assets.at(0)); - let endDate = getAssetDateTime(assets.at(-1)); + let startDate = assets.at(0)?.localDateTime; + let endDate = assets.at(-1)?.localDateTime; // Swap dates if start date is greater than end date. if (startDate && endDate && startDate > endDate) { [startDate, endDate] = [endDate, startDate]; diff --git a/server/src/queries/album.repository.sql b/server/src/queries/album.repository.sql index 08ea078f730cd..dbf27866be722 100644 --- a/server/src/queries/album.repository.sql +++ b/server/src/queries/album.repository.sql @@ -202,8 +202,8 @@ order by -- AlbumRepository.getMetadataForIds select "albums"."id" as "albumId", - min("assets"."fileCreatedAt") as "startDate", - max("assets"."fileCreatedAt") as "endDate", + min("assets"."localDateTime") as "startDate", + max("assets"."localDateTime") as "endDate", count("assets"."id")::int as "assetCount" from "albums" diff --git a/server/src/repositories/album.repository.ts b/server/src/repositories/album.repository.ts index 6c81395a58300..c09a13750e0c7 100644 --- a/server/src/repositories/album.repository.ts +++ b/server/src/repositories/album.repository.ts @@ -127,8 +127,8 @@ export class AlbumRepository implements IAlbumRepository { .innerJoin('albums_assets_assets as album_assets', 'album_assets.albumsId', 'albums.id') .innerJoin('assets', 'assets.id', 'album_assets.assetsId') .select('albums.id as albumId') - .select((eb) => eb.fn.min('assets.fileCreatedAt').as('startDate')) - .select((eb) => eb.fn.max('assets.fileCreatedAt').as('endDate')) + .select((eb) => eb.fn.min('assets.localDateTime').as('startDate')) + .select((eb) => eb.fn.max('assets.localDateTime').as('endDate')) .select((eb) => sql`${eb.fn.count('assets.id')}::int`.as('assetCount')) .where('albums.id', 'in', ids) .where('assets.deletedAt', 'is', null) diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 99ca1e7ed3120..ffc3c171dc9ad 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -335,8 +335,8 @@ describe(MetadataService.name, () => { expect(assetMock.update).toHaveBeenCalledWith({ id: assetStub.image.id, duration: null, - fileCreatedAt: assetStub.image.createdAt, - localDateTime: new Date('2023-02-23T05:06:29.716Z'), + fileCreatedAt: assetStub.image.fileCreatedAt, + localDateTime: assetStub.image.fileCreatedAt, }); }); diff --git a/server/src/utils/date-time.ts b/server/src/utils/date-time.ts deleted file mode 100644 index e1578cbb19ad2..0000000000000 --- a/server/src/utils/date-time.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { AssetEntity } from 'src/entities/asset.entity'; - -export const getAssetDateTime = (asset: AssetEntity | undefined) => { - return asset?.exifInfo?.dateTimeOriginal || asset?.fileCreatedAt; -}; diff --git a/server/test/fixtures/asset.stub.ts b/server/test/fixtures/asset.stub.ts index 8f6c794790a4a..6c20a765c7bdd 100644 --- a/server/test/fixtures/asset.stub.ts +++ b/server/test/fixtures/asset.stub.ts @@ -210,7 +210,7 @@ export const assetStub = { 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'), + localDateTime: new Date('2025-01-01T01:02:03.456Z'), isFavorite: true, isArchived: false, duration: null, @@ -574,7 +574,7 @@ export const assetStub = { encodedVideoPath: null, 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'), + localDateTime: new Date('2020-12-31T23:59:00.000Z'), isFavorite: false, isArchived: false, isExternal: false, diff --git a/server/test/fixtures/shared-link.stub.ts b/server/test/fixtures/shared-link.stub.ts index a8b8e02d742b6..6ee31c0dea160 100644 --- a/server/test/fixtures/shared-link.stub.ts +++ b/server/test/fixtures/shared-link.stub.ts @@ -311,7 +311,7 @@ export const sharedLinkResponseStub = { allowUpload: false, allowDownload: false, showMetadata: false, - album: { ...albumResponse, startDate: assetResponse.fileCreatedAt, endDate: assetResponse.fileCreatedAt }, + album: { ...albumResponse, startDate: assetResponse.localDateTime, endDate: assetResponse.localDateTime }, assets: [{ ...assetResponseWithoutMetadata, exifInfo: undefined }], }), }; diff --git a/web/src/lib/components/album-page/album-summary.svelte b/web/src/lib/components/album-page/album-summary.svelte index f2cd23f616469..98109de92d1e3 100644 --- a/web/src/lib/components/album-page/album-summary.svelte +++ b/web/src/lib/components/album-page/album-summary.svelte @@ -11,7 +11,10 @@ let { album }: Props = $props(); const formatDate = (date?: string) => { - return date ? new Date(date).toLocaleDateString($locale, dateFormats.album) : undefined; + const dateWithoutTimeZone = date?.slice(0, -1); + return dateWithoutTimeZone + ? new Date(dateWithoutTimeZone).toLocaleDateString($locale, dateFormats.album) + : undefined; }; const getDateRange = (start?: string, end?: string) => {