diff --git a/server/src/db.d.ts b/server/src/db.d.ts index 76fe6a0ce3748..ebe96f148253a 100644 --- a/server/src/db.d.ts +++ b/server/src/db.d.ts @@ -214,20 +214,6 @@ export interface GeodataPlaces { name: string; } -export interface GeodataPlacesTmp { - admin1Code: string | null; - admin1Name: string | null; - admin2Code: string | null; - admin2Name: string | null; - alternateNames: string | null; - countryCode: string; - id: number; - latitude: number; - longitude: number; - modificationDate: Timestamp; - name: string; -} - export interface Libraries { createdAt: Generated; deletedAt: Timestamp | null; @@ -280,14 +266,6 @@ export interface NaturalearthCountries { type: string; } -export interface NaturalearthCountriesTmp { - admin: string; - admin_a3: string; - coordinates: string; - id: Generated; - type: string; -} - export interface Partners { createdAt: Generated; inTimeline: Generated; @@ -445,14 +423,12 @@ export interface DB { exif: Exif; face_search: FaceSearch; geodata_places: GeodataPlaces; - geodata_places_tmp: GeodataPlacesTmp; libraries: Libraries; memories: Memories; memories_assets_assets: MemoriesAssetsAssets; migrations: Migrations; move_history: MoveHistory; naturalearth_countries: NaturalearthCountries; - naturalearth_countries_tmp: NaturalearthCountriesTmp; partners: Partners; person: Person; sessions: Sessions; diff --git a/server/src/dtos/album.dto.ts b/server/src/dtos/album.dto.ts index c3658cf7cdf3d..14db0ab1e8e82 100644 --- a/server/src/dtos/album.dto.ts +++ b/server/src/dtos/album.dto.ts @@ -164,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 = assets.at(0)?.localDateTime || undefined; - let endDate = assets.at(-1)?.localDateTime || undefined; + 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/dtos/asset.dto.ts b/server/src/dtos/asset.dto.ts index bc16d6a093d4e..8aa63f2f6924c 100644 --- a/server/src/dtos/asset.dto.ts +++ b/server/src/dtos/asset.dto.ts @@ -126,15 +126,6 @@ export class AssetStatsResponseDto { total!: number; } -export class AssetDatesDto { - dateTimeOriginal!: Date; - timeZone!: string | null; - localDateTime!: Date; - modifyDate!: Date; - fileCreatedAt!: Date; - fileModifiedAt!: Date; -} - export const mapStats = (stats: AssetStats): AssetStatsResponseDto => { return { images: stats[AssetType.IMAGE], diff --git a/server/src/repositories/asset.repository.ts b/server/src/repositories/asset.repository.ts index 2cba0bac7d13b..9458b82fb859f 100644 --- a/server/src/repositories/asset.repository.ts +++ b/server/src/repositories/asset.repository.ts @@ -621,6 +621,9 @@ export class AssetRepository implements IAssetRepository { .$if(!!options.isTrashed, (qb) => qb.where('assets.status', '!=', AssetStatus.DELETED)) .where('assets.deletedAt', options.isTrashed ? 'is not' : 'is', null) .where('assets.isVisible', '=', true) + .where('assets.fileCreatedAt', 'is not', null) + .where('assets.fileModifiedAt', 'is not', null) + .where('assets.localDateTime', 'is not', null) .$if(!!options.albumId, (qb) => qb .innerJoin('albums_assets_assets', 'assets.id', 'albums_assets_assets.assetsId') diff --git a/server/src/services/asset-media.service.spec.ts b/server/src/services/asset-media.service.spec.ts index 7d15718198f32..2244b6eb3b6a4 100644 --- a/server/src/services/asset-media.service.spec.ts +++ b/server/src/services/asset-media.service.spec.ts @@ -543,10 +543,6 @@ describe(AssetMediaService.name, () => { it('should throw an error if the requested preview file does not exist', async () => { accessMock.asset.checkOwnerAccess.mockResolvedValue(new Set([assetStub.image.id])); - if (!assetStub.image.fileCreatedAt) { - throw new Error('fileCreatedAt is missing'); - } - assetMock.getById.mockResolvedValue({ ...assetStub.image, files: [ @@ -568,10 +564,6 @@ describe(AssetMediaService.name, () => { it('should fall back to preview if the requested thumbnail file does not exist', async () => { accessMock.asset.checkOwnerAccess.mockResolvedValue(new Set([assetStub.image.id])); - if (!assetStub.image.fileCreatedAt) { - throw new Error('fileCreatedAt is missing'); - } - assetMock.getById.mockResolvedValue({ ...assetStub.image, files: [ diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 410379afe2d95..1e259a243c629 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -339,6 +339,7 @@ describe(MetadataService.name, () => { id: assetStub.image.id, duration: null, fileCreatedAt: assetStub.image.fileCreatedAt, + fileModifiedAt: assetStub.image.fileModifiedAt, localDateTime: assetStub.image.fileCreatedAt, }); }); diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index 8ae0b73ea2e8f..d7b8db8143827 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -10,7 +10,6 @@ import { SystemConfig } from 'src/config'; import { StorageCore } from 'src/cores/storage.core'; import { Exif } from 'src/db'; import { OnEvent, OnJob } from 'src/decorators'; -import { AssetDatesDto } from 'src/dtos/asset.dto'; import { AssetFaceEntity } from 'src/entities/asset-face.entity'; import { AssetEntity } from 'src/entities/asset.entity'; import { PersonEntity } from 'src/entities/person.entity'; @@ -38,6 +37,13 @@ const EXIF_DATE_TAGS: Array = [ 'DateTimeCreated', ]; +class AssetDatesDto { + dateTimeOriginal!: Date; + timeZone!: string | null; + localDateTime!: Date; + modifyDate!: Date; +} + const validate = (value: T): NonNullable | null => { // handle lists of numbers if (Array.isArray(value)) { @@ -464,7 +470,6 @@ export class MetadataService extends BaseService { } } else { const motionAssetId = this.cryptoRepository.randomUUID(); - const dates = this.getDates(asset, tags); motionAsset = await this.assetRepository.create({ id: motionAssetId, @@ -641,8 +646,6 @@ export class MetadataService extends BaseService { timeZone, localDateTime, modifyDate, - fileCreatedAt, - fileModifiedAt, }; } diff --git a/server/src/services/storage-template.service.spec.ts b/server/src/services/storage-template.service.spec.ts index 6f2a640b1fe79..46ec4f53e1531 100644 --- a/server/src/services/storage-template.service.spec.ts +++ b/server/src/services/storage-template.service.spec.ts @@ -179,10 +179,6 @@ describe(StorageTemplateService.name, () => { expect(await sut.handleMigrationSingle({ id: asset.id })).toBe(JobStatus.SUCCESS); - if (asset.fileCreatedAt == null) { - throw new Error('fileCreatedAt must be set'); - } - expect(moveMock.create).toHaveBeenCalledWith({ entityId: asset.id, newPath: `upload/library/${user.id}/${asset.fileCreatedAt.getFullYear()}/${album.albumName}/${asset.originalFileName}`, @@ -203,10 +199,6 @@ describe(StorageTemplateService.name, () => { expect(await sut.handleMigrationSingle({ id: asset.id })).toBe(JobStatus.SUCCESS); - if (asset.fileCreatedAt == null) { - throw new Error('fileCreatedAt must be set'); - } - const month = (asset.fileCreatedAt.getMonth() + 1).toString().padStart(2, '0'); expect(moveMock.create).toHaveBeenCalledWith({ entityId: asset.id,