{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}

-- | Client for Slack's @users.conversations@ endpoint.
-- <https://api.slack.com/methods/users.conversations>
module Web.Slack.UsersConversations (
  UsersConversationsRequest (..),
  UsersConversationsResponse (..),
  usersConversations,
  usersConversationsAll,
) where

import Servant.API
import Servant.Client hiding (Response)
import Servant.Client.Core hiding (Response)
import Web.FormUrlEncoded (ToForm (..), genericToForm)
import Web.Slack.AesonUtils
import Web.Slack.Common (Cursor, TeamId, UserId)
import Web.Slack.Conversation (Conversation, ConversationType)
import Web.Slack.Internal
import Web.Slack.Pager (LoadPage, PagedRequest (..), PagedResponse (..), Response, ResponseMetadata, fetchAllBy)
import Web.Slack.Prelude

newtype ConversationTypesList = ConversationTypesList {ConversationTypesList -> NonEmpty ConversationType
unConversationTypesList :: NonEmpty ConversationType}
  deriving stock (Int -> ConversationTypesList -> ShowS
[ConversationTypesList] -> ShowS
ConversationTypesList -> String
(Int -> ConversationTypesList -> ShowS)
-> (ConversationTypesList -> String)
-> ([ConversationTypesList] -> ShowS)
-> Show ConversationTypesList
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConversationTypesList -> ShowS
showsPrec :: Int -> ConversationTypesList -> ShowS
$cshow :: ConversationTypesList -> String
show :: ConversationTypesList -> String
$cshowList :: [ConversationTypesList] -> ShowS
showList :: [ConversationTypesList] -> ShowS
Show, ConversationTypesList -> ConversationTypesList -> Bool
(ConversationTypesList -> ConversationTypesList -> Bool)
-> (ConversationTypesList -> ConversationTypesList -> Bool)
-> Eq ConversationTypesList
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ConversationTypesList -> ConversationTypesList -> Bool
== :: ConversationTypesList -> ConversationTypesList -> Bool
$c/= :: ConversationTypesList -> ConversationTypesList -> Bool
/= :: ConversationTypesList -> ConversationTypesList -> Bool
Eq)
  deriving newtype (ConversationTypesList -> ()
(ConversationTypesList -> ()) -> NFData ConversationTypesList
forall a. (a -> ()) -> NFData a
$crnf :: ConversationTypesList -> ()
rnf :: ConversationTypesList -> ()
NFData)

instance ToHttpApiData ConversationTypesList where
  toQueryParam :: ConversationTypesList -> Text
toQueryParam (ConversationTypesList NonEmpty ConversationType
list) = Element (NonEmpty Text) -> NonEmpty Text -> Element (NonEmpty Text)
forall mono.
(MonoFoldable mono, Monoid (Element mono)) =>
Element mono -> mono -> Element mono
intercalate Text
Element (NonEmpty Text)
"," (NonEmpty Text -> Element (NonEmpty Text))
-> NonEmpty Text -> Element (NonEmpty Text)
forall a b. (a -> b) -> a -> b
$ ConversationType -> Text
forall a. ToHttpApiData a => a -> Text
toUrlPiece (ConversationType -> Text)
-> NonEmpty ConversationType -> NonEmpty Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty ConversationType
list

