diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 9615a9acc6..280dbd0458 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -6151,7 +6151,7 @@ getCreateActiveUser st testView = do loop Left e -> putStrLn ("database error " <> show e) >> exitFailure Right user -> do - void . withTransaction st $ \db -> runExceptT $ createNoteFolder db user + void . withTransaction st $ \db -> runExceptT $ createNoteFolder db user >> createNoteFolder db user pure user selectUser :: [User] -> IO User selectUser [user@User {userId}] = do diff --git a/src/Simplex/Chat/Migrations/M20240102_note_folders.hs b/src/Simplex/Chat/Migrations/M20240102_note_folders.hs index 6a5d6a0217..6e0fbe5e41 100644 --- a/src/Simplex/Chat/Migrations/M20240102_note_folders.hs +++ b/src/Simplex/Chat/Migrations/M20240102_note_folders.hs @@ -23,7 +23,7 @@ m20240102_note_folders = CREATE INDEX chat_items_note_folder_id ON chat_items(note_folder_id); CREATE INDEX files_note_folder_id ON files(note_folder_id); - CREATE UNIQUE INDEX note_folders_user_id ON note_folders(user_id); -- drop UNIQUE for more folders per user + CREATE INDEX note_folders_user_id ON note_folders(user_id); INSERT INTO note_folders (user_id) SELECT user_id FROM users; |] diff --git a/src/Simplex/Chat/Migrations/chat_schema.sql b/src/Simplex/Chat/Migrations/chat_schema.sql index 01d4a4f0cb..c8445f8572 100644 --- a/src/Simplex/Chat/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Migrations/chat_schema.sql @@ -825,4 +825,4 @@ CREATE INDEX idx_msg_deliveries_agent_msg_id ON "msg_deliveries"( ); CREATE INDEX chat_items_note_folder_id ON chat_items(note_folder_id); CREATE INDEX files_note_folder_id ON files(note_folder_id); -CREATE UNIQUE INDEX note_folders_user_id ON note_folders(user_id); +CREATE INDEX note_folders_user_id ON note_folders(user_id); diff --git a/src/Simplex/Chat/Store/NoteFolders.hs b/src/Simplex/Chat/Store/NoteFolders.hs index 217962e340..b480432def 100644 --- a/src/Simplex/Chat/Store/NoteFolders.hs +++ b/src/Simplex/Chat/Store/NoteFolders.hs @@ -1,25 +1,28 @@ {-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE ScopedTypeVariables #-} module Simplex.Chat.Store.NoteFolders where -import Control.Monad.Except (ExceptT (..)) +import Control.Monad.Except (ExceptT (..), throwError) import Control.Monad.IO.Class (liftIO) import Data.Time (getCurrentTime) import Database.SQLite.Simple (Only (..)) import Database.SQLite.Simple.QQ (sql) -import Simplex.Chat.Store.Shared (StoreError (..), checkConstraint) +import Simplex.Chat.Store.Shared (StoreError (..)) import Simplex.Chat.Types (NoteFolder (..), NoteFolderId, NoteFolderName, User (..)) import Simplex.Messaging.Agent.Protocol (UserId) import Simplex.Messaging.Agent.Store.SQLite (firstRow) import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB createNoteFolder :: DB.Connection -> User -> ExceptT StoreError IO () -createNoteFolder db User {userId} = - checkConstraint SENoteFolderAlreadyCreated . liftIO $ - DB.execute db "INSERT INTO note_folders (user_id) VALUES (?)" (Only userId) +createNoteFolder db User {userId} = do + liftIO (DB.query db "SELECT note_folder_id FROM note_folders WHERE user_id = ? LIMIT 1" $ Only userId) >>= \case + [] -> liftIO $ DB.execute db "INSERT INTO note_folders (user_id) VALUES (?)" (Only userId) + Only noteFolderId : _ -> throwError $ SENoteFolderAlreadyCreated {noteFolderId} getNoteFolderIdByName :: DB.Connection -> User -> NoteFolderName -> ExceptT StoreError IO NoteFolderId getNoteFolderIdByName db User {userId} ldn = diff --git a/src/Simplex/Chat/Store/Shared.hs b/src/Simplex/Chat/Store/Shared.hs index 58fc9ce4bf..a2d18105a5 100644 --- a/src/Simplex/Chat/Store/Shared.hs +++ b/src/Simplex/Chat/Store/Shared.hs @@ -69,7 +69,7 @@ data StoreError | SEDuplicateGroupMember | SEGroupAlreadyJoined | SEGroupInvitationNotFound - | SENoteFolderAlreadyCreated + | SENoteFolderAlreadyCreated {noteFolderId :: NoteFolderId} | SENoteFolderNotFound {noteFolderId :: NoteFolderId} | SENoteFolderNotFoundByName {noteFolderName :: NoteFolderName} | SESndFileNotFound {fileId :: FileTransferId}