-- | <http://strava.github.io/api/v3/oauth/>
module Strive.Actions.Authentication
  ( buildAuthorizeUrl
  , exchangeToken
  , deauthorize
  ) where

import Data.ByteString.Char8 (unpack)
import Network.HTTP.Types (Query, renderQuery, toQuery)
import Strive.Aliases (ApplicationId, ApplicationSecret, AuthorizationCode,
                       RedirectUri, Result)
import Strive.Client (Client, buildClient)
import Strive.Internal.HTTP (post)
import Strive.Options (BuildAuthorizeUrlOptions)
import Strive.Types (DeauthorizationResponse, TokenExchangeResponse)

-- | <http://strava.github.io/api/v3/oauth/#get-authorize>
buildAuthorizeUrl :: ApplicationId -> RedirectUri -> BuildAuthorizeUrlOptions -> String
buildAuthorizeUrl :: ApplicationId
-> RedirectUri -> BuildAuthorizeUrlOptions -> RedirectUri
buildAuthorizeUrl ApplicationId
clientId RedirectUri
redirectUri BuildAuthorizeUrlOptions
options =
  RedirectUri
"https://www.strava.com/oauth/authorize" RedirectUri -> RedirectUri -> RedirectUri
forall a. [a] -> [a] -> [a]
++ ByteString -> RedirectUri
unpack (Bool -> Query -> ByteString
renderQuery Bool
True Query
query)
 where
  query :: Query
query = [(RedirectUri, RedirectUri)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (RedirectUri
"client_id", ApplicationId -> RedirectUri
forall a. Show a => a -> RedirectUri
show ApplicationId
clientId)
    , (RedirectUri
"redirect_uri", RedirectUri
redirectUri)
    , (RedirectUri
"response_type", RedirectUri
"code")
    ] Query -> Query -> Query
forall a. [a] -> [a] -> [a]
++ BuildAuthorizeUrlOptions -> Query
forall a. QueryLike a => a -> Query
toQuery BuildAuthorizeUrlOptions
options

-- | <http://strava.github.io/api/v3/oauth/#post-token>
exchangeToken :: ApplicationId -> ApplicationSecret -> AuthorizationCode -> IO (Result TokenExchangeResponse)
exchangeToken :: ApplicationId
-> RedirectUri -> RedirectUri -> IO (Result TokenExchangeResponse)
exchangeToken ApplicationId
clientId RedirectUri
clientSecret RedirectUri
code = do
  Client
client <- Maybe Text -> IO Client
buildClient Maybe Text
forall a. Maybe a
Nothing
  Client
-> RedirectUri
-> [(RedirectUri, RedirectUri)]
-> IO (Result TokenExchangeResponse)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> RedirectUri -> q -> IO (Result j)
post Client
client RedirectUri
resource [(RedirectUri, RedirectUri)]
query
 where
  resource :: RedirectUri
resource = RedirectUri
"oauth/token"
  query :: [(RedirectUri, RedirectUri)]
query =
    [ (RedirectUri
"client_id", ApplicationId -> RedirectUri
forall a. Show a => a -> RedirectUri
show ApplicationId
clientId)
    , (RedirectUri
"client_secret", RedirectUri
clientSecret)
    , (RedirectUri
"code", RedirectUri
code)
    ]

-- | <http://strava.github.io/api/v3/oauth/#deauthorize>
deauthorize :: Client -> IO (Result DeauthorizationResponse)
deauthorize :: Client -> IO (Result DeauthorizationResponse)
deauthorize Client
client = Client
-> RedirectUri -> Query -> IO (Result DeauthorizationResponse)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> RedirectUri -> q -> IO (Result j)
post Client
client RedirectUri
resource Query
query
 where
  resource :: RedirectUri
resource = RedirectUri
"oauth/deauthorize"
  query :: Query
query = [] :: Query