{-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Clckwrks.MailingList.Route where import Control.Applicative ((<$>)) import Control.Monad.Reader (ask) import Control.Monad.Trans (liftIO) import Clckwrks (Role(..), requiresRole_) import Clckwrks.MailingList.Admin.EditMessage (editMessage) import Clckwrks.MailingList.Admin.MailingListSettings (mailingListSettings) import Clckwrks.MailingList.Admin.NewMessage (newMessage) import Clckwrks.MailingList.Admin.SendMessage(sendMessage) import Clckwrks.MailingList.Admin.ViewMessages (viewMessages) import Clckwrks.MailingList.Admin.ViewSubscribers (viewSubscribers) import Clckwrks.MailingList.Monad (MailingListM, MailingListConfig(..)) import Clckwrks.MailingList.URL (MailingListURL(..), MailingListAdminURL(..)) import Clckwrks.MailingList.Page.Subscribe (subscribePage) import Clckwrks.MailingList.Page.ConfirmOptIn (confirmOptInPage) import qualified Data.Set as Set import Happstack.Server (Response, notFound, toResponse, serveFile, guessContentTypeM, mimeTypes) import Happstack.Server.FileServe.BuildingBlocks (isSafePath) import Network.URI (unEscapeString) import System.FilePath ((), makeRelative, splitDirectories) checkAuth :: MailingListURL -> MailingListM MailingListURL checkAuth url = do showFn <- mailingListClckURL <$> ask let requiresRole = requiresRole_ showFn case url of MailingListAdmin {} -> requiresRole (Set.singleton Administrator) url Subscribe {} -> return url ConfirmOptIn {} -> return url -- | routes for 'AdminURL' routeMailingListAdmin :: MailingListAdminURL -> MailingListM Response routeMailingListAdmin url = case url of EditMLSettings -> mailingListSettings (MailingListAdmin url) ViewSubscribers -> viewSubscribers (MailingListAdmin url) (SendMessage msgid) -> sendMessage (MailingListAdmin url) msgid (EditMessage msgid) -> editMessage (MailingListAdmin url) msgid ViewMessages -> viewMessages (MailingListAdmin url) NewMessage -> newMessage (MailingListAdmin url) routeMailingList :: MailingListURL -> MailingListM Response routeMailingList unsecureURL = do url <- checkAuth unsecureURL case url of Subscribe -> subscribePage url ConfirmOptIn -> confirmOptInPage (MailingListAdmin adminURL) -> routeMailingListAdmin adminURL