diff --git a/lib/data/repositories/app/android_app_repository.dart b/lib/data/repositories/app/android_app_repository.dart index 73df7a6..614095c 100644 --- a/lib/data/repositories/app/android_app_repository.dart +++ b/lib/data/repositories/app/android_app_repository.dart @@ -17,6 +17,10 @@ class AndroidAppRepository implements AppRepository { @override AsyncResult addInfo(AppEntity app) async { + if (app.appNotInstall) { + return Failure(AndroidPluginException('App not installed: ${app.repository.projectName}')); + } + final package = await _androidPackage.getInfoById(app.packageInfo.id); if (package == null) { return Failure(AndroidPluginException('Package not found: ${app.packageInfo.id}')); @@ -101,22 +105,30 @@ class AndroidAppRepository implements AppRepository { .map(_jsonDecode) .map(_listToApps) .recover(_recoverEmptyList) - .map( - (apps) => apps.map((a) => a.toNotInstalled()).toList(), - ); + .flatMap(_addInfos); } @override AsyncResult putApp(AppEntity app) { return fetchApps() // - .flatMap((apps) { - if (apps.indexWhere((element) => element.repository == app.repository) != -1) { - return const Failure(RemoteRepositoryException('App already exists')); + .map((apps) { + final index = apps.indexWhere((a) => a.repository == app.repository); + if (index != -1) { + final newApps = [ + ...apps.sublist(0, index), + app.copyWith.packageInfo(imageBytes: []), + ...apps.sublist(index + 1), + ].map((a) => a.toJson()).toList(); + return newApps; } - final newApps = [...apps, app.toNotInstalled()].map((a) => a.toJson()).toList(); - return Success(jsonEncode(newApps)); + final newApps = [ + ...apps, + app.copyWith.packageInfo(imageBytes: []), + ].map((a) => a.toJson()).toList(); + return newApps; }) + .map(jsonEncode) .flatMap((json) => _localStorage.saveData(_localAndroidAppKey, json)) .pure(app); } @@ -143,7 +155,7 @@ class AndroidAppRepository implements AppRepository { } List _listToApps(List> list) { - return list.map(NotInstalledAppEntity.fromJson).toList(); + return list.map(AppEntity.fromJson).toList(); } List> _jsonDecode(String json) { @@ -156,4 +168,15 @@ class AndroidAppRepository implements AppRepository { return []; } } + + AsyncResult> _addInfos(List apps) async { + final List newApps = []; + + for (final app in apps) { + final result = await addInfo(app); + newApps.add(result.getOrDefault(app)); + } + + return Success(newApps); + } } diff --git a/lib/domain/usecases/add_this_app_information.dart b/lib/domain/usecases/add_this_app_information.dart index 65f3295..dbd1e75 100644 --- a/lib/domain/usecases/add_this_app_information.dart +++ b/lib/domain/usecases/add_this_app_information.dart @@ -10,11 +10,22 @@ class AddThisAppInformation { AsyncResult call() async { final getapps = AppEntity.thisAppEntity(); - return _appRepository // - .putApp(getapps) + return _checkExistApp(getapps) // .flatMap(_appRepository.addInfo) .flatMap(_codeHostingRepository.getLastRelease) .flatMap(_appRepository.putApp) .pure(unit); } + + AsyncResult _checkExistApp(AppEntity app) async { + return _appRepository // + .fetchApps() + .flatMap((apps) { + if (apps.contains(app)) { + return Success(app); + } else { + return Failure(Exception('App not found')); + } + }); + } } diff --git a/lib/domain/usecases/install_app_usecase.dart b/lib/domain/usecases/install_app_usecase.dart index 622f19a..f589418 100644 --- a/lib/domain/usecases/install_app_usecase.dart +++ b/lib/domain/usecases/install_app_usecase.dart @@ -100,7 +100,7 @@ Future _installAppIsolateAction( .map((app) => app.toLoading()) .onSuccess(installReceivePort.send) .flatMap(appRepository.installApp) - .map((app) => app.toInstalled()) + .flatMap(appRepository.putApp) .pureError(currentState) .merge();