4r/4r-feed/Feed/V1/Topic.hs

36 lines
1.0 KiB
Haskell

module Feed.V1.Topic (feedTopicCached) where
import Relude
import Api (getTopic')
import Api.Types (GetTopic(..), Topic)
import Control.Monad.Except (throwError)
import Data.Cache (fetchWithCache)
import Feed.V1.Core
import Network.HTTP.Types (statusCode)
import Servant.Client.Streaming
import Servant.Server (ServerError(..), err500)
feedTopic :: Integer -> App Topic
feedTopic topic_id = do
appEnv <- ask
result <- liftIO $ runClientM (getTopic' GetTopic{topic_id}) appEnv.clientEnv
-- TODO: add logging of errors
case result of
Right ok -> pure ok
Left (FailureResponse _ remoteErr) ->
throwError
ServerError
{ errHTTPCode = remoteErr.responseStatusCode.statusCode
, errReasonPhrase = "4rum.i2p returned error"
, errBody = remoteErr.responseBody
, errHeaders = toList remoteErr.responseHeaders
}
Left _clientErr -> do
throwError err500
feedTopicCached :: Integer -> App Topic
feedTopicCached topic_id = do
appEnv <- ask
fetchWithCache appEnv.topicCache topic_id feedTopic