mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-07-03 06:51:43 +00:00
e05a35e26e
* postgres: modules structure (#5401) * postgres: schema, field conversions (#5430) * postgres: rework chat list pagination query (#5441) * prepare cabal for merge * restore cabal changes * simplexmq * postgres: implementation wip (tests don't pass) (#5481) * restore ios file * postgres: implementation - tests pass (#5487) * refactor DB options * refactor * line * style * style * refactor * $ * update simplexmq * constraintError * handleDBErrors * fix * remove param * Ok * case * case * case * comment --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
77 lines
3.1 KiB
Haskell
77 lines
3.1 KiB
Haskell
{-# LANGUAGE CPP #-}
|
|
{-# LANGUAGE DuplicateRecordFields #-}
|
|
{-# LANGUAGE LambdaCase #-}
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
{-# LANGUAGE ScopedTypeVariables #-}
|
|
|
|
module Simplex.Chat.Store.NoteFolders where
|
|
|
|
import Control.Monad.Except (ExceptT (..), throwError)
|
|
import Control.Monad.IO.Class (liftIO)
|
|
import Data.Time (getCurrentTime)
|
|
import Simplex.Chat.Store.Shared (StoreError (..))
|
|
import Simplex.Chat.Types (NoteFolder (..), NoteFolderId, User (..))
|
|
import Simplex.Messaging.Agent.Protocol (UserId)
|
|
import Simplex.Messaging.Agent.Store.AgentStore (firstRow)
|
|
import Simplex.Messaging.Agent.Store.DB (BoolInt (..))
|
|
import qualified Simplex.Messaging.Agent.Store.DB as DB
|
|
#if defined(dbPostgres)
|
|
import Database.PostgreSQL.Simple (Only (..))
|
|
import Database.PostgreSQL.Simple.SqlQQ (sql)
|
|
#else
|
|
import Database.SQLite.Simple (Only (..))
|
|
import Database.SQLite.Simple.QQ (sql)
|
|
#endif
|
|
|
|
createNoteFolder :: DB.Connection -> User -> ExceptT StoreError IO ()
|
|
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 $ SENoteFolderAlreadyExists noteFolderId
|
|
|
|
getUserNoteFolderId :: DB.Connection -> User -> ExceptT StoreError IO NoteFolderId
|
|
getUserNoteFolderId db User {userId} =
|
|
ExceptT . firstRow fromOnly SEUserNoteFolderNotFound $
|
|
DB.query db "SELECT note_folder_id FROM note_folders WHERE user_id = ?" (Only userId)
|
|
|
|
getNoteFolder :: DB.Connection -> User -> NoteFolderId -> ExceptT StoreError IO NoteFolder
|
|
getNoteFolder db User {userId} noteFolderId =
|
|
ExceptT . firstRow toNoteFolder (SENoteFolderNotFound noteFolderId) $
|
|
DB.query
|
|
db
|
|
[sql|
|
|
SELECT
|
|
created_at, updated_at, chat_ts, favorite, unread_chat
|
|
FROM note_folders
|
|
WHERE user_id = ?
|
|
AND note_folder_id = ?
|
|
|]
|
|
(userId, noteFolderId)
|
|
where
|
|
toNoteFolder (createdAt, updatedAt, chatTs, BI favorite, BI unread) =
|
|
NoteFolder {noteFolderId, userId, createdAt, updatedAt, chatTs, favorite, unread}
|
|
|
|
updateNoteFolderUnreadChat :: DB.Connection -> User -> NoteFolder -> Bool -> IO ()
|
|
updateNoteFolderUnreadChat db User {userId} NoteFolder {noteFolderId} unreadChat = do
|
|
updatedAt <- getCurrentTime
|
|
DB.execute db "UPDATE note_folders SET unread_chat = ?, updated_at = ? WHERE user_id = ? AND note_folder_id = ?" (BI unreadChat, updatedAt, userId, noteFolderId)
|
|
|
|
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)
|
|
|
|
deleteNoteFolderCIs :: DB.Connection -> User -> NoteFolder -> IO ()
|
|
deleteNoteFolderCIs db User {userId} NoteFolder {noteFolderId} =
|
|
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND note_folder_id = ?" (userId, noteFolderId)
|