import 'dart:convert'; import 'package:drift/drift.dart'; enum MediaType { image, video, gif, audio, } enum UploadState { // Image/Video was taken. A database entry was created to track it... initialized, // Image was stored but not send storedOnly, // At this point the user is finished with editing, and the media file can be uploaded preprocessing, uploading, backgroundUploadTaskStarted, uploaded, uploadLimitReached, // File is to big to be uploaded fileLimitReached, // readyToUpload, // uploadTaskStarted, // receiverNotified, } enum DownloadState { pending, downloading, downloaded, ready, reuploadRequested, } @DataClassName('MediaFile') class MediaFiles extends Table { TextColumn get mediaId => text()(); TextColumn get type => textEnum()(); TextColumn get uploadState => textEnum().nullable()(); TextColumn get downloadState => textEnum().nullable()(); BoolColumn get requiresAuthentication => boolean().withDefault(const Constant(false))(); BoolColumn get stored => boolean().withDefault(const Constant(false))(); BoolColumn get isDraftMedia => boolean().withDefault(const Constant(false))(); IntColumn get preProgressingProcess => integer().nullable()(); TextColumn get reuploadRequestedBy => text().map(IntListTypeConverter()).nullable()(); IntColumn get displayLimitInMilliseconds => integer().nullable()(); BoolColumn get removeAudio => boolean().nullable()(); BlobColumn get downloadToken => blob().nullable()(); BlobColumn get encryptionKey => blob().nullable()(); BlobColumn get encryptionMac => blob().nullable()(); BlobColumn get encryptionNonce => blob().nullable()(); BlobColumn get storedFileHash => blob().nullable()(); DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); @override Set get primaryKey => {mediaId}; } class IntListTypeConverter extends TypeConverter, String> { @override List fromSql(String fromDb) { return List.from(jsonDecode(fromDb) as Iterable); } @override String toSql(List value) { return json.encode(value); } }