packages feed

hoauth2-0.3.0: example/Github/test.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}

-- | Github API: http://developer.github.com/v3/oauth/

module Main where

import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy.Char8 as BSL
import Data.Maybe (fromJust)
import qualified Data.Text as T
import  Data.Text (Text)
import qualified Data.Text.Encoding as T
import qualified Network.HTTP.Types as HT
import Network.HTTP.Conduit
import Control.Monad.Trans.Control (MonadBaseControl)
import Data.Conduit (MonadResource)
import           Control.Applicative
import           Control.Monad                     (mzero)
import           Data.Aeson

import Network.OAuth.OAuth2.HttpClient
import Network.OAuth.OAuth2

import Keys


main :: IO ()
main = do
    let state = "testGithubApi"
    print $ (authorizationUrl githubKey) `appendQueryParam` [("state", state)]
    putStrLn "visit the url and paste code here: "
    code <- getLine
    let (url, body) = accessTokenUrl githubKey (sToBS code)
    token <- doJSONPostRequest (url, body ++ [("state", state)])
    print (token :: Maybe AccessToken)
    case token of
      Just (AccessToken t _) -> userInfo (githubKey {oauthAccessToken = Just t}) >>= print
      _      -> print "no access token found yet"

sToBS :: String -> BS.ByteString
sToBS = T.encodeUtf8 . T.pack

-- | Test API: user
--
userInfo :: OAuth2 -> IO (Maybe GithubUser)
userInfo oauth = doJSONGetRequest (appendAccessToken
                                     "https://api.github.com/user"
                                     oauth)

data GithubUser = GithubUser { gid    :: Integer
                             , gname  :: Text
                             } deriving (Show, Eq)

instance FromJSON GithubUser where
    parseJSON (Object o) = GithubUser
                           <$> o .: "id"
                           <*> o .: "name"
    parseJSON _ = mzero