diff --git a/lib/src/database/daos/messages.dao.dart b/lib/src/database/daos/messages.dao.dart index 53556214..4115de9b 100644 --- a/lib/src/database/daos/messages.dao.dart +++ b/lib/src/database/daos/messages.dao.dart @@ -184,14 +184,27 @@ class MessagesDao extends DatabaseAccessor with _$MessagesDaoMixin { return; } 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... - await (delete( - mediaFiles, - )..where((t) => t.mediaId.equals(msg.mediaId!))).go(); + final otherMessagesWithSameMedia = await (select(messages) + ..where( + (t) => + t.mediaId.equals(msg.mediaId!) & + t.messageId.equals(messageId).not(), + )) + .get(); - final mediaService = await MediaFileService.fromMediaId(msg.mediaId!); - if (mediaService != null) { - mediaService.fullMediaRemoval(); + if (otherMessagesWithSameMedia.isEmpty) { + await (delete( + mediaFiles, + )..where((t) => t.mediaId.equals(msg.mediaId!))).go(); + + final mediaService = await MediaFileService.fromMediaId(msg.mediaId!); + if (mediaService != null) { + mediaService.fullMediaRemoval(); + } + } else { + Log.info( + 'Media ${msg.mediaId} is still used by ${otherMessagesWithSameMedia.length} other messages. Skipping physical deletion.', + ); } } await (delete( diff --git a/lib/src/services/api/mediafiles/upload.api.dart b/lib/src/services/api/mediafiles/upload.api.dart index 2e7dc975..60a28e37 100644 --- a/lib/src/services/api/mediafiles/upload.api.dart +++ b/lib/src/services/api/mediafiles/upload.api.dart @@ -204,11 +204,42 @@ Future finishStartedPreprocessing() async { // media files was just stored.. continue; } - Log.info( - 'Deleted media files, as originalPath and uploadRequestPath both do not exists', + if (mediaFile.reuploadRequestedBy != null) { + Log.warn( + 'Reupload requested for ${mediaFile.mediaId} but files are missing. Cancelling reupload but keeping record.', + ); + await twonlyDB.mediaFilesDao.updateMedia( + mediaFile.mediaId, + const MediaFilesCompanion( + uploadState: Value(UploadState.uploaded), + reuploadRequestedBy: Value(null), + ), + ); + continue; + } + + final messages = await twonlyDB.messagesDao.getMessagesByMediaId( + mediaFile.mediaId, ); - // the file does not exists anymore. - await twonlyDB.mediaFilesDao.deleteMediaFile(mediaFile.mediaId); + + if (messages.isEmpty) { + Log.info( + 'Deleted media files ${mediaFile.mediaId} as originalPath and uploadRequestPath both do not exists and no messages reference it.', + ); + // the file does not exists anymore and no messages reference it. + await twonlyDB.mediaFilesDao.deleteMediaFile(mediaFile.mediaId); + } else { + Log.warn( + 'Media files ${mediaFile.mediaId} missing but messages still reference it. Keeping record to avoid broken chat history.', + ); + // Just mark as uploaded to stop preprocessing attempts + await twonlyDB.mediaFilesDao.updateMedia( + mediaFile.mediaId, + const MediaFilesCompanion( + uploadState: Value(UploadState.uploaded), + ), + ); + } continue; } Log.info( diff --git a/lib/src/services/mediafiles/mediafile.service.dart b/lib/src/services/mediafiles/mediafile.service.dart index daffe410..7f08c4f4 100644 --- a/lib/src/services/mediafiles/mediafile.service.dart +++ b/lib/src/services/mediafiles/mediafile.service.dart @@ -78,7 +78,7 @@ class MediaFileService { final group = await twonlyDB.groupsDao.getGroup( message.groupId, ); - if (group != null && !group.isDirectChat) { + if (group != null) { delete = false; } }