-- | <https://api.slack.com/methods/users.conversations>
data UsersConversationsRequest = UsersConversationsRequest
  { UsersConversationsRequest -> Maybe Cursor
cursor :: Maybe Cursor
  , UsersConversationsRequest -> Maybe Bool
excludeArchived :: Maybe Bool
  , UsersConversationsRequest -> Maybe Int
limit :: Maybe Int
  , UsersConversationsRequest -> Maybe TeamId
teamId :: Maybe TeamId
  , UsersConversationsRequest -> Maybe ConversationTypesList
types :: Maybe ConversationTypesList
  -- ^ Specify some specific conversation types. Defaults on Slack's end to
  -- @public_channel@, aka 'PublicChannelType'.
  , UsersConversationsRequest -> Maybe UserId
user :: Maybe UserId
  -- ^ Look at the conversations of a specified user rather than the calling
  -- user
  }
  deriving stock (Int -> UsersConversationsRequest -> ShowS
[UsersConversationsRequest] -> ShowS
UsersConversationsRequest -> String
(Int -> UsersConversationsRequest -> ShowS)
-> (UsersConversationsRequest -> String)
-> ([UsersConversationsRequest] -> ShowS)
-> Show UsersConversationsRequest
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UsersConversationsRequest -> ShowS
showsPrec :: Int -> UsersConversationsRequest -> ShowS
$cshow :: UsersConversationsRequest -> String
show :: UsersConversationsRequest -> String
$cshowList :: [UsersConversationsRequest] -> ShowS
showList :: [UsersConversationsRequest] -> ShowS
Show, UsersConversationsRequest -> UsersConversationsRequest -> Bool
(UsersConversationsRequest -> UsersConversationsRequest -> Bool)
-> (UsersConversationsRequest -> UsersConversationsRequest -> Bool)
-> Eq UsersConversationsRequest
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UsersConversationsRequest -> UsersConversationsRequest -> Bool
== :: UsersConversationsRequest -> UsersConversationsRequest -> Bool
$c/= :: UsersConversationsRequest -> UsersConversationsRequest -> Bool
/= :: UsersConversationsRequest -> UsersConversationsRequest -> Bool
Eq, (forall x.
 UsersConversationsRequest -> Rep UsersConversationsRequest x)
-> (forall x.
    Rep UsersConversationsRequest x -> UsersConversationsRequest)
-> Generic UsersConversationsRequest
forall x.
Rep UsersConversationsRequest x -> UsersConversationsRequest
forall x.
UsersConversationsRequest -> Rep UsersConversationsRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
UsersConversationsRequest -> Rep UsersConversationsRequest x
from :: forall x.
UsersConversationsRequest -> Rep UsersConversationsRequest x
$cto :: forall x.
Rep UsersConversationsRequest x -> UsersConversationsRequest
to :: forall x.
Rep UsersConversationsRequest x -> UsersConversationsRequest
Generic)
  deriving anyclass (UsersConversationsRequest
UsersConversationsRequest -> Default UsersConversationsRequest
forall a. a -> Default a
$cdef :: UsersConversationsRequest
def :: UsersConversationsRequest
Default)

instance ToForm UsersConversationsRequest where
  toForm :: UsersConversationsRequest -> Form
toForm = FormOptions -> UsersConversationsRequest -> Form
forall a.
(Generic a, GToForm a (Rep a)) =>
FormOptions -> a -> Form
genericToForm FormOptions
snakeCaseFormOptions

instance PagedRequest UsersConversationsRequest where
  setCursor :: Maybe Cursor
-> UsersConversationsRequest -> UsersConversationsRequest
setCursor Maybe Cursor
c UsersConversationsRequest
req = UsersConversationsRequest
req {cursor = c}

data UsersConversationsResponse = UsersConversationsResponse
  { UsersConversationsResponse -> [Conversation]
channels :: [Conversation]
  , UsersConversationsResponse -> Maybe ResponseMetadata
responseMetadata :: Maybe ResponseMetadata
  }
  deriving stock (Int -> UsersConversationsResponse -> ShowS
[UsersConversationsResponse] -> ShowS
UsersConversationsResponse -> String
(Int -> UsersConversationsResponse -> ShowS)
-> (UsersConversationsResponse -> String)
-> ([UsersConversationsResponse] -> ShowS)
-> Show UsersConversationsResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UsersConversationsResponse -> ShowS
showsPrec :: Int -> UsersConversationsResponse -> ShowS
$cshow :: UsersConversationsResponse -> String
show :: UsersConversationsResponse -> String
$cshowList :: [UsersConversationsResponse] -> ShowS
showList :: [UsersConversationsResponse] -> ShowS
Show, UsersConversationsResponse -> UsersConversationsResponse -> Bool
(UsersConversationsResponse -> UsersConversationsResponse -> Bool)
-> (UsersConversationsResponse
    -> UsersConversationsResponse -> Bool)
-> Eq UsersConversationsResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UsersConversationsResponse -> UsersConversationsResponse -> Bool
== :: UsersConversationsResponse -> UsersConversationsResponse -> Bool
$c/= :: UsersConversationsResponse -> UsersConversationsResponse -> Bool
/= :: UsersConversationsResponse -> UsersConversationsResponse -> Bool
Eq)

instance PagedResponse UsersConversationsResponse where
  type ResponseObject UsersConversationsResponse = Conversation
  getResponseData :: UsersConversationsResponse
