packages feed

lucienne-0.0.2: Lucienne/Main.hs

import           Prelude hiding (catch)
import           Control.Monad (msum,when)
import           Control.Monad.Trans (lift)
import           Control.Exception (handle,AsyncException(UserInterrupt))
import           Happstack.Server 
  (Conf(port),simpleHTTP',nullConf,dir,dirs,path,nullDir,serveFile,asContentType,uriRest)
import           Database.MongoDB (runIOE,readHostPort,connect,close)
import           Paths_lucienne (getDataFileName)
import           Lucienne.Args (Args,applicationPort,getArgs,dbConnectionString)
import           Lucienne.ConnectionReader (Connection,ConnectionReader,runConnectionReader)
import           Lucienne.Model.User (newUser)
import qualified Lucienne.Database as DB
import           Lucienne.Controller.BasicAuth (basicAuth)
import           Lucienne.Controller.AddNewUser (addNewUser,doAddNewUser)
import           Lucienne.Controller.AddNewFeed (addNewFeed,doAddNewFeed)
import           Lucienne.Controller.DeleteFeed (deleteFeed,doDeleteFeed)
import           Lucienne.Controller.Feed (feed,home)
import           Lucienne.Controller.FeedItem 
  (feedItem,doDeleteFeedItem,doReadFeedItem,doChangeFeedItemState)
import           Lucienne.Controller.ChangePassword (changePassword,doChangePassword)
import           Lucienne.Controller.DeleteUser (deleteUser, doDeleteUser)
import           Lucienne.Controller.NotFound (notFound)
import qualified Lucienne.Url as Url

main :: IO ()
main = do
  args <- getArgs
  putStrLn $ "Connecting to database " ++ (dbConnectionString args) ++ " ..."
  connection <- runIOE $ connect $ readHostPort $ dbConnectionString args
  serverConfig <- return $ nullConf { port = applicationPort args }
  putStrLn $ "Running on port " ++ show (applicationPort args) ++ " ..."
  handle (\UserInterrupt -> closeConnection connection) $ do
    runConnectionReader connection addAdminAccountOnInit
    simpleHTTP' (runConnectionReader connection) serverConfig $ msum 
       [ urlDir  Url.addNewUser            $ basicAuth addNewUser
       , urlDir  Url.doAddNewUser          $ basicAuth doAddNewUser
       , urlDir  Url.addNewFeed            $ basicAuth addNewFeed
       , urlDir  Url.doAddNewFeed          $ basicAuth doAddNewFeed
       , urlDir  Url.deleteFeed            $ path $ basicAuth . deleteFeed
       , urlDir  Url.doDeleteFeed          $ path $ basicAuth . doDeleteFeed
       , urlDir  Url.feed                  $ path  $ basicAuth . feed
       , urlDir  Url.feedItem              $ path  $ basicAuth . feedItem
       , urlDirs Url.staticCss             $ serveFile' "text/css" "static/css.css"
       , urlDirs Url.staticJs              $ serveFile' "application/javascript" "static/js.js"
       , urlDir  Url.doDeleteFeedItem      $ path $ basicAuth . doDeleteFeedItem
       , urlDir  Url.doReadFeedItem        $ path $ basicAuth . doReadFeedItem
       , urlDir  Url.doChangeFeedItemState $ basicAuth doChangeFeedItemState
       , urlDir  Url.changePassword        $ basicAuth changePassword
       , urlDir  Url.doChangePassword      $ basicAuth doChangePassword
       , urlDir  Url.deleteUser            $ basicAuth deleteUser
       , urlDir  Url.doDeleteUser          $ basicAuth doDeleteUser         
       , nullDir >> basicAuth home
       , uriRest notFound
       ]
        
      where urlDir                 = dir  . tail 
            urlDirs                = dirs . tail 
            serveFile' ct filePath = do 
              filePath' <- lift $ lift $ getDataFileName filePath
              serveFile (asContentType ct) filePath'
       
closeConnection :: Connection -> IO ()
closeConnection c = do
  putStrLn "Closing connection ..."
  close c

addAdminAccountOnInit :: ConnectionReader ()
addAdminAccountOnInit = do
  numUsers <- DB.countUsers
  when (0 == numUsers) $ do
    lift $ putStrLn "Creating admin account (admin:12345): please change password immediately ..."
    _ <- DB.addUser $ newUser "admin" "12345" True
    return ()