@@ -474,6 +474,21 @@ verifiedUsers uIds =
474474 Just uIdsQ -> fmap fromOnly <$> (runQuery uIdsQ >>= getRows)
475475 Nothing -> return []
476476
477+deleteGroupChat :: GroupChatId -> StaticPQ ()
478+deleteGroupChat gId = commitedTransactionallyUpdate $ do
479+ _ <- manipulateParams deleteGroupChatQ (Only gId)
480+ _ <- manipulateParams deleteGroupChatMessagesQ (Only gId)
481+ return ()
482+ where
483+ deleteGroupChatQ :: Manipulation Schema (TuplePG (Only GroupChatId)) '[]
484+ deleteGroupChatQ = deleteFrom_ #groupChats
485+ (#groupChatId .== param @1)
486+ deleteGroupChatMessagesQ :: Manipulation Schema (TuplePG (Only GroupChatId)) '[]
487+ deleteGroupChatMessagesQ = deleteFrom_ #messages
488+ (#messageStorageDestinationGroupId .== param @1)
489+
490+
491+
477492-- MARK: FrontEnd functions
478493
479494-- Nothing <=> no user
@@ -634,22 +649,24 @@ updateGroupChat :: UserId -> GroupChat -> StaticPQ ()
634649updateGroupChat uId (GroupChat gId (Jsonb perms) name) = commitedTransactionallyUpdate $ do
635650 (GroupChat _ (Jsonb perms') _) <- getGroupChatForUser uId gId
636651 let userPerm = fromMaybe minChatPermissions $ M.lookup uId perms'
637− unless (isAdmin userPerm) $
638− lift $ S.throwError $ S.err401
639− let newPerms = M.alter (Just . max userPerm . fromMaybe userPerm) uId perms
652+ unless (isAdmin userPerm) $ lift $ S.throwError $ S.err401
653+ let newPerms = M.insert uId userPerm perms
640654 void $ manipulateParams updateGroupChatQ (GroupChat gId (Jsonb newPerms) name)
641655
642656leaveGroupChat :: UserId -> GroupChatId -> StaticPQ ()
643657leaveGroupChat uId gId = commitedTransactionallyUpdate $ do
644658 gChat@(GroupChat _ (Jsonb perms) _) <- getGroupChatForUser uId gId
645659 let newPerms = M.delete uId perms
646− void $ manipulateParams updateGroupChatQ gChat{groupChatUsers = Jsonb newPerms}
660+ if M.null newPerms
661+ then deleteGroupChat gId
662+ else void $ manipulateParams updateGroupChatQ gChat{groupChatUsers = Jsonb newPerms}
647663
648664getGroupChatForUser :: UserId -> GroupChatId -> StaticPQ GroupChat
649665getGroupChatForUser uId gId = do
650666 chat <- runQueryParams getGroupChatForUserQ (show uId, gId) >>= firstRow
651667 case (chat) of
652− (Just c) -> return c
668+ (Just c@GroupChat{groupChatUsers = Jsonb perms}) ->
669+ return c{groupChatUsers = Jsonb . M.delete uId $ perms}
653670 Nothing -> lift $ S.throwError S.err404
654671
655672-- MARK: Utils