module Hurriyet where
import Network.HTTP.Client
import Network.HTTP.Client.TLS
import Data.Text (Text)
import Data.ByteString.Lazy as L
import Data.ByteString.Internal as I
import Data.ByteString.Char8 as C
import Hurriyet.Services
import Data.Aeson (decode, eitherDecode)
import Control.Monad.Reader
type Id = String
type ApiKey = String
newtype Client = Client
{ apiKey :: ApiKey
}
getClient :: String -> Client
getClient = Client
data Resource = ArticleResource
| PageResource
| NewsPhotoGalleryResource
| ColumnResource
| PathResource
| WriterResource
instance Show Resource where
show ArticleResource = "articles"
show PageResource = "pages"
show NewsPhotoGalleryResource = "newsphotogalleries"
show ColumnResource = "columns"
show PathResource = "paths"
show WriterResource = "writers"
data Operation = List Resource
| Show Resource Id
baseUrl :: String
baseUrl =
"https://api.hurriyet.com.tr/v1/"
getUrl :: Operation -> String
getUrl operation =
case operation of
List resource -> baseUrl ++ show resource
Show resource id -> baseUrl ++ show resource ++ "/" ++ id
fetchResource :: Client -> Operation -> IO L.ByteString
fetchResource client operation = do
manager <- newManager tlsManagerSettings
initialRequest <- parseRequest $ getUrl operation
let request = initialRequest { method = "GET", requestHeaders = [("apikey", C.pack $ apiKey client)] }
response <- httpLbs request manager
return $ responseBody response
type ServiceResponse a = Reader Client (IO (Either String a))
getPage :: Id -> ServiceResponse Page
getPage id = do
client <- ask
return $ eitherDecode <$> fetchResource client (Show PageResource id)
getPages :: ServiceResponse [Page]
getPages = do
client <- ask
return $ eitherDecode <$> fetchResource client (List PageResource)
getNewsPhotoGallery :: Id -> ServiceResponse NewsPhotoGallery
getNewsPhotoGallery id = do
client <- ask
return $ eitherDecode <$> fetchResource client (Show NewsPhotoGalleryResource id)
getNewsPhotoGalleries :: ServiceResponse [NewsPhotoGallery]
getNewsPhotoGalleries = do
client <- ask
return $ eitherDecode <$> fetchResource client (List NewsPhotoGalleryResource)
getColumn :: Id -> ServiceResponse Column
getColumn id = do
client <- ask
return $ eitherDecode <$> fetchResource client (Show ColumnResource id)
getColumns :: ServiceResponse [Column]
getColumns = do
client <- ask
return $ eitherDecode <$> fetchResource client (List ColumnResource)
getPath :: Id -> ServiceResponse Path
getPath id = do
client <- ask
return $ eitherDecode <$> fetchResource client (Show PathResource id)
getPaths :: ServiceResponse [Path]
getPaths = do
client <- ask
return $ eitherDecode <$> fetchResource client (List PathResource)
getWriter :: Id -> ServiceResponse Writer
getWriter id = do
client <- ask
return $ eitherDecode <$> fetchResource client (Show WriterResource id)
getWriters :: ServiceResponse [Writer]
getWriters = do
client <- ask
return $ eitherDecode <$> fetchResource client (List WriterResource)
getArticle :: Id -> ServiceResponse Article
getArticle id = do
client <- ask
return $ eitherDecode <$> fetchResource client (Show ArticleResource id)
getArticles :: ServiceResponse [Article]
getArticles = do
client <- ask
return $ eitherDecode <$> fetchResource client (List ArticleResource)
withClient :: Client -> Reader Client a -> a
withClient client reader = runReader reader client