diff --git a/simplex-chat.cabal b/simplex-chat.cabal index d599377fdc..615a4a84cd 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -52,6 +52,7 @@ library Simplex.Chat.Migrations.M20220926_connection_alias Simplex.Chat.Migrations.M20220928_settings Simplex.Chat.Migrations.M20221001_shared_msg_id_indices + Simplex.Chat.Migrations.M20221003_delete_broken_integrity_error_chat_items Simplex.Chat.Mobile Simplex.Chat.Options Simplex.Chat.ProfileGenerator diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs index 79ccb2cdcd..5782609dfa 100644 --- a/src/Simplex/Chat/Messages.hs +++ b/src/Simplex/Chat/Messages.hs @@ -35,7 +35,7 @@ import Simplex.Chat.Types import Simplex.Chat.Util (safeDecodeUtf8) import Simplex.Messaging.Agent.Protocol (AgentErrorType, AgentMsgId, MsgErrorType (..), MsgMeta (..)) import Simplex.Messaging.Encoding.String -import Simplex.Messaging.Parsers (dropPrefix, enumJSON, fromTextField_, singleFieldJSON, sumTypeJSON) +import Simplex.Messaging.Parsers (dropPrefix, enumJSON, fromTextField_, singleFieldJSON, sumTypeJSON, fstToLower) import Simplex.Messaging.Protocol (MsgBody) import Simplex.Messaging.Util (eitherToMaybe, (<$?>)) @@ -596,6 +596,15 @@ instance ToJSON DBSndGroupEvent where toJSON (SGE v) = J.genericToJSON (singleFieldJSON $ dropPrefix "SGE") v toEncoding (SGE v) = J.genericToEncoding (singleFieldJSON $ dropPrefix "SGE") v +newtype DBMsgErrorType = DBME MsgErrorType + +instance FromJSON DBMsgErrorType where + parseJSON v = DBME <$> J.genericParseJSON (singleFieldJSON fstToLower) v + +instance ToJSON DBMsgErrorType where + toJSON (DBME v) = J.genericToJSON (singleFieldJSON fstToLower) v + toEncoding (DBME v) = J.genericToEncoding (singleFieldJSON fstToLower) v + data CIGroupInvitation = CIGroupInvitation { groupId :: GroupId, groupMemberId :: GroupMemberId, @@ -729,7 +738,7 @@ data DBJSONCIContent | DBJCIRcvDeleted {deleteMode :: CIDeleteMode} | DBJCISndCall {status :: CICallStatus, duration :: Int} | DBJCIRcvCall {status :: CICallStatus, duration :: Int} - | DBJCIRcvIntegrityError {msgError :: MsgErrorType} + | DBJCIRcvIntegrityError {msgError :: DBMsgErrorType} | DBJCIRcvGroupInvitation {groupInvitation :: CIGroupInvitation, memberRole :: GroupMemberRole} | DBJCISndGroupInvitation {groupInvitation :: CIGroupInvitation, memberRole :: GroupMemberRole} | DBJCIRcvGroupEvent {rcvGroupEvent :: DBRcvGroupEvent} @@ -751,7 +760,7 @@ dbJsonCIContent = \case CIRcvDeleted cidm -> DBJCIRcvDeleted cidm CISndCall status duration -> DBJCISndCall {status, duration} CIRcvCall status duration -> DBJCIRcvCall {status, duration} - CIRcvIntegrityError err -> DBJCIRcvIntegrityError err + CIRcvIntegrityError err -> DBJCIRcvIntegrityError $ DBME err CIRcvGroupInvitation groupInvitation memberRole -> DBJCIRcvGroupInvitation {groupInvitation, memberRole} CISndGroupInvitation groupInvitation memberRole -> DBJCISndGroupInvitation {groupInvitation, memberRole} CIRcvGroupEvent rge -> DBJCIRcvGroupEvent $ RGE rge @@ -765,7 +774,7 @@ aciContentDBJSON = \case DBJCIRcvDeleted cidm -> ACIContent SMDRcv $ CIRcvDeleted cidm DBJCISndCall {status, duration} -> ACIContent SMDSnd $ CISndCall status duration DBJCIRcvCall {status, duration} -> ACIContent SMDRcv $ CIRcvCall status duration - DBJCIRcvIntegrityError err -> ACIContent SMDRcv $ CIRcvIntegrityError err + DBJCIRcvIntegrityError (DBME err) -> ACIContent SMDRcv $ CIRcvIntegrityError err DBJCIRcvGroupInvitation {groupInvitation, memberRole} -> ACIContent SMDRcv $ CIRcvGroupInvitation groupInvitation memberRole DBJCISndGroupInvitation {groupInvitation, memberRole} -> ACIContent SMDSnd $ CISndGroupInvitation groupInvitation memberRole DBJCIRcvGroupEvent (RGE rge) -> ACIContent SMDRcv $ CIRcvGroupEvent rge diff --git a/src/Simplex/Chat/Migrations/M20221003_delete_broken_integrity_error_chat_items.hs b/src/Simplex/Chat/Migrations/M20221003_delete_broken_integrity_error_chat_items.hs new file mode 100644 index 0000000000..2d451766cd --- /dev/null +++ b/src/Simplex/Chat/Migrations/M20221003_delete_broken_integrity_error_chat_items.hs @@ -0,0 +1,12 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Migrations.M20221003_delete_broken_integrity_error_chat_items where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20221003_delete_broken_integrity_error_chat_items :: Query +m20221003_delete_broken_integrity_error_chat_items = + [sql| +DELETE FROM chat_items WHERE item_content LIKE '%{"rcvIntegrityError":{%'; +|] diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs index 77e8457f82..16ef3c8ab0 100644 --- a/src/Simplex/Chat/Store.hs +++ b/src/Simplex/Chat/Store.hs @@ -257,6 +257,7 @@ import Simplex.Chat.Migrations.M20220909_commands import Simplex.Chat.Migrations.M20220926_connection_alias import Simplex.Chat.Migrations.M20220928_settings import Simplex.Chat.Migrations.M20221001_shared_msg_id_indices +import Simplex.Chat.Migrations.M20221003_delete_broken_integrity_error_chat_items import Simplex.Chat.Protocol import Simplex.Chat.Types import Simplex.Messaging.Agent.Protocol (ACorrId, AgentMsgId, ConnId, InvitationId, MsgMeta (..)) @@ -294,7 +295,8 @@ schemaMigrations = ("20220909_commands", m20220909_commands), ("20220926_connection_alias", m20220926_connection_alias), ("20220928_settings", m20220928_settings), - ("20221001_shared_msg_id_indices", m20221001_shared_msg_id_indices) + ("20221001_shared_msg_id_indices", m20221001_shared_msg_id_indices), + ("20221003_delete_broken_integrity_error_chat_items", m20221003_delete_broken_integrity_error_chat_items) ] -- | The list of migrations in ascending order by date