fix: better classes and enums

This commit is contained in:
Prateek Sunal 2024-04-16 23:55:36 +05:30
parent 9a810e1cd6
commit 4942724423
3 changed files with 69 additions and 43 deletions

View file

@ -40,15 +40,6 @@ class UploadLocksDB {
columnPartETag: "part_etag",
columnPartStatus: "part_status",
);
static const trackStatus = (
pending: "pending",
uploaded: "uploaded",
completed: "completed",
);
static const _partStatus = (
pending: "pending",
uploaded: "uploaded",
);
UploadLocksDB._privateConstructor();
static final UploadLocksDB instance = UploadLocksDB._privateConstructor();
@ -110,7 +101,7 @@ class UploadLocksDB {
${_trackUploadTable.columnFileKey} TEXT NOT NULL,
${_trackUploadTable.columnObjectKey} TEXT NOT NULL,
${_trackUploadTable.columnCompleteUrl} TEXT NOT NULL,
${_trackUploadTable.columnStatus} TEXT DEFAULT '${trackStatus.pending}' NOT NULL,
${_trackUploadTable.columnStatus} TEXT DEFAULT '${MultipartStatus.pending.name}' NOT NULL,
${_trackUploadTable.columnPartSize} INTEGER NOT NULL
)
''',
@ -202,7 +193,7 @@ class UploadLocksDB {
return rows.isNotEmpty;
}
Future<(MultipartUploadURLs, String)> getCachedLinks(
Future<MultipartInfo> getCachedLinks(
String localId,
String fileHash,
) async {
@ -245,11 +236,16 @@ class UploadLocksDB {
objectKey: objectKey,
completeURL: row[_trackUploadTable.columnCompleteUrl] as String,
partsURLs: partsURLs,
partUploadStatus: partUploadStatus,
partETags: partETags,
);
return (urls, row[_trackUploadTable.columnStatus] as String);
return MultipartInfo(
urls: urls,
status: MultipartStatus.values
.byName(row[_trackUploadTable.columnStatus] as String),
partUploadStatus: partUploadStatus,
partETags: partETags,
partSize: row[_trackUploadTable.columnPartSize] as int,
);
}
Future<void> createTrackUploadsEntry(
@ -287,7 +283,7 @@ class UploadLocksDB {
_partsTable.columnObjectKey: objectKey,
_partsTable.columnPartNumber: i,
_partsTable.columnPartUrl: partsURLs[i],
_partsTable.columnPartStatus: _partStatus.pending,
_partsTable.columnPartStatus: PartStatus.pending.name,
},
);
}
@ -302,7 +298,7 @@ class UploadLocksDB {
await db.update(
_partsTable.table,
{
_partsTable.columnPartStatus: _partStatus.uploaded,
_partsTable.columnPartStatus: PartStatus.uploaded.name,
_partsTable.columnPartETag: etag,
},
where:
@ -313,7 +309,7 @@ class UploadLocksDB {
Future<void> updateTrackUploadStatus(
String objectKey,
String status,
MultipartStatus status,
) async {
final db = await instance.database;
await db.update(

View file

@ -18,19 +18,42 @@ class PartETag extends XmlParsableObject {
}
}
enum MultipartStatus {
pending,
uploaded,
completed,
}
enum PartStatus {
pending,
uploaded,
}
class MultipartInfo {
final List<bool>? partUploadStatus;
final Map<int, String>? partETags;
final int? partSize;
final MultipartUploadURLs urls;
final MultipartStatus status;
MultipartInfo({
this.partUploadStatus,
this.partETags,
this.partSize,
this.status = MultipartStatus.pending,
required this.urls,
});
}
class MultipartUploadURLs {
final String objectKey;
final List<String> partsURLs;
final String completeURL;
final List<bool>? partUploadStatus;
final Map<int, String>? partETags;
MultipartUploadURLs({
required this.objectKey,
required this.partsURLs,
required this.completeURL,
this.partUploadStatus,
this.partETags,
});
factory MultipartUploadURLs.fromMap(Map<String, dynamic> map) {

View file

@ -22,7 +22,7 @@ class MultiPartUploader {
this._s3Dio,
this._db,
this._featureFlagService,
) {}
);
Future<int> calculatePartCount(int fileSize) async {
final partCount = (fileSize / multipartPartSizeForUpload).ceil();
@ -72,21 +72,25 @@ class MultiPartUploader {
String localId,
String fileHash,
) async {
final (urls, status) = await _db.getCachedLinks(localId, fileHash);
final multipartInfo = await _db.getCachedLinks(localId, fileHash);
Map<int, String> etags = urls.partETags ?? {};
Map<int, String> etags = multipartInfo.partETags ?? {};
if (status == UploadLocksDB.trackStatus.pending) {
if (multipartInfo.status == MultipartStatus.pending) {
// upload individual parts and get their etags
etags = await _uploadParts(urls, encryptedFile);
etags = await _uploadParts(multipartInfo, encryptedFile);
}
if (status != UploadLocksDB.trackStatus.completed) {
if (multipartInfo.status != MultipartStatus.completed) {
// complete the multipart upload
await _completeMultipartUpload(urls.objectKey, etags, urls.completeURL);
await _completeMultipartUpload(
multipartInfo.urls.objectKey,
etags,
multipartInfo.urls.completeURL,
);
}
return urls.objectKey;
return multipartInfo.urls.objectKey;
}
Future<String> putMultipartFile(
@ -94,7 +98,10 @@ class MultiPartUploader {
File encryptedFile,
) async {
// upload individual parts and get their etags
final etags = await _uploadParts(urls, encryptedFile);
final etags = await _uploadParts(
MultipartInfo(urls: urls),
encryptedFile,
);
// complete the multipart upload
await _completeMultipartUpload(urls.objectKey, etags, urls.completeURL);
@ -103,30 +110,30 @@ class MultiPartUploader {
}
Future<Map<int, String>> _uploadParts(
MultipartUploadURLs url,
MultipartInfo partInfo,
File encryptedFile,
) async {
final partsURLs = url.partsURLs;
final partUploadStatus = url.partUploadStatus;
final partsURLs = partInfo.urls.partsURLs;
final partUploadStatus = partInfo.partUploadStatus;
final partsLength = partsURLs.length;
final etags = url.partETags ?? <int, String>{};
final etags = partInfo.partETags ?? <int, String>{};
for (int i = 0; i < partsLength; i++) {
if (i < (partUploadStatus?.length ?? 0) &&
(partUploadStatus?[i] ?? false)) {
continue;
}
final partSize = partInfo.partSize ?? multipartPartSizeForUpload;
final partURL = partsURLs[i];
final isLastPart = i == partsLength - 1;
final fileSize = isLastPart
? encryptedFile.lengthSync() % multipartPartSizeForUpload
: multipartPartSizeForUpload;
final fileSize =
isLastPart ? encryptedFile.lengthSync() % partSize : partSize;
final response = await _s3Dio.put(
partURL,
data: encryptedFile.openRead(
i * multipartPartSizeForUpload,
isLastPart ? null : (i + 1) * multipartPartSizeForUpload,
i * partSize,
isLastPart ? null : (i + 1) * partSize,
),
options: Options(
headers: {
@ -143,11 +150,11 @@ class MultiPartUploader {
etags[i] = eTag!;
await _db.updatePartStatus(url.objectKey, i, eTag);
await _db.updatePartStatus(partInfo.urls.objectKey, i, eTag);
}
await _db.updateTrackUploadStatus(
url.objectKey,
UploadLocksDB.trackStatus.uploaded,
partInfo.urls.objectKey,
MultipartStatus.uploaded,
);
return etags;
@ -179,7 +186,7 @@ class MultiPartUploader {
);
await _db.updateTrackUploadStatus(
objectKey,
UploadLocksDB.trackStatus.completed,
MultipartStatus.completed,
);
} catch (e) {
Logger("MultipartUpload").severe(e);