module Clckwrks.Media.Page.GetMedium where

import Control.Applicative  ((<$>))
import Control.Monad.Reader (ask)
import Clckwrks             (query)
import Clckwrks.Media.Acid  (GetMediumById(..))
import Clckwrks.Media.Types (MediumId(..), Medium(..), mediumContentType)
import Clckwrks.Media.Monad (MediaM, MediaConfig(..))
import Happstack.Server     (Response, asContentType, notFound, serveFile, toResponse)
import System.FilePath      ((</>))

getMedium :: MediumId -> MediaM Response
getMedium mid =
    do mMedium <- query (GetMediumById mid)
       case mMedium of
         Nothing -> do notFound $ toResponse $ "Invalid medium id " ++ show (unMediumId mid)
         (Just medium) ->
             do md <- mediaDirectory <$> ask
                serveFile (asContentType (mediumContentType $ mediumKind medium)) (md </> (mediumPath medium))