{-# LANGUAGE NoMonomorphismRestriction, ScopedTypeVariables #-} module Controller where import Control.Monad import Control.Monad.Trans import Data.List import qualified Data.Map as M import qualified Data.Set as S import Data.Maybe import HAppS.Server import HAppS.State import Text.StringTemplate import System.FilePath import System.Directory import Data.Char -- state import StateVersions.AppState1 import View import ControllerBasic import ControllerPostActions import ControllerGetActions import ControllerMisc import ControllerStressTests import HAppS.Helpers.DirBrowse import Misc import Debug.Trace --import Data.ByteString (pack,unpack) import Data.ByteString.Internal import HAppS.Server.CookieFixer -- SPs: ServerParts -- main controller controller :: Bool -> [ServerPartT IO Response] controller allowStressTests = {- debugFilter $ -} map cookieFixer $ ( tutorial allowStressTests ) ++ simpleHandlers ++ [ myFavoriteAnimal ] ++ staticfiles ++ [ msgToSp "Quoth this server... 404." ] tutorial :: Bool -> [ServerPartT IO Response] tutorial allowStressTests = [ ServerPartT $ \rq -> do ts <- liftIO getTemplates mbSess <- liftIO $ getmbSession rq let mbUName = return . sesUser =<< mbSess mbUis <- case mbUName of Nothing -> return Nothing Just un -> query . GetUserInfos $ un unServerPartT ( multi . (tutorialCommon allowStressTests ) $ RenderGlobals rq ts mbSess ) rq ] tutorialCommon :: Bool -> RenderGlobals -> [ServerPartT IO Response] tutorialCommon allowStressTests rglobs = [ exactdir "/" [ ServerPartT $ \_ -> ( return . tutlayoutU rglobs [] ) "home" ] , dir "tutorial" [ dir "consultants" [ methodSP GET $ viewConsultants rglobs] , dir "consultantswanted" [ methodSP GET $ viewConsultantsWanted rglobs ] , dir "jobs" [ methodSP GET $ viewJobs rglobs] , dir "logout" [ (logoutPage rglobs)] , dir "changepassword" [ methodSP POST $ changePasswordSP rglobs ] , dir "editconsultantprofile" [ methodSP GET $ viewEditConsultantProfile rglobs , methodSP POST $ processformEditConsultantProfile rglobs ] , dir "editjob" [ methodSP GET $ viewEditJobWD rglobs ] , dir "deletejob" [ methodSP GET $ deleteJobWD rglobs ] , dir "editjob" [ methodSP POST $ processformEditJob rglobs ] , dir "postnewjob" [ methodSP POST $ processformNewJob rglobs ] , dir "myjobposts" [ methodSP GET $ pageMyJobPosts rglobs ] , dir "viewprofile" [ methodSP GET $ userProfile rglobs ] , dir "viewjob" [ methodSP GET $ viewJob rglobs ] , dir "actions" $ [ dir "login" [ methodSP POST $ loginPage rglobs ] , dir "newuser" [ methodSP POST $ newUserPage rglobs ] -- , dir "upload" [ methodSP POST $ uploadFilePage rglobs ] ] , dir "initializedummydata" [ spAddDummyData rglobs ] , dir "stresstest" [ -- more realistic, higher stress dir "atomicinserts" [ spStressTest allowStressTests ("atomic inserts",atomic_inserts) rglobs] -- faster, insert all users and all jobs in one transaction -- fast for small numbers of users, but slow for >1000 , dir "onebiginsert" [ spStressTest allowStressTests ("one big insert",insertus) rglobs] , dir "atomicinsertsalljobs" [ spStressTest allowStressTests ("atomic inserts, all jobs at once",insertusAllJobs) rglobs] ] , spJustShowTemplate rglobs ] ] spJustShowTemplate rglobs = lastPathPartSp0 (\_ tmpl -> return $ tutlayoutU rglobs [] tmpl ) spStressTest allowStressTest insertf rglobs = if allowStressTest then lastPathPartSp0 $ \_ numusers -> do n <- safeRead numusers stressTest' insertf n rglobs else return $ tutlayoutU rglobs [("errormsg", failmsgStressTest)] "errortemplate" failmsgStressTest = "
-- Stress is blocked from happening on this happs server.\ \
-- For your own stress testinr, run like ./happs-tutorial 5001 True (the second arg controls the stress test)" staticfiles = [ staticserve "static" , staticserve "userdata" , browsedirHS "projectroot" "." , browsedirHS "templates" "templates" , browsedirHS "src" "src" ] staticserve d = dir d [ fileServe [] d ]