core: groups api (#806)

This commit is contained in:
JRoberts authored and GitHub committed 2022-07-12 19:20:56 +04:00
1 parent 494de9bc43
commit ad5edeba6c
5 files changed
+88 -47

No files matched your search

+8 -2
View File
@@ -135,6 +135,12 @@ data ChatCommand
| APIVerifyToken DeviceToken C.CbNonce ByteString
| APIDeleteToken DeviceToken
| APIGetNtfMessage {nonce :: C.CbNonce, encNtfInfo :: ByteString}
| APIAddMember GroupId ContactId GroupMemberRole
| APIJoinGroup GroupId
| APIMemberRole GroupId GroupMemberId GroupMemberRole
| APIRemoveMember GroupId GroupMemberId
| APILeaveGroup GroupId
| APIListMembers GroupId
| GetUserSMPServers
| SetUserSMPServers [SMPServer]
| ChatHelp HelpSection
@@ -159,8 +165,8 @@ data ChatCommand
| NewGroup GroupProfile
| AddMember GroupName ContactName GroupMemberRole
| JoinGroup GroupName
| RemoveMember GroupName ContactName
| MemberRole GroupName ContactName GroupMemberRole
| RemoveMember GroupName ContactName
| LeaveGroup GroupName
| DeleteGroup GroupName
| ClearGroup GroupName
@@ -366,7 +372,7 @@ data ChatErrorType
| CEGroupNotJoined {groupInfo :: GroupInfo}
| CEGroupMemberNotActive
| CEGroupMemberUserRemoved
| CEGroupMemberNotFound {contactName :: ContactName}
| CEGroupMemberNotFound
| CEGroupMemberIntroNotFound {contactName :: ContactName}
| CEGroupCantResendInvitation {groupInfo :: GroupInfo, contactName :: ContactName}
| CEGroupInternal {message :: String}
+15 -15
View File
@@ -63,7 +63,7 @@ module Simplex.Chat.Store
getGroup,
getGroupInfo,
getGroupIdByName,
getGroupByName,
getGroupMemberIdByName,
getGroupInfoByName,
getGroupMembers,
deleteGroup,
@@ -1327,12 +1327,7 @@ createGroupInvitation db user@User {userId} contact@Contact {contactId} GroupInv
-- TODO return the last connection that is ready, not any last connection
-- requires updating connection status
getGroupByName :: DB.Connection -> User -> GroupName -> ExceptT StoreError IO Group
getGroupByName db user gName = do
groupId <- getGroupIdByName db user gName
getGroup db user groupId
getGroup :: DB.Connection -> User -> Int64 -> ExceptT StoreError IO Group
getGroup :: DB.Connection -> User -> GroupId -> ExceptT StoreError IO Group
getGroup db user groupId = do
gInfo <- getGroupInfo db user groupId
members <- liftIO $ getGroupMembers db user gInfo
@@ -1416,12 +1411,11 @@ getGroupMembers db User {userId, userContactId} GroupInfo {groupId} = do
toContactMember (memberRow :. connRow) =
(toGroupMember userContactId memberRow) {activeConn = toMaybeConnection connRow}
-- TODO no need to load all members to find the member who invited the used,
-- TODO no need to load all members to find the member who invited the user,
-- instead of findFromContact there could be a query
getGroupInvitation :: DB.Connection -> User -> GroupName -> ExceptT StoreError IO ReceivedGroupInvitation
getGroupInvitation db user localDisplayName = do
getGroupInvitation :: DB.Connection -> User -> GroupId -> ExceptT StoreError IO ReceivedGroupInvitation
getGroupInvitation db user groupId = do
cReq <- getConnRec_ user
groupId <- getGroupIdByName db user localDisplayName
Group groupInfo@GroupInfo {membership} members <- getGroup db user groupId
when (memberStatus membership /= GSMemInvited) $ throwError SEGroupAlreadyJoined
case (cReq, findFromContact (invitedBy membership) members) of
@@ -1431,8 +1425,8 @@ getGroupInvitation db user localDisplayName = do
where
getConnRec_ :: User -> ExceptT StoreError IO (Maybe ConnReqInvitation)
getConnRec_ User {userId} = ExceptT $ do
firstRow fromOnly (SEGroupNotFoundByName localDisplayName) $
DB.query db "SELECT g.inv_queue_info FROM groups g WHERE g.local_display_name = ? AND g.user_id = ?" (localDisplayName, userId)
firstRow fromOnly (SEGroupNotFound groupId) $
DB.query db "SELECT g.inv_queue_info FROM groups g WHERE g.group_id = ? AND g.user_id = ?" (groupId, userId)
findFromContact :: InvitedBy -> [GroupMember] -> Maybe GroupMember
findFromContact (IBContact contactId) = find ((== Just contactId) . memberContactId)
findFromContact _ = const Nothing
@@ -3094,11 +3088,16 @@ getAllChatItemsLast_ db user@User {userId} count = do
(userId, count)
mapM (uncurry $ getAChatItem_ db user) itemRefs
getGroupIdByName :: DB.Connection -> User -> GroupName -> ExceptT StoreError IO Int64
getGroupIdByName :: DB.Connection -> User -> GroupName -> ExceptT StoreError IO GroupId
getGroupIdByName db User {userId} gName =
ExceptT . firstRow fromOnly (SEGroupNotFoundByName gName) $
DB.query db "SELECT group_id FROM groups WHERE user_id = ? AND local_display_name = ?" (userId, gName)
getGroupMemberIdByName :: DB.Connection -> User -> GroupId -> ContactName -> ExceptT StoreError IO GroupMemberId
getGroupMemberIdByName db User {userId} groupId groupMemberName =
ExceptT . firstRow fromOnly (SEGroupMemberNotFound groupId groupMemberName) $
DB.query db "SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND local_display_name = ?" (userId, groupId, groupMemberName)
getChatItemIdByAgentMsgId :: DB.Connection -> Int64 -> AgentMsgId -> IO (Maybe ChatItemId)
getChatItemIdByAgentMsgId db connId msgId =
fmap join . maybeFirstRow fromOnly $
@@ -3770,8 +3769,9 @@ data StoreError
| SEUserContactLinkNotFound
| SEContactRequestNotFound {contactRequestId :: Int64}
| SEContactRequestNotFoundByName {contactName :: ContactName}
| SEGroupNotFound {groupId :: Int64}
| SEGroupNotFound {groupId :: GroupId}
| SEGroupNotFoundByName {groupName :: GroupName}
| SEGroupMemberNotFound {groupId :: GroupId, groupMemberName :: ContactName}
| SEGroupWithoutUser
| SEDuplicateGroupMember
| SEGroupAlreadyJoined
+7 -3
View File
@@ -171,8 +171,10 @@ data Group = Group {groupInfo :: GroupInfo, members :: [GroupMember]}
instance ToJSON Group where toEncoding = J.genericToEncoding J.defaultOptions
type GroupId = Int64
data GroupInfo = GroupInfo
{ groupId :: Int64,
{ groupId :: GroupId,
localDisplayName :: GroupName,
groupProfile :: GroupProfile,
membership :: GroupMember,
@@ -268,9 +270,11 @@ data ReceivedGroupInvitation = ReceivedGroupInvitation
}
deriving (Eq, Show)
type GroupMemberId = Int64
data GroupMember = GroupMember
{ groupMemberId :: Int64,
groupId :: Int64,
{ groupMemberId :: GroupMemberId,
groupId :: GroupId,
memberId :: MemberId,
memberRole :: GroupMemberRole,
memberCategory :: GroupMemberCategory,
+1 -1
View File
@@ -744,7 +744,7 @@ viewChatError = \case
CEGroupNotJoined g -> ["you did not join this group, use " <> highlight ("/join #" <> groupName' g)]
CEGroupMemberNotActive -> ["you cannot invite other members yet, try later"]
CEGroupMemberUserRemoved -> ["you are no longer a member of the group"]
CEGroupMemberNotFound c -> ["contact " <> ttyContact c <> " is not a group member"]
CEGroupMemberNotFound -> ["group doesn't have this member"]
CEGroupMemberIntroNotFound c -> ["group member intro not found for " <> ttyContact c]
CEGroupCantResendInvitation g c -> viewCannotResendInvitation g c
CEGroupInternal s -> ["chat group bug: " <> plain s]