fix storage upload issue

This commit is contained in:
2021-01-23 17:29:06 +06:30
parent 348e374954
commit 3aea71571a
5 changed files with 246 additions and 27 deletions

View File

@@ -63,7 +63,8 @@ Future<void> deleteStorageFromUrls(List<String> urls) async {
Future<void> deleteStorageFromUrl(String url) async { Future<void> deleteStorageFromUrl(String url) async {
try { try {
StorageReference storageReference = StorageReference storageReference =
await FirebaseStorage.instance.getReferenceFromUrl(url); await FirebaseStorage(storageBucket: Config.instance.bucketName)
.getReferenceFromUrl(url);
await storageReference.delete(); await storageReference.delete();
} catch (e) { } catch (e) {
log.warning("deleteStorage:$e"); log.warning("deleteStorage:$e");

View File

@@ -253,8 +253,10 @@ class PackageModel extends BaseModel {
package.fcsID = user.fcsID; package.fcsID = user.fcsID;
} }
if (files != null) { if (files != null) {
if (files.length > uploadPhotoLimit) if (files.length > uploadPhotoLimit) {
throw Exception("Exceed number of file upload"); throw Exception("Exceed number of file upload");
}
package.photoUrls = package.photoUrls == null ? [] : package.photoUrls; package.photoUrls = package.photoUrls == null ? [] : package.photoUrls;
String path = Path.join(pkg_files_path); String path = Path.join(pkg_files_path);
List<String> urls = await uploadFiles(path, files); List<String> urls = await uploadFiles(path, files);
@@ -262,7 +264,16 @@ class PackageModel extends BaseModel {
package.photoUrls.add(url); package.photoUrls.add(url);
}); });
} }
try {
return Services.instance.packageService.createReceiving(package); return Services.instance.packageService.createReceiving(package);
} catch (e) {
try {
// delete uploaded photos if create fails
deleteStorageFromUrls(package.photoUrls);
} catch (e) {}
throw e;
}
} }
Future<void> updateReceiving(User user, Package package, List<File> files, Future<void> updateReceiving(User user, Package package, List<File> files,
@@ -274,9 +285,9 @@ class PackageModel extends BaseModel {
for (String url in deletedUrls) { for (String url in deletedUrls) {
package.photoUrls.remove(url); package.photoUrls.remove(url);
} }
await deleteStorageFromUrls(deletedUrls);
} }
List<String> uploadedURL = [];
if (files != null) { if (files != null) {
var count = (package.photoUrls?.length ?? 0) + var count = (package.photoUrls?.length ?? 0) +
files.length - files.length -
@@ -284,14 +295,25 @@ class PackageModel extends BaseModel {
if (count > uploadPhotoLimit) if (count > uploadPhotoLimit)
throw Exception("Exceed number of file upload"); throw Exception("Exceed number of file upload");
package.photoUrls = package.photoUrls == null ? [] : package.photoUrls; package.photoUrls = package.photoUrls == null ? [] : package.photoUrls;
String path = Path.join(pkg_files_path); String path = Path.join(pkg_files_path);
List<String> urls = await uploadFiles(path, files); uploadedURL = await uploadFiles(path, files);
urls.forEach((url) { uploadedURL.forEach((url) {
package.photoUrls.add(url); package.photoUrls.add(url);
}); });
} }
try {
await Services.instance.packageService.updateReceiving(package); 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<void> deleteReceiving(Package package) { Future<void> deleteReceiving(Package package) {
@@ -304,9 +326,9 @@ class PackageModel extends BaseModel {
for (String url in deletedUrls) { for (String url in deletedUrls) {
package.photoUrls.remove(url); package.photoUrls.remove(url);
} }
await deleteStorageFromUrls(deletedUrls);
} }
List<String> uploadedURL = [];
if (files != null) { if (files != null) {
var count = (package.photoUrls?.length ?? 0) + var count = (package.photoUrls?.length ?? 0) +
files.length - files.length -
@@ -316,13 +338,23 @@ class PackageModel extends BaseModel {
throw Exception("Exceed number of file upload"); throw Exception("Exceed number of file upload");
package.photoUrls = package.photoUrls == null ? [] : package.photoUrls; package.photoUrls = package.photoUrls == null ? [] : package.photoUrls;
String path = Path.join(pkg_files_path); String path = Path.join(pkg_files_path);
List<String> urls = await uploadFiles(path, files); uploadedURL = await uploadFiles(path, files);
urls.forEach((url) { uploadedURL.forEach((url) {
package.photoUrls.add(url); package.photoUrls.add(url);
}); });
package.photoUrls.removeWhere((e) => deletedUrls.contains(e)); package.photoUrls.removeWhere((e) => deletedUrls.contains(e));
} }
try {
await Services.instance.packageService.updateProcessing(package); 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<void> deleteProcessing(Package package) { Future<void> deleteProcessing(Package package) {

View File

@@ -224,10 +224,10 @@ class _ReceivingEditorState extends State<ReceivingEditor> {
} }
_save() async { _save() async {
package.trackingID = _trackingIDCtl.text; Package _p =
package.remark = _remarkCtl.text; 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!"); showMsgDialog(context, "Error", "Invalid tracking ID!");
return; return;
} }
@@ -239,12 +239,13 @@ class _ReceivingEditorState extends State<ReceivingEditor> {
try { try {
if (_isNew) { if (_isNew) {
await packageModel.createReceiving( await packageModel.createReceiving(
user, package, _multiImgController.getAddedFile); user, _p, _multiImgController.getAddedFile);
} else { } else {
package.id = widget.package.id; _p.id = widget.package.id;
_p.photoUrls = package.photoUrls;
await packageModel.updateReceiving( await packageModel.updateReceiving(
user, user,
package, _p,
_multiImgController.getAddedFile, _multiImgController.getAddedFile,
_multiImgController.getDeletedUrl); _multiImgController.getDeletedUrl);
} }

View File

@@ -1,6 +1,27 @@
# Generated by pub # Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile # See https://dart.dev/tools/pub/glossary#lockfile
packages: 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: async:
dependency: transitive dependency: transitive
description: description:
@@ -50,6 +71,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0-nullsafety.1" 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: clock:
dependency: transitive dependency: transitive
description: description:
@@ -134,6 +162,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.1" version: "1.1.1"
coverage:
dependency: transitive
description:
name: coverage
url: "https://pub.dartlang.org"
source: hosted
version: "0.14.2"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@@ -196,7 +231,7 @@ packages:
name: firebase name: firebase
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.3.0" version: "7.3.3"
firebase_auth: firebase_auth:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -336,6 +371,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.9.0" version: "8.9.0"
glob:
dependency: transitive
description:
name: glob
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
google_api_availability: google_api_availability:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -350,6 +392,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.2" 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: http_parser:
dependency: transitive dependency: transitive
description: description:
@@ -378,13 +427,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.16.1" version: "0.16.1"
io:
dependency: transitive
description:
name: io
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.4"
js: js:
dependency: transitive dependency: transitive
description: description:
name: js name: js
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.2" version: "0.6.3-nullsafety.2"
logging: logging:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -420,6 +476,27 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.4" 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: notus:
dependency: transitive dependency: transitive
description: description:
@@ -434,6 +511,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.0" 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: package_info:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -489,7 +573,7 @@ packages:
name: pedantic name: pedantic
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.9.0" version: "1.10.0-nullsafety.2"
permission_handler: permission_handler:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -532,6 +616,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
pool:
dependency: transitive
description:
name: pool
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.0-nullsafety.2"
process: process:
dependency: transitive dependency: transitive
description: description:
@@ -553,6 +644,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.3.2+1" 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: quill_delta:
dependency: transitive dependency: transitive
description: description:
@@ -623,11 +721,53 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.2+7" 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: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.99" 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: source_span:
dependency: transitive dependency: transitive
description: description:
@@ -684,6 +824,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0-nullsafety.1" 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: test_api:
dependency: transitive dependency: transitive
description: description:
@@ -691,6 +838,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.19-nullsafety.2" 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: timeline_list:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -761,6 +915,34 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0-nullsafety.3" 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: win32:
dependency: transitive dependency: transitive
description: description:
@@ -775,6 +957,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.0" version: "0.1.0"
yaml:
dependency: transitive
description:
name: yaml
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.1"
zefyr: zefyr:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@@ -24,12 +24,8 @@ dependencies:
image_picker: ^0.6.0+9 image_picker: ^0.6.0+9
shared_preferences: ^0.5.7+3 shared_preferences: ^0.5.7+3
progress: progress:
git: path:
url: https://git.mokkon.com/tzw/mokkon-flutter.git ../flutter/packages/progress
ref: v1.0.0
path: packages/progress
# path:
# ../flutter/packages/progress
flutter_datetime_picker: ^1.3.8 flutter_datetime_picker: ^1.3.8
dio: ^3.0.9 dio: ^3.0.9
package_info: ^0.4.0+6 package_info: ^0.4.0+6