mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
87 lines
3.3 KiB
Haskell
87 lines
3.3 KiB
Haskell
{-# LANGUAGE DuplicateRecordFields #-}
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
|
|
module Simplex.Chat.Store.NoteFolders where
|
|
|
|
import Control.Monad.Except (ExceptT (..), runExceptT)
|
|
import Control.Monad.IO.Class (liftIO)
|
|
import Data.Text (Text)
|
|
import Data.Time (getCurrentTime)
|
|
import Database.SQLite.Simple (Only (..))
|
|
import Database.SQLite.Simple.QQ (sql)
|
|
import Simplex.Chat.Store.Shared (StoreError (..), insertedRowId, withLocalDisplayName)
|
|
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
|
|
|
|
createNewNoteFolder :: DB.Connection -> UserId -> Text -> ExceptT StoreError IO NoteFolder
|
|
createNewNoteFolder db userId displayName = do
|
|
ts <- liftIO getCurrentTime
|
|
ExceptT $ withLocalDisplayName db userId displayName $ \localDisplayName -> runExceptT $ do
|
|
liftIO $ do
|
|
DB.execute
|
|
db
|
|
[sql|
|
|
INSERT INTO note_folders
|
|
(user_id, display_name, local_display_name, created_at, updated_at, chat_ts, favorite, unread_chat)
|
|
VALUES
|
|
(?, ?, ?, ?, ?, ?, ?, ?)
|
|
|]
|
|
(userId, displayName, localDisplayName, ts, ts, ts, favorite, unread)
|
|
noteFolderId <- insertedRowId db
|
|
pure
|
|
NoteFolder
|
|
{ noteFolderId,
|
|
userId,
|
|
displayName,
|
|
localDisplayName,
|
|
createdAt = ts,
|
|
updatedAt = ts,
|
|
chatTs = ts,
|
|
favorite,
|
|
unread
|
|
}
|
|
where
|
|
favorite = False
|
|
unread = False
|
|
|
|
getNoteFolderIdByName :: DB.Connection -> User -> NoteFolderName -> ExceptT StoreError IO NoteFolderId
|
|
getNoteFolderIdByName db User {userId} ldn =
|
|
ExceptT . firstRow fromOnly (SENoteFolderNotFoundByName ldn) $
|
|
DB.query db [sql| SELECT note_folder_id FROM note_folders WHERE user_id = ? AND local_display_name = ? |] (userId, ldn)
|
|
|
|
getNoteFolder :: DB.Connection -> User -> NoteFolderId -> ExceptT StoreError IO NoteFolder
|
|
getNoteFolder db User {userId} noteFolderId =
|
|
ExceptT . firstRow toNoteFolder (SENoteFolderNotFound noteFolderId) $
|
|
DB.query
|
|
db
|
|
[sql|
|
|
SELECT
|
|
display_name, local_display_name, created_at, updated_at, chat_ts, favorite, unread_chat
|
|
FROM note_folders
|
|
WHERE user_id = ?
|
|
AND note_folder_id = ?
|
|
|]
|
|
(userId, noteFolderId)
|
|
where
|
|
toNoteFolder (displayName, localDisplayName, createdAt, updatedAt, chatTs, favorite, unread) =
|
|
NoteFolder {noteFolderId, userId, displayName, localDisplayName, createdAt, updatedAt, chatTs, favorite, unread}
|
|
|
|
deleteNoteFolderFiles :: DB.Connection -> UserId -> NoteFolder -> IO ()
|
|
deleteNoteFolderFiles db userId NoteFolder {noteFolderId} = do
|
|
DB.execute
|
|
db
|
|
[sql|
|
|
DELETE FROM files
|
|
WHERE user_id = ?
|
|
AND chat_item_id IN (
|
|
SELECT chat_item_id FROM chat_items WHERE user_id = ? AND note_folder_id = ?
|
|
)
|
|
|] (userId, userId, noteFolderId)
|
|
|
|
deleteNoteFolder :: DB.Connection -> User -> NoteFolder -> IO ()
|
|
deleteNoteFolder db User {userId} NoteFolder {noteFolderId} =
|
|
DB.execute db [sql| DELETE FROM note_folders WHERE user_id = ? AND note_folder_id = ? |] (userId, noteFolderId)
|