From e22cdea485a31c390ab94c59a16068e71383690e Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Fri, 28 Apr 2023 16:01:03 -0400 Subject: [PATCH] chore(server,mobile): remove device info entity (#1527) * chore(server): remove unused device info code * chore: generate open api * remove any DeviceTypeEnum usage from mobile * chore: coverage * fix: drop device info table --------- Co-authored-by: Fynn Petersen-Frey --- .../models/authentication_state.model.dart | 10 +- .../providers/authentication.provider.dart | 15 +- .../shared/services/device_info.service.dart | 23 -- mobile/openapi/.openapi-generator/FILES | 12 -- mobile/openapi/README.md | 4 - mobile/openapi/doc/DeviceInfoApi.md | 65 ------ mobile/openapi/doc/DeviceInfoResponseDto.md | 20 -- mobile/openapi/doc/DeviceTypeEnum.md | 14 -- mobile/openapi/doc/UpsertDeviceInfoDto.md | 17 -- mobile/openapi/lib/api.dart | 4 - mobile/openapi/lib/api/device_info_api.dart | 65 ------ mobile/openapi/lib/api_client.dart | 6 - mobile/openapi/lib/api_helper.dart | 3 - .../lib/model/device_info_response_dto.dart | 151 -------------- .../openapi/lib/model/device_type_enum.dart | 88 -------- .../lib/model/upsert_device_info_dto.dart | 136 ------------ mobile/openapi/test/device_info_api_test.dart | 26 --- .../test/device_info_response_dto_test.dart | 52 ----- .../openapi/test/device_type_enum_test.dart | 21 -- .../test/upsert_device_info_dto_test.dart | 37 ---- server/apps/immich/src/app.module.ts | 2 - .../src/controllers/device-info.controller.ts | 24 --- server/apps/immich/src/controllers/index.ts | 1 - server/immich-openapi-specs.json | 96 --------- .../src/device-info/device-info.core.ts | 23 -- .../src/device-info/device-info.repository.ts | 8 - .../device-info/device-info.service.spec.ts | 63 ------ .../src/device-info/device-info.service.ts | 20 -- .../libs/domain/src/device-info/dto/index.ts | 1 - .../device-info/dto/upsert-device-info.dto.ts | 15 -- server/libs/domain/src/device-info/index.ts | 4 - .../response-dto/device-info-response.dto.ts | 26 --- .../src/device-info/response-dto/index.ts | 1 - server/libs/domain/src/domain.module.ts | 2 - server/libs/domain/src/index.ts | 1 - .../test/device-info.repository.mock.ts | 8 - server/libs/domain/test/index.ts | 1 - .../infra/src/entities/device-info.entity.ts | 32 --- server/libs/infra/src/entities/index.ts | 3 - server/libs/infra/src/infra.module.ts | 3 - .../1682710252424-DropDeviceInfoTable.ts | 26 +++ .../repositories/device-info.repository.ts | 16 -- server/libs/infra/src/repositories/index.ts | 1 - server/package.json | 4 +- web/src/api/api.ts | 3 - web/src/api/open-api/api.ts | 196 ------------------ 46 files changed, 34 insertions(+), 1315 deletions(-) delete mode 100644 mobile/lib/shared/services/device_info.service.dart delete mode 100644 mobile/openapi/doc/DeviceInfoApi.md delete mode 100644 mobile/openapi/doc/DeviceInfoResponseDto.md delete mode 100644 mobile/openapi/doc/DeviceTypeEnum.md delete mode 100644 mobile/openapi/doc/UpsertDeviceInfoDto.md delete mode 100644 mobile/openapi/lib/api/device_info_api.dart delete mode 100644 mobile/openapi/lib/model/device_info_response_dto.dart delete mode 100644 mobile/openapi/lib/model/device_type_enum.dart delete mode 100644 mobile/openapi/lib/model/upsert_device_info_dto.dart delete mode 100644 mobile/openapi/test/device_info_api_test.dart delete mode 100644 mobile/openapi/test/device_info_response_dto_test.dart delete mode 100644 mobile/openapi/test/device_type_enum_test.dart delete mode 100644 mobile/openapi/test/upsert_device_info_dto_test.dart delete mode 100644 server/apps/immich/src/controllers/device-info.controller.ts delete mode 100644 server/libs/domain/src/device-info/device-info.core.ts delete mode 100644 server/libs/domain/src/device-info/device-info.repository.ts delete mode 100644 server/libs/domain/src/device-info/device-info.service.spec.ts delete mode 100644 server/libs/domain/src/device-info/device-info.service.ts delete mode 100644 server/libs/domain/src/device-info/dto/index.ts delete mode 100644 server/libs/domain/src/device-info/dto/upsert-device-info.dto.ts delete mode 100644 server/libs/domain/src/device-info/index.ts delete mode 100644 server/libs/domain/src/device-info/response-dto/device-info-response.dto.ts delete mode 100644 server/libs/domain/src/device-info/response-dto/index.ts delete mode 100644 server/libs/domain/test/device-info.repository.mock.ts delete mode 100644 server/libs/infra/src/entities/device-info.entity.ts create mode 100644 server/libs/infra/src/migrations/1682710252424-DropDeviceInfoTable.ts delete mode 100644 server/libs/infra/src/repositories/device-info.repository.ts diff --git a/mobile/lib/modules/login/models/authentication_state.model.dart b/mobile/lib/modules/login/models/authentication_state.model.dart index f59167c349..648670ca63 100644 --- a/mobile/lib/modules/login/models/authentication_state.model.dart +++ b/mobile/lib/modules/login/models/authentication_state.model.dart @@ -1,8 +1,5 @@ -import 'package:openapi/api.dart'; - class AuthenticationState { final String deviceId; - final DeviceTypeEnum deviceType; final String userId; final String userEmail; final bool isAuthenticated; @@ -13,7 +10,6 @@ class AuthenticationState { final String profileImagePath; AuthenticationState({ required this.deviceId, - required this.deviceType, required this.userId, required this.userEmail, required this.isAuthenticated, @@ -26,7 +22,6 @@ class AuthenticationState { AuthenticationState copyWith({ String? deviceId, - DeviceTypeEnum? deviceType, String? userId, String? userEmail, bool? isAuthenticated, @@ -38,7 +33,6 @@ class AuthenticationState { }) { return AuthenticationState( deviceId: deviceId ?? this.deviceId, - deviceType: deviceType ?? this.deviceType, userId: userId ?? this.userId, userEmail: userEmail ?? this.userEmail, isAuthenticated: isAuthenticated ?? this.isAuthenticated, @@ -52,7 +46,7 @@ class AuthenticationState { @override String toString() { - return 'AuthenticationState(deviceId: $deviceId, deviceType: $deviceType, userId: $userId, userEmail: $userEmail, isAuthenticated: $isAuthenticated, firstName: $firstName, lastName: $lastName, isAdmin: $isAdmin, shouldChangePassword: $shouldChangePassword, profileImagePath: $profileImagePath)'; + return 'AuthenticationState(deviceId: $deviceId, userId: $userId, userEmail: $userEmail, isAuthenticated: $isAuthenticated, firstName: $firstName, lastName: $lastName, isAdmin: $isAdmin, shouldChangePassword: $shouldChangePassword, profileImagePath: $profileImagePath)'; } @override @@ -61,7 +55,6 @@ class AuthenticationState { return other is AuthenticationState && other.deviceId == deviceId && - other.deviceType == deviceType && other.userId == userId && other.userEmail == userEmail && other.isAuthenticated == isAuthenticated && @@ -75,7 +68,6 @@ class AuthenticationState { @override int get hashCode { return deviceId.hashCode ^ - deviceType.hashCode ^ userId.hashCode ^ userEmail.hashCode ^ isAuthenticated.hashCode ^ diff --git a/mobile/lib/modules/login/providers/authentication.provider.dart b/mobile/lib/modules/login/providers/authentication.provider.dart index 4317d4bc59..38b526c874 100644 --- a/mobile/lib/modules/login/providers/authentication.provider.dart +++ b/mobile/lib/modules/login/providers/authentication.provider.dart @@ -3,24 +3,22 @@ import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_udid/flutter_udid.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/shared/models/store.dart'; import 'package:immich_mobile/modules/login/models/authentication_state.model.dart'; import 'package:immich_mobile/shared/models/user.dart'; import 'package:immich_mobile/shared/providers/api.provider.dart'; import 'package:immich_mobile/shared/services/api.service.dart'; -import 'package:immich_mobile/shared/services/device_info.service.dart'; import 'package:immich_mobile/utils/hash.dart'; import 'package:openapi/api.dart'; class AuthenticationNotifier extends StateNotifier { AuthenticationNotifier( - this._deviceInfoService, this._apiService, ) : super( AuthenticationState( deviceId: "", - deviceType: DeviceTypeEnum.ANDROID, userId: "", userEmail: "", firstName: '', @@ -32,7 +30,6 @@ class AuthenticationNotifier extends StateNotifier { ), ); - final DeviceInfoService _deviceInfoService; final ApiService _apiService; Future login( @@ -146,9 +143,9 @@ class AuthenticationNotifier extends StateNotifier { } if (userResponseDto != null) { - var deviceInfo = await _deviceInfoService.getDeviceInfo(); - Store.put(StoreKey.deviceId, deviceInfo["deviceId"]); - Store.put(StoreKey.deviceIdHash, fastHash(deviceInfo["deviceId"])); + final deviceId = await FlutterUdid.consistentUdid; + Store.put(StoreKey.deviceId, deviceId); + Store.put(StoreKey.deviceIdHash, fastHash(deviceId)); Store.put(StoreKey.currentUser, User.fromDto(userResponseDto)); Store.put(StoreKey.serverUrl, serverUrl); Store.put(StoreKey.accessToken, accessToken); @@ -162,8 +159,7 @@ class AuthenticationNotifier extends StateNotifier { profileImagePath: userResponseDto.profileImagePath, isAdmin: userResponseDto.isAdmin, shouldChangePassword: userResponseDto.shouldChangePassword, - deviceId: deviceInfo["deviceId"], - deviceType: deviceInfo["deviceType"], + deviceId: deviceId, ); } return true; @@ -173,7 +169,6 @@ class AuthenticationNotifier extends StateNotifier { final authenticationProvider = StateNotifierProvider((ref) { return AuthenticationNotifier( - ref.watch(deviceInfoServiceProvider), ref.watch(apiServiceProvider), ); }); diff --git a/mobile/lib/shared/services/device_info.service.dart b/mobile/lib/shared/services/device_info.service.dart deleted file mode 100644 index 429d927fc8..0000000000 --- a/mobile/lib/shared/services/device_info.service.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:flutter_udid/flutter_udid.dart'; -import 'dart:io' show Platform; - -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:openapi/api.dart'; - -final deviceInfoServiceProvider = Provider((_) => DeviceInfoService()); - -class DeviceInfoService { - Future> getDeviceInfo() async { - // Get device info - var deviceId = await FlutterUdid.consistentUdid; - var deviceType = DeviceTypeEnum.ANDROID; - - if (Platform.isAndroid) { - deviceType = DeviceTypeEnum.ANDROID; - } else if (Platform.isIOS) { - deviceType = DeviceTypeEnum.IOS; - } - - return {"deviceId": deviceId, "deviceType": deviceType}; - } -} diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index a648b5ed16..02067ef62b 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -41,9 +41,6 @@ doc/CuratedObjectsResponseDto.md doc/DeleteAssetDto.md doc/DeleteAssetResponseDto.md doc/DeleteAssetStatus.md -doc/DeviceInfoApi.md -doc/DeviceInfoResponseDto.md -doc/DeviceTypeEnum.md doc/DownloadFilesDto.md doc/EditSharedLinkDto.md doc/ExifResponseDto.md @@ -100,7 +97,6 @@ doc/UpdateAlbumDto.md doc/UpdateAssetDto.md doc/UpdateTagDto.md doc/UpdateUserDto.md -doc/UpsertDeviceInfoDto.md doc/UsageByUserDto.md doc/UserApi.md doc/UserCountResponseDto.md @@ -112,7 +108,6 @@ lib/api/album_api.dart lib/api/api_key_api.dart lib/api/asset_api.dart lib/api/authentication_api.dart -lib/api/device_info_api.dart lib/api/job_api.dart lib/api/o_auth_api.dart lib/api/search_api.dart @@ -163,8 +158,6 @@ lib/model/curated_objects_response_dto.dart lib/model/delete_asset_dto.dart lib/model/delete_asset_response_dto.dart lib/model/delete_asset_status.dart -lib/model/device_info_response_dto.dart -lib/model/device_type_enum.dart lib/model/download_files_dto.dart lib/model/edit_shared_link_dto.dart lib/model/exif_response_dto.dart @@ -214,7 +207,6 @@ lib/model/update_album_dto.dart lib/model/update_asset_dto.dart lib/model/update_tag_dto.dart lib/model/update_user_dto.dart -lib/model/upsert_device_info_dto.dart lib/model/usage_by_user_dto.dart lib/model/user_count_response_dto.dart lib/model/user_response_dto.dart @@ -258,9 +250,6 @@ test/curated_objects_response_dto_test.dart test/delete_asset_dto_test.dart test/delete_asset_response_dto_test.dart test/delete_asset_status_test.dart -test/device_info_api_test.dart -test/device_info_response_dto_test.dart -test/device_type_enum_test.dart test/download_files_dto_test.dart test/edit_shared_link_dto_test.dart test/exif_response_dto_test.dart @@ -317,7 +306,6 @@ test/update_album_dto_test.dart test/update_asset_dto_test.dart test/update_tag_dto_test.dart test/update_user_dto_test.dart -test/upsert_device_info_dto_test.dart test/usage_by_user_dto_test.dart test/user_api_test.dart test/user_count_response_dto_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index bcd53f9342..2efbf56fb4 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -116,7 +116,6 @@ Class | Method | HTTP request | Description *AuthenticationApi* | [**logout**](doc//AuthenticationApi.md#logout) | **POST** /auth/logout | *AuthenticationApi* | [**logoutAuthDevice**](doc//AuthenticationApi.md#logoutauthdevice) | **DELETE** /auth/devices/{id} | *AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | -*DeviceInfoApi* | [**upsertDeviceInfo**](doc//DeviceInfoApi.md#upsertdeviceinfo) | **PUT** /device-info | *JobApi* | [**getAllJobsStatus**](doc//JobApi.md#getalljobsstatus) | **GET** /jobs | *JobApi* | [**sendJobCommand**](doc//JobApi.md#sendjobcommand) | **PUT** /jobs/{jobId} | *OAuthApi* | [**callback**](doc//OAuthApi.md#callback) | **POST** /oauth/callback | @@ -193,8 +192,6 @@ Class | Method | HTTP request | Description - [DeleteAssetDto](doc//DeleteAssetDto.md) - [DeleteAssetResponseDto](doc//DeleteAssetResponseDto.md) - [DeleteAssetStatus](doc//DeleteAssetStatus.md) - - [DeviceInfoResponseDto](doc//DeviceInfoResponseDto.md) - - [DeviceTypeEnum](doc//DeviceTypeEnum.md) - [DownloadFilesDto](doc//DownloadFilesDto.md) - [EditSharedLinkDto](doc//EditSharedLinkDto.md) - [ExifResponseDto](doc//ExifResponseDto.md) @@ -244,7 +241,6 @@ Class | Method | HTTP request | Description - [UpdateAssetDto](doc//UpdateAssetDto.md) - [UpdateTagDto](doc//UpdateTagDto.md) - [UpdateUserDto](doc//UpdateUserDto.md) - - [UpsertDeviceInfoDto](doc//UpsertDeviceInfoDto.md) - [UsageByUserDto](doc//UsageByUserDto.md) - [UserCountResponseDto](doc//UserCountResponseDto.md) - [UserResponseDto](doc//UserResponseDto.md) diff --git a/mobile/openapi/doc/DeviceInfoApi.md b/mobile/openapi/doc/DeviceInfoApi.md deleted file mode 100644 index 0924871512..0000000000 --- a/mobile/openapi/doc/DeviceInfoApi.md +++ /dev/null @@ -1,65 +0,0 @@ -# openapi.api.DeviceInfoApi - -## Load the API package -```dart -import 'package:openapi/api.dart'; -``` - -All URIs are relative to */api* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**upsertDeviceInfo**](DeviceInfoApi.md#upsertdeviceinfo) | **PUT** /device-info | - - -# **upsertDeviceInfo** -> DeviceInfoResponseDto upsertDeviceInfo(upsertDeviceInfoDto) - - - -### Example -```dart -import 'package:openapi/api.dart'; -// TODO Configure API key authorization: cookie -//defaultApiClient.getAuthentication('cookie').apiKey = 'YOUR_API_KEY'; -// uncomment below to setup prefix (e.g. Bearer) for API key, if needed -//defaultApiClient.getAuthentication('cookie').apiKeyPrefix = 'Bearer'; -// TODO Configure HTTP Bearer authorization: bearer -// Case 1. Use String Token -//defaultApiClient.getAuthentication('bearer').setAccessToken('YOUR_ACCESS_TOKEN'); -// Case 2. Use Function which generate token. -// String yourTokenGeneratorFunction() { ... } -//defaultApiClient.getAuthentication('bearer').setAccessToken(yourTokenGeneratorFunction); - -final api_instance = DeviceInfoApi(); -final upsertDeviceInfoDto = UpsertDeviceInfoDto(); // UpsertDeviceInfoDto | - -try { - final result = api_instance.upsertDeviceInfo(upsertDeviceInfoDto); - print(result); -} catch (e) { - print('Exception when calling DeviceInfoApi->upsertDeviceInfo: $e\n'); -} -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **upsertDeviceInfoDto** | [**UpsertDeviceInfoDto**](UpsertDeviceInfoDto.md)| | - -### Return type - -[**DeviceInfoResponseDto**](DeviceInfoResponseDto.md) - -### Authorization - -[cookie](../README.md#cookie), [bearer](../README.md#bearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/mobile/openapi/doc/DeviceInfoResponseDto.md b/mobile/openapi/doc/DeviceInfoResponseDto.md deleted file mode 100644 index 95edd86ab7..0000000000 --- a/mobile/openapi/doc/DeviceInfoResponseDto.md +++ /dev/null @@ -1,20 +0,0 @@ -# openapi.model.DeviceInfoResponseDto - -## Load the model package -```dart -import 'package:openapi/api.dart'; -``` - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**id** | **int** | | -**deviceType** | [**DeviceTypeEnum**](DeviceTypeEnum.md) | | -**userId** | **String** | | -**deviceId** | **String** | | -**createdAt** | **String** | | -**isAutoBackup** | **bool** | | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/mobile/openapi/doc/DeviceTypeEnum.md b/mobile/openapi/doc/DeviceTypeEnum.md deleted file mode 100644 index ab8f99acbe..0000000000 --- a/mobile/openapi/doc/DeviceTypeEnum.md +++ /dev/null @@ -1,14 +0,0 @@ -# openapi.model.DeviceTypeEnum - -## Load the model package -```dart -import 'package:openapi/api.dart'; -``` - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/mobile/openapi/doc/UpsertDeviceInfoDto.md b/mobile/openapi/doc/UpsertDeviceInfoDto.md deleted file mode 100644 index 29c67d0ab5..0000000000 --- a/mobile/openapi/doc/UpsertDeviceInfoDto.md +++ /dev/null @@ -1,17 +0,0 @@ -# openapi.model.UpsertDeviceInfoDto - -## Load the model package -```dart -import 'package:openapi/api.dart'; -``` - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**deviceType** | [**DeviceTypeEnum**](DeviceTypeEnum.md) | | -**deviceId** | **String** | | -**isAutoBackup** | **bool** | | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 72f05c660c..8b5b4f8e77 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -32,7 +32,6 @@ part 'api/api_key_api.dart'; part 'api/album_api.dart'; part 'api/asset_api.dart'; part 'api/authentication_api.dart'; -part 'api/device_info_api.dart'; part 'api/job_api.dart'; part 'api/o_auth_api.dart'; part 'api/search_api.dart'; @@ -76,8 +75,6 @@ part 'model/curated_objects_response_dto.dart'; part 'model/delete_asset_dto.dart'; part 'model/delete_asset_response_dto.dart'; part 'model/delete_asset_status.dart'; -part 'model/device_info_response_dto.dart'; -part 'model/device_type_enum.dart'; part 'model/download_files_dto.dart'; part 'model/edit_shared_link_dto.dart'; part 'model/exif_response_dto.dart'; @@ -127,7 +124,6 @@ part 'model/update_album_dto.dart'; part 'model/update_asset_dto.dart'; part 'model/update_tag_dto.dart'; part 'model/update_user_dto.dart'; -part 'model/upsert_device_info_dto.dart'; part 'model/usage_by_user_dto.dart'; part 'model/user_count_response_dto.dart'; part 'model/user_response_dto.dart'; diff --git a/mobile/openapi/lib/api/device_info_api.dart b/mobile/openapi/lib/api/device_info_api.dart deleted file mode 100644 index b65b6bd713..0000000000 --- a/mobile/openapi/lib/api/device_info_api.dart +++ /dev/null @@ -1,65 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - - -class DeviceInfoApi { - DeviceInfoApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; - - final ApiClient apiClient; - - /// Performs an HTTP 'PUT /device-info' operation and returns the [Response]. - /// Parameters: - /// - /// * [UpsertDeviceInfoDto] upsertDeviceInfoDto (required): - Future upsertDeviceInfoWithHttpInfo(UpsertDeviceInfoDto upsertDeviceInfoDto,) async { - // ignore: prefer_const_declarations - final path = r'/device-info'; - - // ignore: prefer_final_locals - Object? postBody = upsertDeviceInfoDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Parameters: - /// - /// * [UpsertDeviceInfoDto] upsertDeviceInfoDto (required): - Future upsertDeviceInfo(UpsertDeviceInfoDto upsertDeviceInfoDto,) async { - final response = await upsertDeviceInfoWithHttpInfo(upsertDeviceInfoDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'DeviceInfoResponseDto',) as DeviceInfoResponseDto; - - } - return null; - } -} diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index abdbafde30..4a9285c4c6 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -249,10 +249,6 @@ class ApiClient { return DeleteAssetResponseDto.fromJson(value); case 'DeleteAssetStatus': return DeleteAssetStatusTypeTransformer().decode(value); - case 'DeviceInfoResponseDto': - return DeviceInfoResponseDto.fromJson(value); - case 'DeviceTypeEnum': - return DeviceTypeEnumTypeTransformer().decode(value); case 'DownloadFilesDto': return DownloadFilesDto.fromJson(value); case 'EditSharedLinkDto': @@ -351,8 +347,6 @@ class ApiClient { return UpdateTagDto.fromJson(value); case 'UpdateUserDto': return UpdateUserDto.fromJson(value); - case 'UpsertDeviceInfoDto': - return UpsertDeviceInfoDto.fromJson(value); case 'UsageByUserDto': return UsageByUserDto.fromJson(value); case 'UserCountResponseDto': diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index 236532a19d..386e6a7e76 100644 --- a/mobile/openapi/lib/api_helper.dart +++ b/mobile/openapi/lib/api_helper.dart @@ -61,9 +61,6 @@ String parameterToString(dynamic value) { if (value is DeleteAssetStatus) { return DeleteAssetStatusTypeTransformer().encode(value).toString(); } - if (value is DeviceTypeEnum) { - return DeviceTypeEnumTypeTransformer().encode(value).toString(); - } if (value is JobCommand) { return JobCommandTypeTransformer().encode(value).toString(); } diff --git a/mobile/openapi/lib/model/device_info_response_dto.dart b/mobile/openapi/lib/model/device_info_response_dto.dart deleted file mode 100644 index 4d26fa392c..0000000000 --- a/mobile/openapi/lib/model/device_info_response_dto.dart +++ /dev/null @@ -1,151 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - -class DeviceInfoResponseDto { - /// Returns a new [DeviceInfoResponseDto] instance. - DeviceInfoResponseDto({ - required this.id, - required this.deviceType, - required this.userId, - required this.deviceId, - required this.createdAt, - required this.isAutoBackup, - }); - - int id; - - DeviceTypeEnum deviceType; - - String userId; - - String deviceId; - - String createdAt; - - bool isAutoBackup; - - @override - bool operator ==(Object other) => identical(this, other) || other is DeviceInfoResponseDto && - other.id == id && - other.deviceType == deviceType && - other.userId == userId && - other.deviceId == deviceId && - other.createdAt == createdAt && - other.isAutoBackup == isAutoBackup; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (id.hashCode) + - (deviceType.hashCode) + - (userId.hashCode) + - (deviceId.hashCode) + - (createdAt.hashCode) + - (isAutoBackup.hashCode); - - @override - String toString() => 'DeviceInfoResponseDto[id=$id, deviceType=$deviceType, userId=$userId, deviceId=$deviceId, createdAt=$createdAt, isAutoBackup=$isAutoBackup]'; - - Map toJson() { - final json = {}; - json[r'id'] = this.id; - json[r'deviceType'] = this.deviceType; - json[r'userId'] = this.userId; - json[r'deviceId'] = this.deviceId; - json[r'createdAt'] = this.createdAt; - json[r'isAutoBackup'] = this.isAutoBackup; - return json; - } - - /// Returns a new [DeviceInfoResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DeviceInfoResponseDto? fromJson(dynamic value) { - if (value is Map) { - final json = value.cast(); - - // Ensure that the map contains the required keys. - // Note 1: the values aren't checked for validity beyond being non-null. - // Note 2: this code is stripped in release mode! - assert(() { - requiredKeys.forEach((key) { - assert(json.containsKey(key), 'Required key "DeviceInfoResponseDto[$key]" is missing from JSON.'); - assert(json[key] != null, 'Required key "DeviceInfoResponseDto[$key]" has a null value in JSON.'); - }); - return true; - }()); - - return DeviceInfoResponseDto( - id: mapValueOfType(json, r'id')!, - deviceType: DeviceTypeEnum.fromJson(json[r'deviceType'])!, - userId: mapValueOfType(json, r'userId')!, - deviceId: mapValueOfType(json, r'deviceId')!, - createdAt: mapValueOfType(json, r'createdAt')!, - isAutoBackup: mapValueOfType(json, r'isAutoBackup')!, - ); - } - return null; - } - - static List? listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DeviceInfoResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } - - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DeviceInfoResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - // maps a json object with a list of DeviceInfoResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DeviceInfoResponseDto.listFromJson(entry.value, growable: growable,); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'id', - 'deviceType', - 'userId', - 'deviceId', - 'createdAt', - 'isAutoBackup', - }; -} - diff --git a/mobile/openapi/lib/model/device_type_enum.dart b/mobile/openapi/lib/model/device_type_enum.dart deleted file mode 100644 index dc8c2bd113..0000000000 --- a/mobile/openapi/lib/model/device_type_enum.dart +++ /dev/null @@ -1,88 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - - -class DeviceTypeEnum { - /// Instantiate a new enum with the provided [value]. - const DeviceTypeEnum._(this.value); - - /// The underlying value of this enum member. - final String value; - - @override - String toString() => value; - - String toJson() => value; - - static const IOS = DeviceTypeEnum._(r'IOS'); - static const ANDROID = DeviceTypeEnum._(r'ANDROID'); - static const WEB = DeviceTypeEnum._(r'WEB'); - - /// List of all possible values in this [enum][DeviceTypeEnum]. - static const values = [ - IOS, - ANDROID, - WEB, - ]; - - static DeviceTypeEnum? fromJson(dynamic value) => DeviceTypeEnumTypeTransformer().decode(value); - - static List? listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DeviceTypeEnum.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } -} - -/// Transformation class that can [encode] an instance of [DeviceTypeEnum] to String, -/// and [decode] dynamic data back to [DeviceTypeEnum]. -class DeviceTypeEnumTypeTransformer { - factory DeviceTypeEnumTypeTransformer() => _instance ??= const DeviceTypeEnumTypeTransformer._(); - - const DeviceTypeEnumTypeTransformer._(); - - String encode(DeviceTypeEnum data) => data.value; - - /// Decodes a [dynamic value][data] to a DeviceTypeEnum. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - DeviceTypeEnum? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'IOS': return DeviceTypeEnum.IOS; - case r'ANDROID': return DeviceTypeEnum.ANDROID; - case r'WEB': return DeviceTypeEnum.WEB; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [DeviceTypeEnumTypeTransformer] instance. - static DeviceTypeEnumTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/upsert_device_info_dto.dart b/mobile/openapi/lib/model/upsert_device_info_dto.dart deleted file mode 100644 index d9fc14a617..0000000000 --- a/mobile/openapi/lib/model/upsert_device_info_dto.dart +++ /dev/null @@ -1,136 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - -class UpsertDeviceInfoDto { - /// Returns a new [UpsertDeviceInfoDto] instance. - UpsertDeviceInfoDto({ - required this.deviceType, - required this.deviceId, - this.isAutoBackup, - }); - - DeviceTypeEnum deviceType; - - String deviceId; - - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isAutoBackup; - - @override - bool operator ==(Object other) => identical(this, other) || other is UpsertDeviceInfoDto && - other.deviceType == deviceType && - other.deviceId == deviceId && - other.isAutoBackup == isAutoBackup; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (deviceType.hashCode) + - (deviceId.hashCode) + - (isAutoBackup == null ? 0 : isAutoBackup!.hashCode); - - @override - String toString() => 'UpsertDeviceInfoDto[deviceType=$deviceType, deviceId=$deviceId, isAutoBackup=$isAutoBackup]'; - - Map toJson() { - final json = {}; - json[r'deviceType'] = this.deviceType; - json[r'deviceId'] = this.deviceId; - if (this.isAutoBackup != null) { - json[r'isAutoBackup'] = this.isAutoBackup; - } else { - // json[r'isAutoBackup'] = null; - } - return json; - } - - /// Returns a new [UpsertDeviceInfoDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UpsertDeviceInfoDto? fromJson(dynamic value) { - if (value is Map) { - final json = value.cast(); - - // Ensure that the map contains the required keys. - // Note 1: the values aren't checked for validity beyond being non-null. - // Note 2: this code is stripped in release mode! - assert(() { - requiredKeys.forEach((key) { - assert(json.containsKey(key), 'Required key "UpsertDeviceInfoDto[$key]" is missing from JSON.'); - assert(json[key] != null, 'Required key "UpsertDeviceInfoDto[$key]" has a null value in JSON.'); - }); - return true; - }()); - - return UpsertDeviceInfoDto( - deviceType: DeviceTypeEnum.fromJson(json[r'deviceType'])!, - deviceId: mapValueOfType(json, r'deviceId')!, - isAutoBackup: mapValueOfType(json, r'isAutoBackup'), - ); - } - return null; - } - - static List? listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UpsertDeviceInfoDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } - - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UpsertDeviceInfoDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - // maps a json object with a list of UpsertDeviceInfoDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UpsertDeviceInfoDto.listFromJson(entry.value, growable: growable,); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'deviceType', - 'deviceId', - }; -} - diff --git a/mobile/openapi/test/device_info_api_test.dart b/mobile/openapi/test/device_info_api_test.dart deleted file mode 100644 index 9fd25bcd34..0000000000 --- a/mobile/openapi/test/device_info_api_test.dart +++ /dev/null @@ -1,26 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -import 'package:openapi/api.dart'; -import 'package:test/test.dart'; - - -/// tests for DeviceInfoApi -void main() { - // final instance = DeviceInfoApi(); - - group('tests for DeviceInfoApi', () { - //Future upsertDeviceInfo(UpsertDeviceInfoDto upsertDeviceInfoDto) async - test('test upsertDeviceInfo', () async { - // TODO - }); - - }); -} diff --git a/mobile/openapi/test/device_info_response_dto_test.dart b/mobile/openapi/test/device_info_response_dto_test.dart deleted file mode 100644 index 4072e2e94e..0000000000 --- a/mobile/openapi/test/device_info_response_dto_test.dart +++ /dev/null @@ -1,52 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -import 'package:openapi/api.dart'; -import 'package:test/test.dart'; - -// tests for DeviceInfoResponseDto -void main() { - // final instance = DeviceInfoResponseDto(); - - group('test DeviceInfoResponseDto', () { - // int id - test('to test the property `id`', () async { - // TODO - }); - - // DeviceTypeEnum deviceType - test('to test the property `deviceType`', () async { - // TODO - }); - - // String userId - test('to test the property `userId`', () async { - // TODO - }); - - // String deviceId - test('to test the property `deviceId`', () async { - // TODO - }); - - // String createdAt - test('to test the property `createdAt`', () async { - // TODO - }); - - // bool isAutoBackup - test('to test the property `isAutoBackup`', () async { - // TODO - }); - - - }); - -} diff --git a/mobile/openapi/test/device_type_enum_test.dart b/mobile/openapi/test/device_type_enum_test.dart deleted file mode 100644 index 27b29a53e0..0000000000 --- a/mobile/openapi/test/device_type_enum_test.dart +++ /dev/null @@ -1,21 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -import 'package:openapi/api.dart'; -import 'package:test/test.dart'; - -// tests for DeviceTypeEnum -void main() { - - group('test DeviceTypeEnum', () { - - }); - -} diff --git a/mobile/openapi/test/upsert_device_info_dto_test.dart b/mobile/openapi/test/upsert_device_info_dto_test.dart deleted file mode 100644 index 9c1dd0fbcd..0000000000 --- a/mobile/openapi/test/upsert_device_info_dto_test.dart +++ /dev/null @@ -1,37 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -import 'package:openapi/api.dart'; -import 'package:test/test.dart'; - -// tests for UpsertDeviceInfoDto -void main() { - // final instance = UpsertDeviceInfoDto(); - - group('test UpsertDeviceInfoDto', () { - // DeviceTypeEnum deviceType - test('to test the property `deviceType`', () async { - // TODO - }); - - // String deviceId - test('to test the property `deviceId`', () async { - // TODO - }); - - // bool isAutoBackup - test('to test the property `isAutoBackup`', () async { - // TODO - }); - - - }); - -} diff --git a/server/apps/immich/src/app.module.ts b/server/apps/immich/src/app.module.ts index a10c13b6e2..335c13fd83 100644 --- a/server/apps/immich/src/app.module.ts +++ b/server/apps/immich/src/app.module.ts @@ -10,7 +10,6 @@ import { AlbumController, APIKeyController, AuthController, - DeviceInfoController, JobController, OAuthController, SearchController, @@ -36,7 +35,6 @@ import { AppCronJobs } from './app.cron-jobs'; AlbumController, APIKeyController, AuthController, - DeviceInfoController, JobController, OAuthController, SearchController, diff --git a/server/apps/immich/src/controllers/device-info.controller.ts b/server/apps/immich/src/controllers/device-info.controller.ts deleted file mode 100644 index 6d2c8262b2..0000000000 --- a/server/apps/immich/src/controllers/device-info.controller.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - AuthUserDto, - DeviceInfoResponseDto as ResponseDto, - DeviceInfoService, - UpsertDeviceInfoDto as UpsertDto, -} from '@app/domain'; -import { Body, Controller, Put } from '@nestjs/common'; -import { ApiTags } from '@nestjs/swagger'; -import { GetAuthUser } from '../decorators/auth-user.decorator'; -import { Authenticated } from '../decorators/authenticated.decorator'; -import { UseValidation } from '../decorators/use-validation.decorator'; - -@ApiTags('Device Info') -@Controller('device-info') -@Authenticated() -@UseValidation() -export class DeviceInfoController { - constructor(private readonly service: DeviceInfoService) {} - - @Put() - upsertDeviceInfo(@GetAuthUser() authUser: AuthUserDto, @Body() dto: UpsertDto): Promise { - return this.service.upsert(authUser, dto); - } -} diff --git a/server/apps/immich/src/controllers/index.ts b/server/apps/immich/src/controllers/index.ts index 4e2003fb3c..942c004d92 100644 --- a/server/apps/immich/src/controllers/index.ts +++ b/server/apps/immich/src/controllers/index.ts @@ -1,7 +1,6 @@ export * from './album.controller'; export * from './api-key.controller'; export * from './auth.controller'; -export * from './device-info.controller'; export * from './job.controller'; export * from './oauth.controller'; export * from './search.controller'; diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 57b2bb9408..b20b772704 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -500,45 +500,6 @@ ] } }, - "/device-info": { - "put": { - "operationId": "upsertDeviceInfo", - "parameters": [], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertDeviceInfoDto" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeviceInfoResponseDto" - } - } - } - } - }, - "tags": [ - "Device Info" - ], - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - } - ] - } - }, "/jobs": { "get": { "operationId": "getAllJobsStatus", @@ -4124,63 +4085,6 @@ "redirectUri" ] }, - "DeviceTypeEnum": { - "type": "string", - "enum": [ - "IOS", - "ANDROID", - "WEB" - ] - }, - "UpsertDeviceInfoDto": { - "type": "object", - "properties": { - "deviceType": { - "$ref": "#/components/schemas/DeviceTypeEnum" - }, - "deviceId": { - "type": "string" - }, - "isAutoBackup": { - "type": "boolean" - } - }, - "required": [ - "deviceType", - "deviceId" - ] - }, - "DeviceInfoResponseDto": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "deviceType": { - "$ref": "#/components/schemas/DeviceTypeEnum" - }, - "userId": { - "type": "string" - }, - "deviceId": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "isAutoBackup": { - "type": "boolean" - } - }, - "required": [ - "id", - "deviceType", - "userId", - "deviceId", - "createdAt", - "isAutoBackup" - ] - }, "JobCountsDto": { "type": "object", "properties": { diff --git a/server/libs/domain/src/device-info/device-info.core.ts b/server/libs/domain/src/device-info/device-info.core.ts deleted file mode 100644 index b2a5a1a11e..0000000000 --- a/server/libs/domain/src/device-info/device-info.core.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { DeviceInfoEntity } from '@app/infra/entities'; -import { IDeviceInfoRepository } from './device-info.repository'; - -type UpsertKeys = Pick; -type UpsertEntity = UpsertKeys & Partial; - -export class DeviceInfoCore { - constructor(private repository: IDeviceInfoRepository) {} - - async upsert(entity: UpsertEntity) { - const exists = await this.repository.get(entity.userId, entity.deviceId); - if (!exists) { - if (!entity.isAutoBackup) { - entity.isAutoBackup = false; - } - return this.repository.save(entity); - } - - exists.isAutoBackup = entity.isAutoBackup ?? exists.isAutoBackup; - exists.deviceType = entity.deviceType ?? exists.deviceType; - return this.repository.save(exists); - } -} diff --git a/server/libs/domain/src/device-info/device-info.repository.ts b/server/libs/domain/src/device-info/device-info.repository.ts deleted file mode 100644 index d3f3343b66..0000000000 --- a/server/libs/domain/src/device-info/device-info.repository.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { DeviceInfoEntity } from '@app/infra/entities'; - -export const IDeviceInfoRepository = 'IDeviceInfoRepository'; - -export interface IDeviceInfoRepository { - get(userId: string, deviceId: string): Promise; - save(entity: Partial): Promise; -} diff --git a/server/libs/domain/src/device-info/device-info.service.spec.ts b/server/libs/domain/src/device-info/device-info.service.spec.ts deleted file mode 100644 index bc05cda55f..0000000000 --- a/server/libs/domain/src/device-info/device-info.service.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { DeviceInfoEntity, DeviceType } from '@app/infra/entities'; -import { authStub, newDeviceInfoRepositoryMock } from '../../test'; -import { IDeviceInfoRepository } from './device-info.repository'; -import { DeviceInfoService } from './device-info.service'; - -const deviceId = 'device-123'; -const userId = 'user-123'; - -describe('DeviceInfoService', () => { - let sut: DeviceInfoService; - let repositoryMock: jest.Mocked; - - beforeEach(async () => { - repositoryMock = newDeviceInfoRepositoryMock(); - - sut = new DeviceInfoService(repositoryMock); - }); - - it('should be defined', () => { - expect(sut).toBeDefined(); - }); - - describe('upsert', () => { - it('should create a new record', async () => { - const request = { deviceId, userId, deviceType: DeviceType.IOS } as DeviceInfoEntity; - const response = { ...request, id: 1 } as DeviceInfoEntity; - - repositoryMock.get.mockResolvedValue(null); - repositoryMock.save.mockResolvedValue(response); - - await expect(sut.upsert(authStub.user1, request)).resolves.toEqual(response); - - expect(repositoryMock.get).toHaveBeenCalledTimes(1); - expect(repositoryMock.save).toHaveBeenCalledTimes(1); - }); - - it('should update an existing record', async () => { - const request = { deviceId, userId, deviceType: DeviceType.IOS, isAutoBackup: true } as DeviceInfoEntity; - const response = { ...request, id: 1 } as DeviceInfoEntity; - - repositoryMock.get.mockResolvedValue(response); - repositoryMock.save.mockResolvedValue(response); - - await expect(sut.upsert(authStub.user1, request)).resolves.toEqual(response); - - expect(repositoryMock.get).toHaveBeenCalledTimes(1); - expect(repositoryMock.save).toHaveBeenCalledTimes(1); - }); - - it('should keep properties that were not updated', async () => { - const request = { deviceId, userId } as DeviceInfoEntity; - const response = { id: 1, isAutoBackup: true, deviceId, userId, deviceType: DeviceType.WEB } as DeviceInfoEntity; - - repositoryMock.get.mockResolvedValue(response); - repositoryMock.save.mockResolvedValue(response); - - await expect(sut.upsert(authStub.user1, request)).resolves.toEqual(response); - - expect(repositoryMock.get).toHaveBeenCalledTimes(1); - expect(repositoryMock.save).toHaveBeenCalledTimes(1); - }); - }); -}); diff --git a/server/libs/domain/src/device-info/device-info.service.ts b/server/libs/domain/src/device-info/device-info.service.ts deleted file mode 100644 index 8c6cb0ef35..0000000000 --- a/server/libs/domain/src/device-info/device-info.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; -import { AuthUserDto } from '../auth'; -import { DeviceInfoCore } from './device-info.core'; -import { IDeviceInfoRepository } from './device-info.repository'; -import { UpsertDeviceInfoDto } from './dto'; -import { DeviceInfoResponseDto, mapDeviceInfoResponse } from './response-dto'; - -@Injectable() -export class DeviceInfoService { - private core: DeviceInfoCore; - - constructor(@Inject(IDeviceInfoRepository) repository: IDeviceInfoRepository) { - this.core = new DeviceInfoCore(repository); - } - - public async upsert(authUser: AuthUserDto, dto: UpsertDeviceInfoDto): Promise { - const deviceInfo = await this.core.upsert({ ...dto, userId: authUser.id }); - return mapDeviceInfoResponse(deviceInfo); - } -} diff --git a/server/libs/domain/src/device-info/dto/index.ts b/server/libs/domain/src/device-info/dto/index.ts deleted file mode 100644 index 2a270e229d..0000000000 --- a/server/libs/domain/src/device-info/dto/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './upsert-device-info.dto'; diff --git a/server/libs/domain/src/device-info/dto/upsert-device-info.dto.ts b/server/libs/domain/src/device-info/dto/upsert-device-info.dto.ts deleted file mode 100644 index 5c540b8116..0000000000 --- a/server/libs/domain/src/device-info/dto/upsert-device-info.dto.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IsNotEmpty, IsOptional } from 'class-validator'; -import { DeviceType } from '@app/infra/entities'; -import { ApiProperty } from '@nestjs/swagger'; - -export class UpsertDeviceInfoDto { - @IsNotEmpty() - deviceId!: string; - - @IsNotEmpty() - @ApiProperty({ enumName: 'DeviceTypeEnum', enum: DeviceType }) - deviceType!: DeviceType; - - @IsOptional() - isAutoBackup?: boolean; -} diff --git a/server/libs/domain/src/device-info/index.ts b/server/libs/domain/src/device-info/index.ts deleted file mode 100644 index fd30bcb299..0000000000 --- a/server/libs/domain/src/device-info/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './device-info.repository'; -export * from './device-info.service'; -export * from './dto'; -export * from './response-dto'; diff --git a/server/libs/domain/src/device-info/response-dto/device-info-response.dto.ts b/server/libs/domain/src/device-info/response-dto/device-info-response.dto.ts deleted file mode 100644 index dbbc902f5a..0000000000 --- a/server/libs/domain/src/device-info/response-dto/device-info-response.dto.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { DeviceInfoEntity, DeviceType } from '@app/infra/entities'; -import { ApiProperty } from '@nestjs/swagger'; - -export class DeviceInfoResponseDto { - @ApiProperty({ type: 'integer' }) - id!: number; - userId!: string; - deviceId!: string; - - @ApiProperty({ enumName: 'DeviceTypeEnum', enum: DeviceType }) - deviceType!: DeviceType; - - createdAt!: string; - isAutoBackup!: boolean; -} - -export function mapDeviceInfoResponse(entity: DeviceInfoEntity): DeviceInfoResponseDto { - return { - id: entity.id, - userId: entity.userId, - deviceId: entity.deviceId, - deviceType: entity.deviceType, - createdAt: entity.createdAt, - isAutoBackup: entity.isAutoBackup, - }; -} diff --git a/server/libs/domain/src/device-info/response-dto/index.ts b/server/libs/domain/src/device-info/response-dto/index.ts deleted file mode 100644 index b8ffdeb11f..0000000000 --- a/server/libs/domain/src/device-info/response-dto/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './device-info-response.dto'; diff --git a/server/libs/domain/src/domain.module.ts b/server/libs/domain/src/domain.module.ts index c79490a460..7e12849728 100644 --- a/server/libs/domain/src/domain.module.ts +++ b/server/libs/domain/src/domain.module.ts @@ -3,7 +3,6 @@ import { AlbumService } from './album'; import { APIKeyService } from './api-key'; import { AssetService } from './asset'; import { AuthService } from './auth'; -import { DeviceInfoService } from './device-info'; import { JobService } from './job'; import { MediaService } from './media'; import { OAuthService } from './oauth'; @@ -21,7 +20,6 @@ const providers: Provider[] = [ AssetService, APIKeyService, AuthService, - DeviceInfoService, JobService, MediaService, OAuthService, diff --git a/server/libs/domain/src/index.ts b/server/libs/domain/src/index.ts index 82eacd737e..f3dca00f95 100644 --- a/server/libs/domain/src/index.ts +++ b/server/libs/domain/src/index.ts @@ -4,7 +4,6 @@ export * from './asset'; export * from './auth'; export * from './communication'; export * from './crypto'; -export * from './device-info'; export * from './domain.config'; export * from './domain.constant'; export * from './domain.module'; diff --git a/server/libs/domain/test/device-info.repository.mock.ts b/server/libs/domain/test/device-info.repository.mock.ts deleted file mode 100644 index e7aebdc341..0000000000 --- a/server/libs/domain/test/device-info.repository.mock.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IDeviceInfoRepository } from '../src'; - -export const newDeviceInfoRepositoryMock = (): jest.Mocked => { - return { - get: jest.fn(), - save: jest.fn(), - }; -}; diff --git a/server/libs/domain/test/index.ts b/server/libs/domain/test/index.ts index 36b6fd2e65..19b3e07beb 100644 --- a/server/libs/domain/test/index.ts +++ b/server/libs/domain/test/index.ts @@ -3,7 +3,6 @@ export * from './api-key.repository.mock'; export * from './asset.repository.mock'; export * from './communication.repository.mock'; export * from './crypto.repository.mock'; -export * from './device-info.repository.mock'; export * from './fixtures'; export * from './job.repository.mock'; export * from './machine-learning.repository.mock'; diff --git a/server/libs/infra/src/entities/device-info.entity.ts b/server/libs/infra/src/entities/device-info.entity.ts deleted file mode 100644 index 3ca251387f..0000000000 --- a/server/libs/infra/src/entities/device-info.entity.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, Unique } from 'typeorm'; - -@Entity('device_info') -@Unique(['userId', 'deviceId']) -export class DeviceInfoEntity { - @PrimaryGeneratedColumn() - id!: number; - - @Column() - userId!: string; - - @Column() - deviceId!: string; - - @Column() - deviceType!: DeviceType; - - @Column({ type: 'varchar', nullable: true }) - notificationToken!: string | null; - - @CreateDateColumn() - createdAt!: string; - - @Column({ type: 'bool', default: false }) - isAutoBackup!: boolean; -} - -export enum DeviceType { - IOS = 'IOS', - ANDROID = 'ANDROID', - WEB = 'WEB', -} diff --git a/server/libs/infra/src/entities/index.ts b/server/libs/infra/src/entities/index.ts index 778ff33db0..cb892c4a58 100644 --- a/server/libs/infra/src/entities/index.ts +++ b/server/libs/infra/src/entities/index.ts @@ -1,7 +1,6 @@ import { AlbumEntity } from './album.entity'; import { APIKeyEntity } from './api-key.entity'; import { AssetEntity } from './asset.entity'; -import { DeviceInfoEntity } from './device-info.entity'; import { SharedLinkEntity } from './shared-link.entity'; import { SmartInfoEntity } from './smart-info.entity'; import { SystemConfigEntity } from './system-config.entity'; @@ -11,7 +10,6 @@ import { UserEntity } from './user.entity'; export * from './album.entity'; export * from './api-key.entity'; export * from './asset.entity'; -export * from './device-info.entity'; export * from './exif.entity'; export * from './shared-link.entity'; export * from './smart-info.entity'; @@ -24,7 +22,6 @@ export const databaseEntities = [ AssetEntity, AlbumEntity, APIKeyEntity, - DeviceInfoEntity, UserEntity, SharedLinkEntity, SmartInfoEntity, diff --git a/server/libs/infra/src/infra.module.ts b/server/libs/infra/src/infra.module.ts index a95c920e1f..747e19ec75 100644 --- a/server/libs/infra/src/infra.module.ts +++ b/server/libs/infra/src/infra.module.ts @@ -3,7 +3,6 @@ import { IAssetRepository, ICommunicationRepository, ICryptoRepository, - IDeviceInfoRepository, IGeocodingRepository, IJobRepository, IKeyRepository, @@ -32,7 +31,6 @@ import { AssetRepository, CommunicationRepository, CryptoRepository, - DeviceInfoRepository, FilesystemProvider, GeocodingRepository, JobRepository, @@ -51,7 +49,6 @@ const providers: Provider[] = [ { provide: IAssetRepository, useClass: AssetRepository }, { provide: ICommunicationRepository, useClass: CommunicationRepository }, { provide: ICryptoRepository, useClass: CryptoRepository }, - { provide: IDeviceInfoRepository, useClass: DeviceInfoRepository }, { provide: IGeocodingRepository, useClass: GeocodingRepository }, { provide: IJobRepository, useClass: JobRepository }, { provide: IKeyRepository, useClass: APIKeyRepository }, diff --git a/server/libs/infra/src/migrations/1682710252424-DropDeviceInfoTable.ts b/server/libs/infra/src/migrations/1682710252424-DropDeviceInfoTable.ts new file mode 100644 index 0000000000..9a07676351 --- /dev/null +++ b/server/libs/infra/src/migrations/1682710252424-DropDeviceInfoTable.ts @@ -0,0 +1,26 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class DropDeviceInfoTable1682710252424 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`drop table device_info`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + create table if not exists device_info + ( + id serial + constraint "PK_b1c15a80b0a4e5f4eebadbdd92c" + primary key, + "userId" varchar not null, + "deviceId" varchar not null, + "deviceType" varchar not null, + "notificationToken" varchar, + "createdAt" timestamp default now() not null, + "isAutoBackup" boolean default false not null, + constraint "UQ_ebad78f36b10d15fbea8560e107" + unique ("userId", "deviceId") + ); + `); + } +} diff --git a/server/libs/infra/src/repositories/device-info.repository.ts b/server/libs/infra/src/repositories/device-info.repository.ts deleted file mode 100644 index 80da45fcbc..0000000000 --- a/server/libs/infra/src/repositories/device-info.repository.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IDeviceInfoRepository } from '@app/domain'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { DeviceInfoEntity } from '../entities'; - -export class DeviceInfoRepository implements IDeviceInfoRepository { - constructor(@InjectRepository(DeviceInfoEntity) private repository: Repository) {} - - get(userId: string, deviceId: string): Promise { - return this.repository.findOne({ where: { userId, deviceId } }); - } - - save(entity: Partial): Promise { - return this.repository.save(entity); - } -} diff --git a/server/libs/infra/src/repositories/index.ts b/server/libs/infra/src/repositories/index.ts index 6b144b2b81..c7f0e6081e 100644 --- a/server/libs/infra/src/repositories/index.ts +++ b/server/libs/infra/src/repositories/index.ts @@ -3,7 +3,6 @@ export * from './api-key.repository'; export * from './asset.repository'; export * from './communication.repository'; export * from './crypto.repository'; -export * from './device-info.repository'; export * from './filesystem.provider'; export * from './geocoding.repository'; export * from './job.repository'; diff --git a/server/package.json b/server/package.json index b6e3645cec..4580cd5f82 100644 --- a/server/package.json +++ b/server/package.json @@ -141,9 +141,9 @@ "coverageThreshold": { "./libs/domain/": { "branches": 80, - "functions": 88, + "functions": 87, "lines": 94, - "statements": 94 + "statements": 93 } }, "setupFilesAfterEnv": [ diff --git a/web/src/api/api.ts b/web/src/api/api.ts index 197d4598ac..28406ef6b8 100644 --- a/web/src/api/api.ts +++ b/web/src/api/api.ts @@ -5,7 +5,6 @@ import { AuthenticationApi, Configuration, ConfigurationParameters, - DeviceInfoApi, JobApi, OAuthApi, SearchApi, @@ -24,7 +23,6 @@ export class ImmichApi { public assetApi: AssetApi; public authenticationApi: AuthenticationApi; public oauthApi: OAuthApi; - public deviceInfoApi: DeviceInfoApi; public searchApi: SearchApi; public serverInfoApi: ServerInfoApi; public jobApi: JobApi; @@ -42,7 +40,6 @@ export class ImmichApi { this.assetApi = new AssetApi(this.config); this.authenticationApi = new AuthenticationApi(this.config); this.oauthApi = new OAuthApi(this.config); - this.deviceInfoApi = new DeviceInfoApi(this.config); this.serverInfoApi = new ServerInfoApi(this.config); this.jobApi = new JobApi(this.config); this.keyApi = new APIKeyApi(this.config); diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index be8877a279..7da0010e5b 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -1021,66 +1021,6 @@ export const DeleteAssetStatus = { export type DeleteAssetStatus = typeof DeleteAssetStatus[keyof typeof DeleteAssetStatus]; -/** - * - * @export - * @interface DeviceInfoResponseDto - */ -export interface DeviceInfoResponseDto { - /** - * - * @type {number} - * @memberof DeviceInfoResponseDto - */ - 'id': number; - /** - * - * @type {DeviceTypeEnum} - * @memberof DeviceInfoResponseDto - */ - 'deviceType': DeviceTypeEnum; - /** - * - * @type {string} - * @memberof DeviceInfoResponseDto - */ - 'userId': string; - /** - * - * @type {string} - * @memberof DeviceInfoResponseDto - */ - 'deviceId': string; - /** - * - * @type {string} - * @memberof DeviceInfoResponseDto - */ - 'createdAt': string; - /** - * - * @type {boolean} - * @memberof DeviceInfoResponseDto - */ - 'isAutoBackup': boolean; -} - - -/** - * - * @export - * @enum {string} - */ - -export const DeviceTypeEnum = { - Ios: 'IOS', - Android: 'ANDROID', - Web: 'WEB' -} as const; - -export type DeviceTypeEnum = typeof DeviceTypeEnum[keyof typeof DeviceTypeEnum]; - - /** * * @export @@ -2465,33 +2405,6 @@ export interface UpdateUserDto { */ 'shouldChangePassword'?: boolean; } -/** - * - * @export - * @interface UpsertDeviceInfoDto - */ -export interface UpsertDeviceInfoDto { - /** - * - * @type {DeviceTypeEnum} - * @memberof UpsertDeviceInfoDto - */ - 'deviceType': DeviceTypeEnum; - /** - * - * @type {string} - * @memberof UpsertDeviceInfoDto - */ - 'deviceId': string; - /** - * - * @type {boolean} - * @memberof UpsertDeviceInfoDto - */ - 'isAutoBackup'?: boolean; -} - - /** * * @export @@ -6406,115 +6319,6 @@ export class AuthenticationApi extends BaseAPI { } -/** - * DeviceInfoApi - axios parameter creator - * @export - */ -export const DeviceInfoApiAxiosParamCreator = function (configuration?: Configuration) { - return { - /** - * - * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - upsertDeviceInfo: async (upsertDeviceInfoDto: UpsertDeviceInfoDto, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'upsertDeviceInfoDto' is not null or undefined - assertParamExists('upsertDeviceInfo', 'upsertDeviceInfoDto', upsertDeviceInfoDto) - const localVarPath = `/device-info`; - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication cookie required - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(upsertDeviceInfoDto, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - } -}; - -/** - * DeviceInfoApi - functional programming interface - * @export - */ -export const DeviceInfoApiFp = function(configuration?: Configuration) { - const localVarAxiosParamCreator = DeviceInfoApiAxiosParamCreator(configuration) - return { - /** - * - * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async upsertDeviceInfo(upsertDeviceInfoDto: UpsertDeviceInfoDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.upsertDeviceInfo(upsertDeviceInfoDto, options); - return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); - }, - } -}; - -/** - * DeviceInfoApi - factory interface - * @export - */ -export const DeviceInfoApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { - const localVarFp = DeviceInfoApiFp(configuration) - return { - /** - * - * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - upsertDeviceInfo(upsertDeviceInfoDto: UpsertDeviceInfoDto, options?: any): AxiosPromise { - return localVarFp.upsertDeviceInfo(upsertDeviceInfoDto, options).then((request) => request(axios, basePath)); - }, - }; -}; - -/** - * DeviceInfoApi - object-oriented interface - * @export - * @class DeviceInfoApi - * @extends {BaseAPI} - */ -export class DeviceInfoApi extends BaseAPI { - /** - * - * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof DeviceInfoApi - */ - public upsertDeviceInfo(upsertDeviceInfoDto: UpsertDeviceInfoDto, options?: AxiosRequestConfig) { - return DeviceInfoApiFp(this.configuration).upsertDeviceInfo(upsertDeviceInfoDto, options).then((request) => request(this.axios, this.basePath)); - } -} - - /** * JobApi - axios parameter creator * @export