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