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 | Bin 15641 -> 15378 bytes mobile/openapi/doc/DeviceInfoApi.md | Bin 2050 -> 0 bytes mobile/openapi/doc/DeviceInfoResponseDto.md | Bin 602 -> 0 bytes mobile/openapi/doc/DeviceTypeEnum.md | Bin 380 -> 0 bytes mobile/openapi/doc/UpsertDeviceInfoDto.md | Bin 525 -> 0 bytes mobile/openapi/lib/api.dart | Bin 5199 -> 5044 bytes mobile/openapi/lib/api/device_info_api.dart | Bin 2132 -> 0 bytes mobile/openapi/lib/api_client.dart | Bin 17017 -> 16738 bytes mobile/openapi/lib/api_helper.dart | Bin 4054 -> 3948 bytes .../lib/model/device_info_response_dto.dart | Bin 4707 -> 0 bytes .../openapi/lib/model/device_type_enum.dart | Bin 2744 -> 0 bytes .../lib/model/upsert_device_info_dto.dart | Bin 4456 -> 0 bytes mobile/openapi/test/device_info_api_test.dart | Bin 635 -> 0 bytes .../test/device_info_response_dto_test.dart | Bin 1093 -> 0 bytes .../openapi/test/device_type_enum_test.dart | Bin 425 -> 0 bytes .../test/upsert_device_info_dto_test.dart | Bin 801 -> 0 bytes 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(+), 606 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 bcd53f93426fa9bb95fa89a50350578f9ff3aa59..2efbf56fb4214ee16e068b728edd12eea8438ca8 100644 GIT binary patch delta 22 ecmbPPHK}5Qk@V)d(m|q|Lk(YXZZ5T6!UzCwjR_$D delta 230 zcmbPKF|%rek#w3%YFTD-s%KtWzGFeAmO_m}w3b$BL2+tP2|`9oD^?>VKUrTNAp}&c zmz$ytQJDfZBNJ$bCeQ#at$@%FEiDCoh_Eh5e6y}}xF{#ws>uolA{;P#CmZUBC__vR msVqo!%`44Cu?{A{6is diff --git a/mobile/openapi/doc/DeviceInfoApi.md b/mobile/openapi/doc/DeviceInfoApi.md deleted file mode 100644 index 092487151269cfff09023ed568356cc9248f662b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2050 zcmb_dVQyMKiJz}_S$Q4lO(mN*t%UwNpc(QRwyuC7oFf#G<8eV z9Rn#zCi7X6P(PS^-VU<>A=vvbtT;uYFT_o`GFnwULV0c1sBM5#3|J7|q48t3HsyDb z+wartYIH?Itrl`wgIs@054@qQ2BB8|4W_j^paGxjP?!zy%|RTIG7Z1_XWNQh)XrTd}JR z8Osa#ND-&Yl-@CJ-^R4i_9e|%Bp0NZ3od>*DltG?zRW)eQmdW98e0_a4yE-3VcH@T6 zCjOfc|5uRf?~p#PWWJ&$E4G>Q!-IrUpY1lojjnBj`&)3)_T^|4(-%t9l%D_R0=^y+ zb%=#jSxM-dJE~^VR@kT5yC=^O2oqK%L#t7eROeuH_2d z4ygS!(ss0?WBIm$F}Qsf1sG)eOc)YeL&V^8&!Ibh%(;;%+!HH!m8EZ+gK~SP?Z7AW z6aS(7tv?5$^g1xfY_?{{wi4nJZzycGG5&8)4GGIj?YR0rS;VOW*%U|g3@k(Yo(Kwh zgk~?IN6e7Y_{k>~v}}s;w~8F{7G8>XJnYHip&svTc(8!uC+J@p15%Kq+bB)@)A3+* zG4>K3jPWbF36s{^4#q9u!S`jwS<%o;J@5b#b-jYfrEi8M6uEx$anep=F?Y0Y=iY=(XqEeVn%WH7(DZe;xAt) zWsOoyW5dy4vBR(##!O`gaI4ffctYl`@04n$mq^)}oO8$YK0;W0DnC%L?r-KL->*!CSb m(rKN=9z!u4F6Qz(yIL>)nagJ^z!{Ic#|w$E;E&?D5aI(!7`MFu diff --git a/mobile/openapi/doc/DeviceTypeEnum.md b/mobile/openapi/doc/DeviceTypeEnum.md deleted file mode 100644 index ab8f99acbec1b6c99143fcccd6c4390156db2bfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcma)1v1$V`4Bhn=f*Xht(U?aOAKO}C3zswf^ F@C5+Ub!-3t diff --git a/mobile/openapi/doc/UpsertDeviceInfoDto.md b/mobile/openapi/doc/UpsertDeviceInfoDto.md deleted file mode 100644 index 29c67d0ab5871c184c2531c344a8c8340e5c0999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcma)&&1%Ci5QOh~iUl7M3+&w6lZ$;YG$HioWDHR)B^9-`LS7dNefUbU+a|pET)@a9DvnrK%>*%`AV z&Sl&q_;c>@hVyx|(5cKcaNe#jJNY0}Px|{KuVoZ-{zy)nQ!M6xJr)z;ozG&j3-f~5 ze-jPHWklZsV@(q{AcSoQ8hSla+phC`^H3G#w(^4$iQP0PLn3659nobm?Jg4sz(wifgH?nbox$&8KY59`_c@$yNzu4q9b8sDD7c3}F UEh>qJXo9G^$RV-$wBSod0K^j>cmMzZ 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 b65b6bd713dde3e128792a3ec828daa4c4a2911e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2132 zcmcIlU2ob*6n*Dc-1ecs%7t#U4;5{~(m>is+rXwoRfQsVVqb^pni+TII+U&Q-}lap z&4+ONP-!0k&u~A_J@>fZZ}s~yx|vU(znxr7u1E997%ndVnnW<3!qs#R@2BI-i%(D3 z%vt`K3PYzSz28q-?kMk-HW+8x#F@--0HrD|rZMKYLPb%1ma9S=YV;8KT5N1wloT8M zT1vz2O04+15QcvVjpg9RHoGTUSrUq3nQ}szNi^QwHYUrZLL28=-Ln}jg^FLkh?Au- zw$eYZwhM#Z z2~PK(heJp)6J<_YM@|NiNhNaF-t9d6zkP;$hKAu@Sr7`|&F3>{&u-?>Pkn*UC0E#X zEf_&kD>h2OAeBa0pe4fM8g0Rl;cbtz`FLBD2jQl={|y#5g+)WV*2ko8p*+5XPCdD< zi*ZqMK73tgIy-XtC~5hQsBmz08j>72aN?*7!fsUJv3HeM+#5h)Fym=@BE%{3yh87m zOQ``Z1T7hV(>}n-W7-tUPl0KYh&)7@-hIJ@M_Xu1Z*;ohSPeK-@xlzhmS{FJ2d-u7 z*MD!1XN%icd!;Q=q-b`AAIL~`A3^v%`~J9Z>?Z$HQy#G{9`n=z1eYb0< zzS%FkC+%ca&<2K}$~@<7I{4SCLh$Q4lpb9d|0}0=yHK;6sX07m_%E_LFvnCY>I7pg zBpp%hV1F8T7w_9tL z2Q~@?J4HTu@kaz}wqFV+fzrg<=@Nn@r(%ACN96U5*#46`hu5E&=v_;yC%qNe0*Kk!jaH()%pbv zg&j=5HOGv;(iBMj>>0OyJe?;8(^2|7?D1|mLC-7fw=bJsij1cex%?MLPANNqJU<>z f1novXx4qWxz2Nq^9>mBa6NXw9^V diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index abdbafde30a6f1e84f9e52a84049da5cbc249b54..4a9285c4c6dbe8c394d38e854f4a81757d8747fe 100644 GIT binary patch delta 19 acmey_!uY6(af7?sW)^h~!Od+JpE&_hp9h5i delta 107 zcmaFV#Q3v?af7=WXKGnya;j%uTK?olX?ZpmFn97neSH{H!Bhsuv^O>1?53tE$X`&L aT2um23f5^TBQ6k%E|_ShvN_-UGbaEXOeSFf diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index 236532a19d8ec6d7ac9a349e26eed24b812d414b..386e6a7e76fbd1329aff3d00b5717f01e8bf500d 100644 GIT binary patch delta 12 Tcmca6|3+@ZPqxj;?8O`aC@=*_ delta 52 zcmaDOcTIl7Pc~(j)UwRv)R4-8RM))HTup^)E(IVcN-ZfZ%2R+yPPXH4-~5xUm;(S1 CoD&29 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 4d26fa392cb76d2573e1ca2460d2b6c4adb069e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4707 zcmds4TW{Mo6n^)wI4Oc!!CYtU(~wqav)LWoOAMshfWa^XMxtZ3vZ#?%10&6U-#NTU zw5_)5(|{FdES($A^*hw*>EQGfF8;WlKly!nIla2Lo=)KP?A>$(lQ~?@ui^cCGJE~k z5sH!ItAZ($J{v!MHlSB=TS>*Ul~mbEl>7{us?og2c*!@sGNbS=HnmiySA&&zY^$@n zF`43jH$tI$#Wwi2W(t1|R~n5g-LIa@N*h+0OcZ#aSP8DIy6!!!6cyK5DXUu)Giz35 zzxSS`l*|M_5$mrQGz@XsRWvuY);xUTU?J~0yR2LPv-g)43v zRcT;Q@jF=b3NJxeM{_<#tzMCY>;Z%9tMVhPmj8+!e`TybW2 zabfyQ3VqQS`76smH8t@cPB1rsF&PkreRLs_OVg^^K9P9_ax>Hl z5sbRRq{prEqn$F~8PPl~ht}oytbXAqv10v8?Irc6w-BDJ0|=8pzi?|HKQxD+Bp13SqWz!?zL>f5T}k4tRcX$~AzoCm zf+HAS`FjeWB0QS(0?9G*mXFBKjnJCnq8@@bALf_iAtsrQasQ&j7Ni76sqLj7I|xyj z?jO{Hz5}Ym!)R-VWBtGw)$l-kNKU%)dwy?pNoz$EXVevc(wNLwwEbV;N;yv`btA9{ zbaLb_6m+n|0}?y)9Ud+WV@i+hY*Iz+>O_aj*n~r#gHs)Hb_aXFiZz|Z*`de#x`(jcoYhJ=o;?@=(EByz|iUPT*iq`nvM`C6vf~9a0@Y z#8vCw-lJ}nykj>d-UML9O3gWB;IQoNwFm%X=f0gtQEV3d{q#RTeR)Z91T)$X@b8l2L!^=^6$45t^#ot(1ULl z!B#7EMf%!upsnCO`p%&JKFbiokVs#A?plcD>I#ZfwGAa5)0^Nrg!IFuwbsVA528YS zr^J}Dg;TTun>vULuoo&Des}7Os_lGX?D$GJYf~lNSH_(%Yb4QN(dT1tJ)SsORP|R1 zyx5@*eN2-{Y_Fa!q0aiske!nj@q7Da1pjW7(MH@!-#YLA)=yNeHg{1^joJb3MtSrf zG}5#ghJ9Oy^hsoI#8w zKV-uC@!RC*w>^GT_u5#w$&KCQs*oe9bme5Wk%inz?FY@X+LgxoP7P7)#ldaL%5SXv zuTmE3TI}#y3X5+qt%Gsvy46#oofq0~R0fACSJDP`*XgWKTDnbP^gYDkLe zjpq8FiZa5MR%nNj+DY5LNHUq4O!l84qxQjhx8s~pfnTrM-u^{H2lVyMn1b%D*$Xbw zm~v4#Ie5GXaBdJ}rK<|xRRd(mRZuzg*&qRfq4say5I-l%T^m2!mHyCJgiT|qAE61q z+z%Fgx^KKjXurVJv2IWfxZ(g}2vOr~Ou8zH=LU&l3W>=}>jX?6Ip2|V6 zDm17fc6?0@Rx;rQ-HG%IOSdf~odnf_QD|^3Qg7_xdw^q1ZjLceCgV=RYB>OZ#ewW1 zx7TEAzKNykpUwes(t)4&5P9)9@zXF84vf2MY8240Ua|0+%OqN9GDD(m@ssB01n9!- zuYsL41KHaO436qEYj;~kU$yacCn+{4BUh!VbS{UH15*Iw0{S{YlC4H$$t9Z?W;d*M>?VkddwC=^W-At?7fj)>rPFP^ea;`LaFXIG8`T|b zMUr3y&F2Kwq6sGy(?U{4==3Krrb9~%8KBiZnE-#+^GC7}ocy&2Bqc_uclL4Jw(D}tBy}vk{ zzWL(-Vl4SG6WWfS51&2n@z4CaR9eoLO3#;hAxBh~wUOCe7IH01JBYvYb)~fJ)DXq3 z*qC`$+qss1*13jyDc1PE5*nXYY6IiibgQSTG**;$o@a2FFLSA#y6JRQs*Ke3Oy1j71 z57O4UG$g2$w>0Yzy`tQKOyv+d9Rdm4B8ulHyUNWlbKWjDl^i^{JI(x_Q^?J$+Nz&L z`lYUTd3yx>L>@KUnUwXK8nbTqqt$tN9ag8ATf?cK$7lPkkitkRl|^nZfr=`P_-MN! zvr=`D(MsG%T1Z(!sC-h^MIjc2JfM$xnMxc)lBr~hyrjbBsw6IxU_4XOuxUgmE$U1n zf|*>3y0CO3ids@q8^*>)4#UpqaEIV%Kr3}CZ=@bLk!x8>Ev(Ffd829#2&sbQb!{vy zMN!ZK;UQ!XxY;(679f*Fgg8HZ?$@X)6qF{BWnQcU0B}EWK<5DZ*ha`WdciQvFO(`y zshukq^Op(-(a;GZT!uJ}(lj0?7mLp_MR6h$`iRCSNO{4eBw~;=!99Ml&LgE z=nb;~8ha&8Zk$-s6!0*bIHDigd(&)xrwxfAa@y&Xp3>+Z+Ji=O4|r%5tNfS5Wuo8F z&a(#M_)+tHu6YUw&ff15dX{v1Qh=II>sZlyA= zbidHm#-|R3%YUc`4==`=6XFRJGyqI-oj|^=GI1iqR2aKgFo~ZWoLvNdQkq&bmkI0m zZY?UXYH0h*)=AN@ToXgQVJ`LtqRlyX397igegT1COwCb;xAA&W#&oTtD>o=#gcC;p(;-j)*n!0Ef7&#yG;js7I@Y+`fbtv zQ3MbIvUNuaM~;-@xFa;;yBv+u5sQ;kDzNn?o;J3mM}5Z-=vu2=z7~ONaS1VUu#J`G zJ5o!-w;oV;mxI}rPY?GsTjhdcG#J8;4VIi%!2nq9<;3DlO-`=qh08nm3BTrY&+iS z0Dr>O)R~kR1Al%dv)0J$vJ}T>JO1$gx8Zkr8vFD-M6t}R{sD!#5Z^j;PyrVC_2ln6 zNK}(btm;in=8%8o(!>LCOur+k&eqW7zm=kYNG`%P^NNn9#-3^-eZ-u`&wCk$D$9j= z%;{mia)DC*etVnS6_&W2_#xJjizi+ZieV)4O&iY!e!9UR%!h7$->MF-sLsZ6HNv}{ zbuyrT*SzrCuAqm#{lDsnv$Ts_tCj}4mTj7M@E;V|G2W|kS4(l^^RVVi3$8NmO}LPJ qB{RU!T_ya$Y|6;p)9&3DnpB_MITmYQru|F_D;QMn75<`!lK%^y2%g#i 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 9fd25bcd342d68a09707e094601b21bb3285ffd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmZ{g-%Go5cK>4B7u~(mF&pAChpF z&-d=Wmn0-fV7|?>>!-zfv6<(K6qc*!#SqdA)>#fOS-M)jUU@8#k0sM~HXhxMNeFo@ zq()jvO)K8u1e|aNONtG)DD3bQ^Hxc1FDh8`!48HhXQ{?_$F-LW*7{p9?O%)9_~P1J zmKRbO%Y>!8^bL8%QFn54v01|f8rn!vd(7^bpm#U4*fDJg>1TvUvEq%@IFSkkQ#|o! z6kJEsGsL2?Nw`ixSV{sRW56#3Qrz!iotPk4^x3kB8GX8-^I 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 4072e2e94ef1865f489f6068a64c528a0d7ad263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1093 zcmbV~L2KMF5QXpl71PshU>mnNm4rYy*eMHb45@p_Nm1>wcZe;i(l}))`R^Ue-6T-M zCOKI4nD^#;BPLCgG==q#vUvX`zsj%IWuC$1=4-x!tbnVcgl|Q*xx9HNvQhcD)}GH# zjz69xV@a*C9#vz#YN*3g7|al`R@h;WhFANVdS^Y)I&}A2?}BmzE04bh@?tl-m(yu4 zZ$=-axexR9%9_C1u%cRk)DZe;53{h23N%agqw*eBQY{I!i>~dONt~V#Lhr7AyGIIyNW6K(!blMiZxvAHZ7#=VeUKJGiC# zb~5U)GgVABS|nXrWJR<;OabE0X|{6bFgHUFbsTjp4}zYguL6E&Po@P~FTXiF%_MsZ yV2bww#9sIoNaay8)@wd^TaU_DVSZXG`xMp#+Y4Fe!5!p07rzW8E#pEwB!2;rP*Rxy 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 27b29a53e03bcc5b5e99e7bf33d4b7ab5084752e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmZvYT}#6-6o&8fD~?y)pf0*A*$^DGlYy=v^}?$V+S4xBp2U1ihU~waD7(>Kau|C?y1b7s9;~!@LUzU?b}tv68X?d>+hF~+a*g;^`tF| zPFvBb0ap+xIBW$DI3oG{lGSLm^^=AiKIO>?6TGna5tNNO$uUkNZQMOt7Z0~?T5mKt zFUbql#zNI8v_HC=EE^P|6N9EcV*VgW+}()gAgyEU_l}Sm*}TghSK1&+qj+44^y+N= z5AoQA@)x6oudWE3QwQFjw_S9DHWM&6S&T9(+MOwEb;>G@+7-{JRq4@URK<=i__`JY2-)I zNM(@K%CK6rcn-bnEmjO$>`=PNZWf(Z#tk}n`^Gnx>E1Deue~s2m%O7>b3=EB#!|Sk z!}d~1>$r4GR0I^YKojhC5Y`HbmbFSYBy%e++1W8GSKQbr+IEDI=H&}-@LXw>T#J~l zso#1u`z3K`UF?sYz(f6Pfj$W=wMF9+T#FJjS*ygUXstvA9T#$Z2=5U98EPSU3nJ`M zB3uml#)q?r)QwTS9*;a?NHv2FxX5r<7GeS0Bpsd;xlU4tMJS# { - 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