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 Binary files a/mobile/openapi/README.md and b/mobile/openapi/README.md differ diff --git a/mobile/openapi/doc/DeviceInfoApi.md b/mobile/openapi/doc/DeviceInfoApi.md deleted file mode 100644 index 0924871512..0000000000 Binary files a/mobile/openapi/doc/DeviceInfoApi.md and /dev/null differ diff --git a/mobile/openapi/doc/DeviceInfoResponseDto.md b/mobile/openapi/doc/DeviceInfoResponseDto.md deleted file mode 100644 index 95edd86ab7..0000000000 Binary files a/mobile/openapi/doc/DeviceInfoResponseDto.md and /dev/null differ diff --git a/mobile/openapi/doc/DeviceTypeEnum.md b/mobile/openapi/doc/DeviceTypeEnum.md deleted file mode 100644 index ab8f99acbe..0000000000 Binary files a/mobile/openapi/doc/DeviceTypeEnum.md and /dev/null differ diff --git a/mobile/openapi/doc/UpsertDeviceInfoDto.md b/mobile/openapi/doc/UpsertDeviceInfoDto.md deleted file mode 100644 index 29c67d0ab5..0000000000 Binary files a/mobile/openapi/doc/UpsertDeviceInfoDto.md and /dev/null differ diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 72f05c660c..8b5b4f8e77 100644 Binary files a/mobile/openapi/lib/api.dart and b/mobile/openapi/lib/api.dart differ 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 Binary files a/mobile/openapi/lib/api/device_info_api.dart and /dev/null differ diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index abdbafde30..4a9285c4c6 100644 Binary files a/mobile/openapi/lib/api_client.dart and b/mobile/openapi/lib/api_client.dart differ diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index 236532a19d..386e6a7e76 100644 Binary files a/mobile/openapi/lib/api_helper.dart and b/mobile/openapi/lib/api_helper.dart differ 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 Binary files a/mobile/openapi/lib/model/device_info_response_dto.dart and /dev/null differ 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 Binary files a/mobile/openapi/lib/model/device_type_enum.dart and /dev/null differ 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 Binary files a/mobile/openapi/lib/model/upsert_device_info_dto.dart and /dev/null differ 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 Binary files a/mobile/openapi/test/device_info_api_test.dart and /dev/null differ 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 Binary files a/mobile/openapi/test/device_info_response_dto_test.dart and /dev/null differ 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 Binary files a/mobile/openapi/test/device_type_enum_test.dart and /dev/null differ 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 Binary files a/mobile/openapi/test/upsert_device_info_dto_test.dart and /dev/null differ 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