fix issue with opening media files
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run

This commit is contained in:
otsmr 2026-03-14 16:37:18 +01:00
parent 4b1e6a9a44
commit cdaca940df

View file

@ -44,26 +44,23 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
} }
Stream<List<Message>> watchMediaNotOpened(String groupId) { Stream<List<Message>> watchMediaNotOpened(String groupId) {
final query = select(messages).join([ final query =
leftOuterJoin(mediaFiles, mediaFiles.mediaId.equalsExp(messages.mediaId)), select(messages).join([
]) leftOuterJoin(
..where( mediaFiles,
mediaFiles.downloadState mediaFiles.mediaId.equalsExp(messages.mediaId),
.equals(DownloadState.reuploadRequested.name) ),
.not() & ])..where(
mediaFiles.uploadState mediaFiles.downloadState
.equals(UploadState.fileLimitReached.name) .equals(DownloadState.reuploadRequested.name)
.not() & .not() &
mediaFiles.uploadState mediaFiles.type.equals(MediaType.audio.name).not() &
.equals(UploadState.uploadLimitReached.name) messages.openedAt.isNull() &
.not() & messages.groupId.equals(groupId) &
mediaFiles.type.equals(MediaType.audio.name).not() & messages.mediaId.isNotNull() &
messages.openedAt.isNull() & messages.senderId.isNotNull() &
messages.groupId.equals(groupId) & messages.type.equals(MessageType.media.name),
messages.mediaId.isNotNull() & );
messages.senderId.isNotNull() &
messages.type.equals(MessageType.media.name),
);
return query.map((row) => row.readTable(messages)).watch(); return query.map((row) => row.readTable(messages)).watch();
} }
@ -76,8 +73,7 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
} }
Stream<List<Message>> watchByGroupId(String groupId) { Stream<List<Message>> watchByGroupId(String groupId) {
return ((select(messages) return ((select(messages)..where(
..where(
(t) => (t) =>
t.groupId.equals(groupId) & t.groupId.equals(groupId) &
(t.isDeletedFromSender.equals(true) | (t.isDeletedFromSender.equals(true) |
@ -98,21 +94,22 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
contacts, contacts,
contacts.userId.equalsExp(groupMembers.contactId), contacts.userId.equalsExp(groupMembers.contactId),
), ),
]) ])..where(groupMembers.groupId.equals(groupId)));
..where(groupMembers.groupId.equals(groupId)));
return query return query
.map((row) => (row.readTable(groupMembers), row.readTable(contacts))) .map((row) => (row.readTable(groupMembers), row.readTable(contacts)))
.watch(); .watch();
} }
Stream<List<MessageAction>> watchMessageActionChanges(String messageId) { Stream<List<MessageAction>> watchMessageActionChanges(String messageId) {
return (select(messageActions)..where((t) => t.messageId.equals(messageId))) return (select(
.watch(); messageActions,
)..where((t) => t.messageId.equals(messageId))).watch();
} }
Stream<Message?> watchMessageById(String messageId) { Stream<Message?> watchMessageById(String messageId) {
return (select(messages)..where((t) => t.messageId.equals(messageId))) return (select(
.watchSingleOrNull(); messages,
)..where((t) => t.messageId.equals(messageId))).watchSingleOrNull();
} }
Future<void> purgeMessageTable() async { Future<void> purgeMessageTable() async {
@ -120,35 +117,33 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
for (final group in allGroups) { for (final group in allGroups) {
final deletionTime = clock.now().subtract( final deletionTime = clock.now().subtract(
Duration( Duration(
milliseconds: group.deleteMessagesAfterMilliseconds, milliseconds: group.deleteMessagesAfterMilliseconds,
), ),
); );
await (delete(messages) await (delete(messages)..where(
..where( (m) =>
(m) => m.groupId.equals(group.groupId) &
m.groupId.equals(group.groupId) & (m.mediaStored.equals(true) &
(m.mediaStored.equals(true) & m.isDeletedFromSender.equals(true) |
m.isDeletedFromSender.equals(true) | m.mediaStored.equals(false)) &
m.mediaStored.equals(false)) & (m.openedAt.isSmallerThanValue(deletionTime) |
(m.openedAt.isSmallerThanValue(deletionTime) | (m.isDeletedFromSender.equals(true) &
(m.isDeletedFromSender.equals(true) & m.createdAt.isSmallerThanValue(deletionTime))),
m.createdAt.isSmallerThanValue(deletionTime))), ))
))
.go(); .go();
} }
} }
Future<void> openedAllTextMessages(String groupId) { Future<void> openedAllTextMessages(String groupId) {
final updates = MessagesCompanion(openedAt: Value(clock.now())); final updates = MessagesCompanion(openedAt: Value(clock.now()));
return (update(messages) return (update(messages)..where(
..where( (t) =>
(t) => t.groupId.equals(groupId) &
t.groupId.equals(groupId) & t.senderId.isNotNull() &
t.senderId.isNotNull() & t.openedAt.isNull() &
t.openedAt.isNull() & t.type.equals(MessageType.text.name),
t.type.equals(MessageType.text.name), ))
))
.write(updates); .write(updates);
} }
@ -164,29 +159,29 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
} }
if (msg.mediaId != null && contactId != null) { if (msg.mediaId != null && contactId != null) {
// contactId -> When a image is send to multiple and one message is delete the image should be still available... // contactId -> When a image is send to multiple and one message is delete the image should be still available...
await (delete(mediaFiles)..where((t) => t.mediaId.equals(msg.mediaId!))) await (delete(
.go(); mediaFiles,
)..where((t) => t.mediaId.equals(msg.mediaId!))).go();
final mediaService = await MediaFileService.fromMediaId(msg.mediaId!); final mediaService = await MediaFileService.fromMediaId(msg.mediaId!);
if (mediaService != null) { if (mediaService != null) {
mediaService.fullMediaRemoval(); mediaService.fullMediaRemoval();
} }
} }
await (delete(messageHistories) await (delete(
..where((t) => t.messageId.equals(messageId))) messageHistories,
.go(); )..where((t) => t.messageId.equals(messageId))).go();
await (update(messages) await (update(messages)..where(
..where( (t) => t.messageId.equals(messageId),
(t) => t.messageId.equals(messageId), ))
))
.write( .write(
const MessagesCompanion( const MessagesCompanion(
isDeletedFromSender: Value(true), isDeletedFromSender: Value(true),
content: Value(null), content: Value(null),
mediaId: Value(null), mediaId: Value(null),
), ),
); );
} }
Future<void> handleTextEdit( Future<void> handleTextEdit(
@ -206,16 +201,15 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
createdAt: Value(timestamp), createdAt: Value(timestamp),
), ),
); );
await (update(messages) await (update(messages)..where(
..where( (t) => t.messageId.equals(messageId),
(t) => t.messageId.equals(messageId), ))
))
.write( .write(
MessagesCompanion( MessagesCompanion(
content: Value(text), content: Value(text),
modifiedAt: Value(timestamp), modifiedAt: Value(timestamp),
), ),
); );
} }
Future<void> handleMessagesOpened( Future<void> handleMessagesOpened(
@ -238,8 +232,10 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
} }
for (final messageId in messageIds) { for (final messageId in messageIds) {
final isOpenedByAll = final isOpenedByAll = await haveAllMembers(
await haveAllMembers(messageId, MessageActionType.openedAt); messageId,
MessageActionType.openedAt,
);
final now = clock.now(); final now = clock.now();
batch.update( batch.update(
@ -277,17 +273,19 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
String messageId, String messageId,
MessageActionType action, MessageActionType action,
) async { ) async {
final message = final message = await twonlyDB.messagesDao
await twonlyDB.messagesDao.getMessageById(messageId).getSingleOrNull(); .getMessageById(messageId)
.getSingleOrNull();
if (message == null) return true; if (message == null) return true;
final members = final members = await twonlyDB.groupsDao.getGroupNonLeftMembers(
await twonlyDB.groupsDao.getGroupNonLeftMembers(message.groupId); message.groupId,
);
final actions = await (select(messageActions) final actions =
..where( await (select(messageActions)..where(
(t) => t.type.equals(action.name) & t.messageId.equals(messageId), (t) => t.type.equals(action.name) & t.messageId.equals(messageId),
)) ))
.get(); .get();
return members.length == actions.length; return members.length == actions.length;
} }
@ -296,16 +294,18 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
String messageId, String messageId,
MessagesCompanion updatedValues, MessagesCompanion updatedValues,
) async { ) async {
await (update(messages)..where((c) => c.messageId.equals(messageId))) await (update(
.write(updatedValues); messages,
)..where((c) => c.messageId.equals(messageId))).write(updatedValues);
} }
Future<void> updateMessagesByMediaId( Future<void> updateMessagesByMediaId(
String mediaId, String mediaId,
MessagesCompanion updatedValues, MessagesCompanion updatedValues,
) { ) {
return (update(messages)..where((c) => c.mediaId.equals(mediaId))) return (update(
.write(updatedValues); messages,
)..where((c) => c.mediaId.equals(mediaId))).write(updatedValues);
} }
Future<Message?> insertMessage(MessagesCompanion message) async { Future<Message?> insertMessage(MessagesCompanion message) async {
@ -339,8 +339,9 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
); );
} }
return await (select(messages)..where((t) => t.rowId.equals(rowId))) return await (select(
.getSingle(); messages,
)..where((t) => t.rowId.equals(rowId))).getSingle();
} catch (e) { } catch (e) {
Log.error('Could not insert message: $e'); Log.error('Could not insert message: $e');
return null; return null;
@ -348,11 +349,10 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
} }
Future<MessageAction?> getLastMessageAction(String messageId) async { Future<MessageAction?> getLastMessageAction(String messageId) async {
return (((select(messageActions) return (((select(messageActions)..where(
..where( (t) => t.messageId.equals(messageId),
(t) => t.messageId.equals(messageId), ))
)) ..orderBy([(t) => OrderingTerm.desc(t.actionAt)]))
..orderBy([(t) => OrderingTerm.desc(t.actionAt)]))
..limit(1)) ..limit(1))
.getSingleOrNull(); .getSingleOrNull();
} }
@ -379,8 +379,7 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
contacts, contacts,
contacts.userId.equalsExp(messageActions.contactId), contacts.userId.equalsExp(messageActions.contactId),
), ),
]) ])..where(messageActions.messageId.equals(messageId)));
..where(messageActions.messageId.equals(messageId)));
return query return query
.map((row) => (row.readTable(messageActions), row.readTable(contacts))) .map((row) => (row.readTable(messageActions), row.readTable(contacts)))
.watch(); .watch();