Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions e2e/src/specs/server/api/asset.e2e-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ describe('/asset', () => {
expect(body).toMatchObject({
id: user1Assets[0].id,
exifInfo: expect.objectContaining({
dateTimeOriginal: '2023-11-20T01:11:00+00:00',
dateTimeOriginal: new Date('2023-11-19T18:11:00.000-07:00').toISOString(),
timeZone: 'UTC-7',
}),
});
Expand Down Expand Up @@ -544,7 +544,7 @@ describe('/asset', () => {
await utils.waitForQueueFinish(admin.accessToken, 'metadataExtraction');

const assetInfo = await utils.getAssetInfo(user1.accessToken, id);
expect(assetInfo.exifInfo?.dateTimeOriginal).toBe('2024-07-11T10:32:52+00:00');
expect(assetInfo.exifInfo?.dateTimeOriginal).toBe(new Date('2024-07-11T10:32:52Z').toISOString());

const { status, body } = await request(app)
.put(`/assets/${id}`)
Expand All @@ -554,7 +554,7 @@ describe('/asset', () => {
expect(body).toMatchObject({
id,
exifInfo: expect.objectContaining({
dateTimeOriginal: '2023-11-20T01:11:00+00:00',
dateTimeOriginal: new Date('2023-11-19T18:11:00.000-07:00').toISOString(),
}),
});
expect(status).toEqual(200);
Expand Down Expand Up @@ -839,7 +839,7 @@ describe('/asset', () => {
expect(result.body).toMatchObject({
id: user1Assets[0].id,
exifInfo: expect.objectContaining({
dateTimeOriginal: '2023-11-19T01:10:00+00:00',
dateTimeOriginal: new Date('2023-11-19T01:10:00.000Z').toISOString(),
}),
});
});
Expand Down Expand Up @@ -868,7 +868,7 @@ describe('/asset', () => {
type: AssetTypeEnum.Image,
originalFileName: 'el_torcal_rocks.jpg',
exifInfo: {
dateTimeOriginal: '2012-08-05T11:39:59+00:00',
dateTimeOriginal: new Date('2012-08-05T11:39:59.000Z').toISOString(),
exifImageWidth: 512,
exifImageHeight: 341,
focalLength: 75,
Expand Down Expand Up @@ -902,7 +902,7 @@ describe('/asset', () => {
originalFileName: 'IMG_2682.heic',
fileCreatedAt: '2019-03-21T16:04:22.348Z',
exifInfo: {
dateTimeOriginal: '2019-03-21T16:04:22.348+00:00',
dateTimeOriginal: new Date('2019-03-21T16:04:22.348Z').toISOString(),
exifImageWidth: 4032,
exifImageHeight: 3024,
latitude: 41.2203,
Expand Down Expand Up @@ -945,7 +945,7 @@ describe('/asset', () => {
focalLength: 18,
iso: 100,
fileSizeInByte: 9_057_784,
dateTimeOriginal: '2010-07-20T17:27:12+00:00',
dateTimeOriginal: new Date('2010-07-20T17:27:12.000Z').toISOString(),
orientation: '1',
},
},
Expand All @@ -964,7 +964,7 @@ describe('/asset', () => {
focalLength: 85,
iso: 200,
fileSizeInByte: 15_856_335,
dateTimeOriginal: '2016-09-22T21:10:29.06+00:00',
dateTimeOriginal: new Date('2016-09-22T21:10:29.060Z').toISOString(),
orientation: '1',
timeZone: 'UTC-4',
},
Expand All @@ -986,7 +986,7 @@ describe('/asset', () => {
focalLength: 35,
iso: 400,
fileSizeInByte: 19_587_072,
dateTimeOriginal: '2018-05-10T08:42:37.842+00:00',
dateTimeOriginal: new Date('2018-05-10T08:42:37.842Z').toISOString(),
orientation: '1',
},
},
Expand All @@ -1008,7 +1008,7 @@ describe('/asset', () => {
iso: 100,
lensModel: 'Sony E PZ 18-105mm F4 G OSS',
fileSizeInByte: 25_001_984,
dateTimeOriginal: '2016-09-27T10:51:44+00:00',
dateTimeOriginal: new Date('2016-09-27T10:51:44.000Z').toISOString(),
orientation: '1',
},
},
Expand All @@ -1030,7 +1030,7 @@ describe('/asset', () => {
iso: 100,
lensModel: 'Zeiss Batis 25mm F2',
fileSizeInByte: 49_512_448,
dateTimeOriginal: '2016-01-08T14:08:01+00:00',
dateTimeOriginal: new Date('2016-01-08T14:08:01.000Z').toISOString(),
orientation: '1',
},
},
Expand All @@ -1052,7 +1052,7 @@ describe('/asset', () => {
iso: 80,
lensModel: null,
fileSizeInByte: 11_113_617,
dateTimeOriginal: '2015-12-27T09:55:40+00:00',
dateTimeOriginal: new Date('2015-12-27T09:55:40.000Z').toISOString(),
latitude: null,
longitude: null,
orientation: '1',
Expand All @@ -1076,7 +1076,7 @@ describe('/asset', () => {
iso: 160,
lensModel: null,
fileSizeInByte: 13_551_312,
dateTimeOriginal: '2024-10-12T21:01:01+00:00',
dateTimeOriginal: new Date('2024-10-12T21:01:01.000Z').toISOString(),
latitude: null,
longitude: null,
orientation: '6',
Expand All @@ -1090,7 +1090,7 @@ describe('/asset', () => {
originalFileName: 'Ricoh_GR3-450.DNG',
fileCreatedAt: '2024-06-08T13:48:39.000Z',
exifInfo: {
dateTimeOriginal: '2024-06-08T13:48:39+00:00',
dateTimeOriginal: new Date('2024-06-08T13:48:39.000Z').toISOString(),
exifImageHeight: 4064,
exifImageWidth: 6112,
exposureTime: '1/400',
Expand Down
3 changes: 2 additions & 1 deletion e2e/src/specs/server/api/user-admin.e2e-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,8 @@ describe('/admin/users', () => {
it('should delete user', async () => {
const { status, body } = await request(app)
.delete(`/admin/users/${userToDelete.userId}`)
.set('Authorization', `Bearer ${admin.accessToken}`);
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({});

expect(status).toBe(200);
expect(body).toMatchObject({
Expand Down
2 changes: 1 addition & 1 deletion e2e/src/ui/generators/timeline/model-objects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export function generateAsset(
latitude: hasGPS ? faker.location.latitude() : null,
longitude: hasGPS ? faker.location.longitude() : null,
visibility: AssetVisibility.Timeline,
stack: null,
stack: undefined,
fileSizeInByte: faker.number.int({ min: 510, max: 5_000_000 }),
checksum: faker.string.alphanumeric({ length: 5 }),
};
Expand Down
2 changes: 1 addition & 1 deletion e2e/src/ui/generators/timeline/timeline-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export type MockTimelineAsset = {
latitude: number | null;
longitude: number | null;
visibility: AssetVisibility;
stack: null;
stack: undefined;
checksum: string;
fileSizeInByte: number;
};
Expand Down
13 changes: 2 additions & 11 deletions mobile/lib/domain/services/search.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/search_result.model.dart';
import 'package:immich_mobile/extensions/string_extensions.dart';
import 'package:immich_mobile/infrastructure/repositories/search_api.repository.dart';
import 'package:immich_mobile/infrastructure/utils/enum.converter.dart';
import 'package:immich_mobile/models/search/search_filter.model.dart';
import 'package:logging/logging.dart';
import 'package:openapi/api.dart' as api show AssetVisibility;
Expand Down Expand Up @@ -62,7 +63,7 @@ extension on AssetResponseDto {
createdAt: fileCreatedAt,
updatedAt: updatedAt,
ownerId: ownerId,
visibility: switch (visibility) {
visibility: switch (visibility.toAssetVisibility()) {
api.AssetVisibility.timeline => AssetVisibility.timeline,
api.AssetVisibility.hidden => AssetVisibility.hidden,
api.AssetVisibility.archive => AssetVisibility.archive,
Expand All @@ -81,13 +82,3 @@ extension on AssetResponseDto {
);
}
}

extension on AssetTypeEnum {
AssetType toAssetType() => switch (this) {
AssetTypeEnum.IMAGE => AssetType.image,
AssetTypeEnum.VIDEO => AssetType.video,
AssetTypeEnum.AUDIO => AssetType.audio,
AssetTypeEnum.OTHER => AssetType.other,
_ => throw Exception('Unknown AssetType value: $this'),
};
}
2 changes: 1 addition & 1 deletion mobile/lib/entities/album.entity.dart
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ class Album {
a.remoteAssetCount = dto.assetCount;
a.owner.value = await db.users.getById(dto.ownerId);
if (dto.order != null) {
a.sortOrder = dto.order == AssetOrder.asc ? SortOrder.asc : SortOrder.desc;
a.sortOrder = dto.order!.value == 'asc' ? SortOrder.asc : SortOrder.desc;
}

if (dto.albumThumbnailAssetId != null) {
Expand Down
5 changes: 3 additions & 2 deletions mobile/lib/entities/asset.entity.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/exif.model.dart';
import 'package:immich_mobile/extensions/string_extensions.dart';
import 'package:immich_mobile/infrastructure/entities/exif.entity.dart' as entity;
import 'package:immich_mobile/infrastructure/utils/enum.converter.dart';
import 'package:immich_mobile/infrastructure/utils/exif.converter.dart';
import 'package:immich_mobile/utils/diff.dart';
import 'package:immich_mobile/utils/hash.dart';
Expand All @@ -25,7 +26,7 @@ class Asset {
fileModifiedAt = remote.fileModifiedAt,
updatedAt = remote.updatedAt,
durationInSeconds = remote.duration.toDuration()?.inSeconds ?? 0,
type = remote.type.toAssetType(),
type = AssetType.values[remote.type.toAssetType().index],
fileName = remote.originalFileName,
height = remote.exifInfo?.exifImageHeight?.toInt(),
width = remote.exifInfo?.exifImageWidth?.toInt(),
Expand All @@ -42,7 +43,7 @@ class Asset {
stackCount = remote.stack?.assetCount ?? 0,
stackId = remote.stack?.id,
thumbhash = remote.thumbhash,
visibility = getVisibility(remote.visibility);
visibility = getVisibility(remote.visibility.toAssetVisibility());

Asset({
this.id = Isar.autoIncrement,
Expand Down
51 changes: 51 additions & 0 deletions mobile/lib/infrastructure/utils/enum.converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart' show AssetType;
import 'package:openapi/api.dart';

// Asset type converter

AssetType _toAssetTypeFromApiValue(String v) => switch (v) {
'IMAGE' => AssetType.image,
'VIDEO' => AssetType.video,
'AUDIO' => AssetType.audio,
'OTHER' => AssetType.other,
_ => AssetType.other,
};

// Avatar color converter

AvatarColor _toAvatarColorFromApiValue(String v) =>
AvatarColor.values.firstWhere((c) => c.value == v, orElse: () => AvatarColor.primary);

// Optional: if you still want to canonicalize via the shared model
UserAvatarColor _toUserAvatarColorFromApiValue(String v) => UserAvatarColor.fromJson(v) ?? UserAvatarColor.primary;

extension UserResponseDtoAvatarColorEnumX on UserResponseDtoAvatarColorEnum {
AvatarColor toAvatarColor() => _toAvatarColorFromApiValue(value);
UserAvatarColor toUserAvatarColor() => _toUserAvatarColorFromApiValue(value);
}

extension UserAdminResponseDtoAvatarColorEnumX on UserAdminResponseDtoAvatarColorEnum {
AvatarColor toAvatarColor() => _toAvatarColorFromApiValue(value);
UserAvatarColor toUserAvatarColor() => _toUserAvatarColorFromApiValue(value);
}

extension PartnerResponseDtoAvatarColorEnumX on PartnerResponseDtoAvatarColorEnum {
AvatarColor toAvatarColor() => _toAvatarColorFromApiValue(value);
UserAvatarColor toUserAvatarColor() => _toUserAvatarColorFromApiValue(value);
}

extension UserUpdateMeDtoAvatarColorEnumX on UserUpdateMeDtoAvatarColorEnum {
AvatarColor toAvatarColor() => _toAvatarColorFromApiValue(value);
UserAvatarColor toUserAvatarColor() => _toUserAvatarColorFromApiValue(value);
}

extension AssetResponseDtoTypeEnumX on AssetResponseDtoTypeEnum {
AssetType toAssetType() => _toAssetTypeFromApiValue(value);
}

AssetVisibility _toApiAssetVisibilityFromValue(String v) => AssetVisibility.fromJson(v) ?? AssetVisibility.timeline;

extension AssetResponseDtoVisibilityEnumX on AssetResponseDtoVisibilityEnum {
AssetVisibility toAssetVisibility() => _toApiAssetVisibilityFromValue(value);
}
16 changes: 1 addition & 15 deletions mobile/lib/infrastructure/utils/user.converter.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/infrastructure/utils/enum.converter.dart';
import 'package:openapi/api.dart';

// TODO: Move to repository once all classes are refactored
Expand Down Expand Up @@ -47,18 +48,3 @@ abstract final class UserConverter {
hasProfileImage: dto.profileImagePath.isNotEmpty,
);
}

extension on UserAvatarColor {
AvatarColor toAvatarColor() => switch (this) {
UserAvatarColor.red => AvatarColor.red,
UserAvatarColor.green => AvatarColor.green,
UserAvatarColor.blue => AvatarColor.blue,
UserAvatarColor.purple => AvatarColor.purple,
UserAvatarColor.orange => AvatarColor.orange,
UserAvatarColor.pink => AvatarColor.pink,
UserAvatarColor.amber => AvatarColor.amber,
UserAvatarColor.yellow => AvatarColor.yellow,
UserAvatarColor.gray => AvatarColor.gray,
UserAvatarColor.primary || _ => AvatarColor.primary,
};
}
8 changes: 3 additions & 5 deletions mobile/lib/models/shared_link/shared_link.model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,9 @@ class SharedLink {
expiresAt = dto.expiresAt,
key = dto.key,
showMetadata = dto.showMetadata,
type = dto.type == SharedLinkType.ALBUM ? SharedLinkSource.album : SharedLinkSource.individual,
title = dto.type == SharedLinkType.ALBUM
? dto.album?.albumName.toUpperCase() ?? "UNKNOWN SHARE"
: "INDIVIDUAL SHARE",
thumbAssetId = dto.type == SharedLinkType.ALBUM
type = dto.type.value == 'ALBUM' ? SharedLinkSource.album : SharedLinkSource.individual,
title = dto.type.value == 'ALBUM' ? dto.album?.albumName.toUpperCase() ?? "UNKNOWN SHARE" : "INDIVIDUAL SHARE",
thumbAssetId = dto.type.value == 'ALBUM'
? dto.album?.albumThumbnailAssetId
: dto.assets.isNotEmpty
? dto.assets[0].id
Expand Down
4 changes: 2 additions & 2 deletions mobile/lib/repositories/album_api.repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ class AlbumApiRepository extends ApiRepository {
description: dto.description,
endDate: dto.endDate,
activityEnabled: dto.isActivityEnabled,
sortOrder: dto.order == AssetOrder.asc ? SortOrder.asc : SortOrder.desc,
sortOrder: dto.order?.value == 'asc' ? SortOrder.asc : SortOrder.desc,
);
album.remoteAssetCount = dto.assetCount;
album.owner.value = entity.User.fromDto(UserConverter.fromSimpleUserDto(dto.owner));
Expand All @@ -162,7 +162,7 @@ class AlbumApiRepository extends ApiRepository {
updatedAt: dto.updatedAt,
thumbnailAssetId: dto.albumThumbnailAssetId,
isActivityEnabled: dto.isActivityEnabled,
order: dto.order == AssetOrder.asc ? AlbumAssetOrder.asc : AlbumAssetOrder.desc,
order: dto.order?.value == 'asc' ? AlbumAssetOrder.asc : AlbumAssetOrder.desc,
assetCount: dto.assetCount,
ownerName: dto.owner.name,
isShared: dto.albumUsers.length > 2,
Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/repositories/drift_album_api_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ extension on AlbumResponseDto {
updatedAt: updatedAt,
thumbnailAssetId: albumThumbnailAssetId,
isActivityEnabled: isActivityEnabled,
order: order == AssetOrder.asc ? AlbumAssetOrder.asc : AlbumAssetOrder.desc,
order: order?.value == 'asc' ? AlbumAssetOrder.asc : AlbumAssetOrder.desc,
assetCount: assetCount,
ownerName: owner.name,
isShared: albumUsers.length > 2,
Expand Down
2 changes: 0 additions & 2 deletions mobile/openapi/README.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions mobile/openapi/lib/api.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions mobile/openapi/lib/api/activities_api.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading