From 1c5eaf94ac000503024c822f799b6c277900eb4f Mon Sep 17 00:00:00 2001 From: IC Rainbow Date: Tue, 26 Dec 2023 12:33:17 +0200 Subject: [PATCH] add folder clear --- src/Simplex/Chat.hs | 20 +++++++++++++------- src/Simplex/Chat/Controller.hs | 2 +- src/Simplex/Chat/Store/NoteFolders.hs | 7 ++++++- tests/ChatTests/Local.hs | 4 ++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 361c098b9a..644bd3f370 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -1040,7 +1040,7 @@ processChatCommand' vr = \case withStore' $ \db -> deleteNoteFolder db user nf pure $ CRNoteFolderDeleted user nf CTContactRequest -> pure $ chatCmdError (Just user) "not supported" - APIClearChat (ChatRef cType chatId) -> withUser $ \user -> case cType of + APIClearChat (ChatRef cType chatId) -> withUser $ \user@User {userId} -> case cType of CTDirect -> do ct <- withStore $ \db -> getContact db user chatId filesInfo <- withStore' $ \db -> getContactFileInfo db user ct @@ -1055,7 +1055,14 @@ processChatCommand' vr = \case membersToDelete <- withStore' $ \db -> getGroupMembersForExpiration db user gInfo forM_ membersToDelete $ \m -> withStore' $ \db -> deleteGroupMember db user m pure $ CRChatCleared user (AChatInfo SCTGroup $ GroupChat gInfo) - CTLocal -> error "TODO: APIClearChat.CTLocal" + CTLocal -> do + nf <- withStore $ \db -> getNoteFolder db user chatId + filesInfo <- withStore' $ \db -> getNoteFolderFileInfo db user nf + withChatLock "clearChat local" . procCmd $ do + mapM_ (deleteFile user) filesInfo + withStore' $ \db -> deleteNoteFolderFiles db userId nf + withStore' $ \db -> deleteNoteFolderCIs db user nf + pure $ CRChatCleared user (AChatInfo SCTLocal $ LocalChat nf) CTContactConnection -> pure $ chatCmdError (Just user) "not supported" CTContactRequest -> pure $ chatCmdError (Just user) "not supported" APIAcceptContact incognito connReqId -> withUser $ \_ -> withChatLock "acceptContact" $ do @@ -1836,13 +1843,12 @@ processChatCommand' vr = \case quotedItemId <- withStore $ \db -> getGroupChatItemIdByText db user groupId cName quotedMsg let mc = MCText msg processChatCommand . APISendMessage (ChatRef CTGroup groupId) False Nothing $ ComposedMessage Nothing (Just quotedItemId) mc - -- APINewLocalChat userId localChatProfile -> withUserId userId $ \user -> do - -- checkValidName displayName - -- CRLocalChatCreated user <$> createLocalChat userId localChatProfile NewNoteFolder displayName -> withUser $ \user@User {userId} -> do - -- processChatCommand $ APINewLocalChat userId localChatProfile checkValidName displayName withStore $ \db -> CRNoteFolderCreated user <$> createNewNoteFolder db userId displayName + ClearNoteFolder displayName -> withUser $ \user -> do + folderId <- withStore $ \db -> getNoteFolderIdByName db user displayName + processChatCommand $ APIClearChat (ChatRef CTLocal folderId) DeleteNoteFolder displayName -> withUser $ \user -> do folderId <- withStore $ \db -> getNoteFolderIdByName db user displayName processChatCommand $ APIDeleteChat (ChatRef CTLocal folderId) True @@ -6367,7 +6373,7 @@ chatCommandP = ("/delete #" <|> "/d #") *> (DeleteGroup <$> displayName), ("/delete $" <|> "/d $") *> (DeleteNoteFolder <$> displayName), ("/delete " <|> "/d ") *> char_ '@' *> (DeleteContact <$> displayName), - -- TODO: "/clear $" *> (ClearNoteFolder <$> displayName), + "/clear $" *> (ClearNoteFolder <$> displayName), "/clear #" *> (ClearGroup <$> displayName), "/clear " *> char_ '@' *> (ClearContact <$> displayName), ("/members " <|> "/ms ") *> char_ '#' *> (ListMembers <$> displayName), diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index e43a2d0ba9..976a641643 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -408,8 +408,8 @@ data ChatCommand | DeleteGroupLink GroupName | ShowGroupLink GroupName | SendGroupMessageQuote {groupName :: GroupName, contactName_ :: Maybe ContactName, quotedMsg :: Text, message :: Text} - -- | APINewLocalChat UserId LocalChatProfile | NewNoteFolder NoteFolderName + | ClearNoteFolder NoteFolderName | DeleteNoteFolder NoteFolderName | LastChats (Maybe Int) -- UserId (not used in UI) | LastMessages (Maybe ChatName) Int (Maybe String) -- UserId (not used in UI) diff --git a/src/Simplex/Chat/Store/NoteFolders.hs b/src/Simplex/Chat/Store/NoteFolders.hs index 6755c9043c..86151751df 100644 --- a/src/Simplex/Chat/Store/NoteFolders.hs +++ b/src/Simplex/Chat/Store/NoteFolders.hs @@ -79,7 +79,12 @@ deleteNoteFolderFiles db userId NoteFolder {noteFolderId} = do AND chat_item_id IN ( SELECT chat_item_id FROM chat_items WHERE user_id = ? AND note_folder_id = ? ) - |] (userId, userId, noteFolderId) + |] + (userId, userId, noteFolderId) + +deleteNoteFolderCIs :: DB.Connection -> User -> NoteFolder -> IO () +deleteNoteFolderCIs db User {userId} NoteFolder {noteFolderId} = + DB.execute db [sql| DELETE FROM chat_items WHERE user_id = ? AND note_folder_id = ? |] (userId, noteFolderId) deleteNoteFolder :: DB.Connection -> User -> NoteFolder -> IO () deleteNoteFolder db User {userId} NoteFolder {noteFolderId} = diff --git a/tests/ChatTests/Local.hs b/tests/ChatTests/Local.hs index aed7e172b5..ebf499fe3e 100644 --- a/tests/ChatTests/Local.hs +++ b/tests/ChatTests/Local.hs @@ -70,6 +70,10 @@ testFiles tmp = withNewTestChat tmp "alice" aliceProfile $ \alice -> do alice ##> "/fs 1" alice <## "local file 1 (test.jpg)" + alice ##> "/clear $self" + alice ##> "/fs 1" + alice <## "chat db error: SEChatItemNotFoundByFileId {fileId = 1}" + createFolder :: TestCC -> String -> IO () createFolder cc label = do cc ##> ("/note folder " <> label)