-> [ResponseObject UsersConversationsResponse]
getResponseData UsersConversationsResponse {[Conversation]
channels :: UsersConversationsResponse -> [Conversation]
channels :: [Conversation]
channels} = [ResponseObject UsersConversationsResponse]
[Conversation]
channels
  getResponseMetadata :: UsersConversationsResponse -> Maybe ResponseMetadata
getResponseMetadata UsersConversationsResponse {Maybe ResponseMetadata
responseMetadata :: UsersConversationsResponse -> Maybe ResponseMetadata
responseMetadata :: Maybe ResponseMetadata
responseMetadata} = Maybe ResponseMetadata
responseMetadata

$(deriveFromJSON snakeCaseOptions ''UsersConversationsResponse)

type Api =
  "users.conversations"
    :> AuthProtect "token"
    :> ReqBody '[FormUrlEncoded] UsersConversationsRequest
    :> Post '[JSON] (ResponseJSON UsersConversationsResponse)

-- | Client for Slack's @users.conversations@ endpoint.
-- <https://api.slack.com/methods/users.conversations>
usersConversations :: SlackConfig -> UsersConversationsRequest -> IO (Response UsersConversationsResponse)
usersConversations :: SlackConfig
-> UsersConversationsRequest
-> IO (Response UsersConversationsResponse)
usersConversations SlackConfig
slackConfig UsersConversationsRequest
req = do
  let authR :: AuthenticatedRequest (AuthProtect "token")
authR = SlackConfig -> AuthenticatedRequest (AuthProtect "token")
mkSlackAuthenticateReq SlackConfig
slackConfig
  ClientM (ResponseJSON UsersConversationsResponse)
-> Manager -> IO (Response UsersConversationsResponse)
forall a. ClientM (ResponseJSON a) -> Manager -> IO (Response a)
run (AuthenticatedRequest (AuthProtect "token")
-> UsersConversationsRequest
-> ClientM (ResponseJSON UsersConversationsResponse)
usersConversations_ AuthenticatedRequest (AuthProtect "token")
authR UsersConversationsRequest
req) (Manager -> IO (Response UsersConversationsResponse))
-> (SlackConfig -> Manager)
-> SlackConfig
-> IO (Response UsersConversationsResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. SlackConfig -> Manager
slackConfigManager (SlackConfig -> IO (Response UsersConversationsResponse))
-> SlackConfig -> IO (Response UsersConversationsResponse)
forall a b. (a -> b) -> a -> b
$ SlackConfig
slackConfig

usersConversations_ ::
  AuthenticatedRequest (AuthProtect "token") ->
  UsersConversationsRequest ->
  ClientM (ResponseJSON UsersConversationsResponse)
usersConversations_ :: AuthenticatedRequest (AuthProtect "token")
-> UsersConversationsRequest
-> ClientM (ResponseJSON UsersConversationsResponse)
usersConversations_ = Proxy Api -> Client ClientM Api
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @Api)

-- | Fetch all user conversations.
usersConversationsAll :: SlackConfig -> UsersConversationsRequest -> IO (LoadPage IO Conversation)
usersConversationsAll :: SlackConfig
-> UsersConversationsRequest -> IO (LoadPage IO Conversation)
usersConversationsAll = (UsersConversationsRequest
 -> IO (Response UsersConversationsResponse))
-> UsersConversationsRequest
-> IO (LoadPage IO (ResponseObject UsersConversationsResponse))
(UsersConversationsRequest
 -> IO (Response UsersConversationsResponse))
-> UsersConversationsRequest -> IO (LoadPage IO Conversation)
forall (m :: * -> *) req resp.
(MonadIO m, PagedRequest req, PagedResponse resp) =>
(req -> m (Response resp))
-> req -> m (LoadPage m (ResponseObject resp))
fetchAllBy ((UsersConversationsRequest
  -> IO (Response UsersConversationsResponse))
 -> UsersConversationsRequest -> IO (LoadPage IO Conversation))
-> (SlackConfig
    -> UsersConversationsRequest
    -> IO (Response UsersConversationsResponse))
-> SlackConfig
-> UsersConversationsRequest
-> IO (LoadPage IO Conversation)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. SlackConfig
-> UsersConversationsRequest
-> IO (Response UsersConversationsResponse)
usersConversations