From 3aea71571a24559b80fb76e6fbe95b225971b017 Mon Sep 17 00:00:00 2001 From: sainw Date: Sat, 23 Jan 2021 17:29:06 +0630 Subject: [PATCH] fix storage upload issue --- lib/helpers/firebase_helper.dart | 3 +- lib/pages/package/model/package_model.dart | 52 ++++-- lib/pages/receiving/receiving_editor.dart | 15 +- pubspec.lock | 195 ++++++++++++++++++++- pubspec.yaml | 8 +- 5 files changed, 246 insertions(+), 27 deletions(-) diff --git a/lib/helpers/firebase_helper.dart b/lib/helpers/firebase_helper.dart index 9716458..f9539e8 100644 --- a/lib/helpers/firebase_helper.dart +++ b/lib/helpers/firebase_helper.dart @@ -63,7 +63,8 @@ Future deleteStorageFromUrls(List urls) async { Future deleteStorageFromUrl(String url) async { try { StorageReference storageReference = - await FirebaseStorage.instance.getReferenceFromUrl(url); + await FirebaseStorage(storageBucket: Config.instance.bucketName) + .getReferenceFromUrl(url); await storageReference.delete(); } catch (e) { log.warning("deleteStorage:$e"); diff --git a/lib/pages/package/model/package_model.dart b/lib/pages/package/model/package_model.dart index 7ee7672..c64483f 100644 --- a/lib/pages/package/model/package_model.dart +++ b/lib/pages/package/model/package_model.dart @@ -253,8 +253,10 @@ class PackageModel extends BaseModel { package.fcsID = user.fcsID; } if (files != null) { - if (files.length > uploadPhotoLimit) + if (files.length > uploadPhotoLimit) { throw Exception("Exceed number of file upload"); + } + package.photoUrls = package.photoUrls == null ? [] : package.photoUrls; String path = Path.join(pkg_files_path); List urls = await uploadFiles(path, files); @@ -262,7 +264,16 @@ class PackageModel extends BaseModel { package.photoUrls.add(url); }); } - return Services.instance.packageService.createReceiving(package); + + try { + return Services.instance.packageService.createReceiving(package); + } catch (e) { + try { + // delete uploaded photos if create fails + deleteStorageFromUrls(package.photoUrls); + } catch (e) {} + throw e; + } } Future updateReceiving(User user, Package package, List files, @@ -274,9 +285,9 @@ class PackageModel extends BaseModel { for (String url in deletedUrls) { package.photoUrls.remove(url); } - await deleteStorageFromUrls(deletedUrls); } + List uploadedURL = []; if (files != null) { var count = (package.photoUrls?.length ?? 0) + files.length - @@ -284,14 +295,25 @@ class PackageModel extends BaseModel { if (count > uploadPhotoLimit) throw Exception("Exceed number of file upload"); + package.photoUrls = package.photoUrls == null ? [] : package.photoUrls; String path = Path.join(pkg_files_path); - List urls = await uploadFiles(path, files); - urls.forEach((url) { + uploadedURL = await uploadFiles(path, files); + uploadedURL.forEach((url) { package.photoUrls.add(url); }); } - await Services.instance.packageService.updateReceiving(package); + try { + await Services.instance.packageService.updateReceiving(package); + } catch (e) { + // delete newly uploaded photos if fails + try { + deleteStorageFromUrls(uploadedURL); + package.photoUrls.removeWhere((i) => uploadedURL.contains(i)); + } catch (e) {} + throw e; + } + return deleteStorageFromUrls(deletedUrls); } Future deleteReceiving(Package package) { @@ -304,9 +326,9 @@ class PackageModel extends BaseModel { for (String url in deletedUrls) { package.photoUrls.remove(url); } - await deleteStorageFromUrls(deletedUrls); } + List uploadedURL = []; if (files != null) { var count = (package.photoUrls?.length ?? 0) + files.length - @@ -316,13 +338,23 @@ class PackageModel extends BaseModel { throw Exception("Exceed number of file upload"); package.photoUrls = package.photoUrls == null ? [] : package.photoUrls; String path = Path.join(pkg_files_path); - List urls = await uploadFiles(path, files); - urls.forEach((url) { + uploadedURL = await uploadFiles(path, files); + uploadedURL.forEach((url) { package.photoUrls.add(url); }); package.photoUrls.removeWhere((e) => deletedUrls.contains(e)); } - await Services.instance.packageService.updateProcessing(package); + try { + await Services.instance.packageService.updateProcessing(package); + } catch (e) { + // delete newly uploaded photos if fails + try { + deleteStorageFromUrls(uploadedURL); + package.photoUrls.removeWhere((i) => uploadedURL.contains(i)); + } catch (e) {} + throw e; + } + return deleteStorageFromUrls(deletedUrls); } Future deleteProcessing(Package package) { diff --git a/lib/pages/receiving/receiving_editor.dart b/lib/pages/receiving/receiving_editor.dart index ae454d8..0d99f66 100644 --- a/lib/pages/receiving/receiving_editor.dart +++ b/lib/pages/receiving/receiving_editor.dart @@ -81,7 +81,7 @@ class _ReceivingEditorState extends State { setState(() { this.user = u; }); - },popPage: true)), + }, popPage: true)), ], ); @@ -224,10 +224,10 @@ class _ReceivingEditorState extends State { } _save() async { - package.trackingID = _trackingIDCtl.text; - package.remark = _remarkCtl.text; + Package _p = + Package(trackingID: _trackingIDCtl.text, remark: _remarkCtl.text); - if (package.trackingID == null || package.trackingID == "") { + if (_p.trackingID == null || _p.trackingID == "") { showMsgDialog(context, "Error", "Invalid tracking ID!"); return; } @@ -239,12 +239,13 @@ class _ReceivingEditorState extends State { try { if (_isNew) { await packageModel.createReceiving( - user, package, _multiImgController.getAddedFile); + user, _p, _multiImgController.getAddedFile); } else { - package.id = widget.package.id; + _p.id = widget.package.id; + _p.photoUrls = package.photoUrls; await packageModel.updateReceiving( user, - package, + _p, _multiImgController.getAddedFile, _multiImgController.getDeletedUrl); } diff --git a/pubspec.lock b/pubspec.lock index 7bcd555..79a1f02 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,27 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "12.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "0.40.6" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.0" async: dependency: transitive description: @@ -50,6 +71,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0-nullsafety.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" clock: dependency: transitive description: @@ -134,6 +162,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + coverage: + dependency: transitive + description: + name: coverage + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.2" crypto: dependency: transitive description: @@ -196,7 +231,7 @@ packages: name: firebase url: "https://pub.dartlang.org" source: hosted - version: "7.3.0" + version: "7.3.3" firebase_auth: dependency: "direct main" description: @@ -336,6 +371,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.9.0" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" google_api_availability: dependency: "direct main" description: @@ -350,6 +392,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" http_parser: dependency: transitive description: @@ -378,13 +427,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.16.1" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.4" js: dependency: transitive description: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.2" + version: "0.6.3-nullsafety.2" logging: dependency: "direct main" description: @@ -420,6 +476,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.4" + node_interop: + dependency: transitive + description: + name: node_interop + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + node_io: + dependency: transitive + description: + name: node_io + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.12" notus: dependency: transitive description: @@ -434,6 +511,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.3.0" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" package_info: dependency: "direct main" description: @@ -489,7 +573,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.9.0" + version: "1.10.0-nullsafety.2" permission_handler: dependency: "direct main" description: @@ -532,6 +616,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0-nullsafety.2" process: dependency: transitive description: @@ -553,6 +644,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.3.2+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4" quill_delta: dependency: transitive description: @@ -623,11 +721,53 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.2+7" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.9" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + shelf_static: + dependency: transitive + description: + name: shelf_static + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.9+1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0-nullsafety.3" + source_maps: + dependency: transitive + description: + name: source_maps + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.10-nullsafety.2" source_span: dependency: transitive description: @@ -684,6 +824,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0-nullsafety.1" + test: + dependency: "direct dev" + description: + name: test + url: "https://pub.dartlang.org" + source: hosted + version: "1.16.0-nullsafety.5" test_api: dependency: transitive description: @@ -691,6 +838,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.19-nullsafety.2" + test_core: + dependency: transitive + description: + name: test_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.12-nullsafety.5" timeline_list: dependency: "direct main" description: @@ -761,6 +915,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0-nullsafety.3" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "5.5.0" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.7+15" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.4" win32: dependency: transitive description: @@ -775,6 +957,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.0" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" zefyr: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 3b0e893..088449f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,12 +24,8 @@ dependencies: image_picker: ^0.6.0+9 shared_preferences: ^0.5.7+3 progress: - git: - url: https://git.mokkon.com/tzw/mokkon-flutter.git - ref: v1.0.0 - path: packages/progress - # path: - # ../flutter/packages/progress + path: + ../flutter/packages/progress flutter_datetime_picker: ^1.3.8 dio: ^3.0.9 package_info: ^0.4.0+6