36 lines
1.0 KiB
Haskell
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
|