From 06d7e00caea642cefcc0606c3226b6b23d00c7ae Mon Sep 17 00:00:00 2001 From: Diogo Date: Tue, 10 Dec 2024 11:12:24 +0000 Subject: [PATCH] types and db --- simplex-chat.cabal | 1 + src/Simplex/Chat/Controller.hs | 18 +++++++++ src/Simplex/Chat/Messages.hs | 2 + .../Chat/Migrations/M20241206_chat_tags.hs | 38 +++++++++++++++++++ src/Simplex/Chat/Types.hs | 17 +++++++++ 5 files changed, 76 insertions(+) create mode 100644 src/Simplex/Chat/Migrations/M20241206_chat_tags.hs diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 29e748c4e8..b72e84084b 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -155,6 +155,7 @@ library Simplex.Chat.Migrations.M20241125_indexes Simplex.Chat.Migrations.M20241128_business_chats Simplex.Chat.Migrations.M20241205_business_chat_members + Simplex.Chat.Migrations.M20241206_chat_tags Simplex.Chat.Mobile Simplex.Chat.Mobile.File Simplex.Chat.Mobile.Shared diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 593c328d0c..25cec647ff 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -294,11 +294,14 @@ data ChatCommand | ExecChatStoreSQL Text | ExecAgentStoreSQL Text | SlowSQLQueries + | APIGetChatTags | APIGetChats {userId :: UserId, pendingConnections :: Bool, pagination :: PaginationByTime, query :: ChatListQuery} | APIGetChat ChatRef ChatPagination (Maybe String) | APIGetChatItems ChatPagination (Maybe String) | APIGetChatItemInfo ChatRef ChatItemId | APISendMessages {chatRef :: ChatRef, liveMessage :: Bool, ttl :: Maybe Int, composedMessages :: NonEmpty ComposedMessage} + | APITagChat ChatRef ChatTagData + | APIUntagChat ChatTagId | APICreateChatItems {noteFolderId :: NoteFolderId, composedMessages :: NonEmpty ComposedMessage} | APIUpdateChatItem {chatRef :: ChatRef, chatItemId :: ChatItemId, liveMessage :: Bool, msgContent :: MsgContent} | APIDeleteChatItem ChatRef (NonEmpty ChatItemId) CIDeleteMode @@ -587,6 +590,7 @@ data ChatResponse | CRApiChats {user :: User, chats :: [AChat]} | CRChats {chats :: [AChat]} | CRApiChat {user :: User, chat :: AChat, navInfo :: Maybe NavigationInfo} + | CRChatTags {user :: User, chatTags :: [ChatTag]} | CRChatItems {user :: User, chatName_ :: Maybe ChatName, chatItems :: [AChatItem]} | CRChatItemInfo {user :: User, chatItem :: AChatItem, chatItemInfo :: ChatItemInfo} | CRChatItemId User (Maybe ChatItemId) @@ -617,6 +621,8 @@ data ChatResponse | CRContactCode {user :: User, contact :: Contact, connectionCode :: Text} | CRGroupMemberCode {user :: User, groupInfo :: GroupInfo, member :: GroupMember, connectionCode :: Text} | CRConnectionVerified {user :: User, verified :: Bool, expectedCode :: Text} + | CRChatTagged {user :: User, chatTags :: [ChatTag]} + | CRChatUntagged {user :: User, chatTagId :: ChatTagId} | CRNewChatItems {user :: User, chatItems :: [AChatItem]} | CRChatItemsStatusesUpdated {user :: User, chatItems :: [AChatItem]} | CRChatItemUpdated {user :: User, chatItem :: AChatItem} @@ -1068,6 +1074,16 @@ instance FromJSON ComposedMessage where parseJSON invalid = JT.prependFailure "bad ComposedMessage, " (JT.typeMismatch "Object" invalid) +data ChatTagData = ChatTagData + { emoji :: Text, + text :: Text + } + deriving (Show) + +instance FromJSON ChatTagData where + parseJSON (J.Object v) = ChatTagData <$> v .: "emoji" <*> v .: "text" + parseJSON invalid = JT.prependFailure "bad ChatTagData, " (JT.typeMismatch "Object" invalid) + data NtfConn = NtfConn { user_ :: Maybe User, connEntity_ :: Maybe ConnectionEntity, @@ -1603,3 +1619,5 @@ $(JQ.deriveFromJSON defaultJSON ''ArchiveConfig) $(JQ.deriveFromJSON defaultJSON ''DBEncryptionConfig) $(JQ.deriveToJSON defaultJSON ''ComposedMessage) + +$(JQ.deriveToJSON defaultJSON ''ChatTagData) diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs index a477deeb2c..059ff7e313 100644 --- a/src/Simplex/Chat/Messages.hs +++ b/src/Simplex/Chat/Messages.hs @@ -992,6 +992,8 @@ instance StrEncoding GroupSndStatus where type ChatItemId = Int64 +type ChatTagId = Int64 + type ChatItemTs = UTCTime data SChatType (c :: ChatType) where diff --git a/src/Simplex/Chat/Migrations/M20241206_chat_tags.hs b/src/Simplex/Chat/Migrations/M20241206_chat_tags.hs new file mode 100644 index 0000000000..a61c465f30 --- /dev/null +++ b/src/Simplex/Chat/Migrations/M20241206_chat_tags.hs @@ -0,0 +1,38 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Migrations.M20241206_chat_tags where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20241206_chat_tags :: Query +m20241206_chat_tags = + [sql| +CREATE TABLE chat_tags ( + chat_tag_id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER REFERENCES users, + chat_tag_text TEXT UNIQUE NOT NULL, + chat_tag_emoji TEXT UNIQUE NOT NULL +); + +CREATE TABLE chat_tags_chats ( + contact_id INTEGER REFERENCES contacts ON DELETE CASCADE, -- NULL for groups + group_id INTEGER REFERENCES groups ON DELETE CASCADE, -- NULL for contacts + chat_tag_id INTEGER NOT NULL REFERENCES chat_tags ON DELETE CASCADE, + UNIQUE(chat_tag_id, group_id), + UNIQUE(chat_tag_id, contact_id) +); + +CREATE INDEX idx_chat_tags_user_id ON chat_tags_chat(user_id); +|] + +down_m20241206_chat_tags :: Query +down_m20241206_chat_tags = + [sql| +DROP INDEX idx_chat_tags_user_id; +DROP INDEX idx_chat_tags_user_id_contact_id; +DROP INDEX idx_chat_tags_group_id_contact_id; + +DROP TABLE chat_tags_chats +DROP TABLE chat_tags; +|] \ No newline at end of file diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index 77a02a4bc1..40d67ffcf0 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -1637,6 +1637,21 @@ data CommandData = CommandData } deriving (Show) +data ChatTag = ChatTag + { chatTagId :: Int64, + userId :: UserId, + chatTagText :: Text, + chatTagEmoji :: Text + } + deriving (Show) + +data ChatTagChat = ChatTagChat + { chatTagId :: Int64, + contactId :: Maybe ContactId, + groupId :: Maybe GroupId + } + deriving (Show) + -- ad-hoc type for data required for XGrpMemIntro continuation data XGrpMemIntroCont = XGrpMemIntroCont { groupId :: GroupId, @@ -1791,3 +1806,5 @@ $(JQ.deriveJSON defaultJSON ''Contact) $(JQ.deriveJSON defaultJSON ''ContactRef) $(JQ.deriveJSON defaultJSON ''NoteFolder) + +$(JQ.deriveJSON defaultJSON ''ChatTag)