{-# LANGUAGE RecordWildCards, FlexibleContexts, OverloadedStrings #-} module Clckwrks.Bugs.Plugin where import Clckwrks import Clckwrks.Plugin import Clckwrks.Bugs.URL import Clckwrks.Bugs.Acid import Clckwrks.Bugs.PreProcess (bugsCmd) import Clckwrks.Bugs.Monad import Clckwrks.Bugs.Route import Control.Monad.State (get) import Data.Acid.Local import Data.Text (Text) import qualified Data.Text.Lazy as TL import Data.Maybe (fromMaybe) import System.FilePath (()) import Web.Plugins.Core (Plugin(..), When(Always), addCleanup, addHandler, getConfig, getPluginRouteFn, initPlugin) bugsHandler :: (BugsURL -> [(Text, Maybe Text)] -> Text) -> BugsConfig -> ClckPlugins -> [Text] -> ClckT ClckURL (ServerPartT IO) Response bugsHandler showBugsURL bugsConfig plugins paths = case parseSegments fromPathSegments paths of (Left e) -> notFound $ toResponse (show e) (Right u) -> ClckT $ withRouteT flattenURL $ unClckT $ runBugsT bugsConfig $ routeBugs u where flattenURL :: ((url' -> [(Text, Maybe Text)] -> Text) -> (BugsURL -> [(Text, Maybe Text)] -> Text)) flattenURL _ u p = showBugsURL u p bugsInit :: ClckPlugins -> IO (Maybe Text) bugsInit plugins = do (Just bugsShowFn) <- getPluginRouteFn plugins (pluginName bugsPlugin) (Just clckShowFn) <- getPluginRouteFn plugins (pluginName clckPlugin) mTopDir <- clckTopDir <$> getConfig plugins let basePath = maybe "_state" (\td -> td "_state") mTopDir -- FIXME acid <- openLocalStateFrom (basePath "bugs") initialBugsState addCleanup plugins Always (createCheckpointAndClose acid) let bugsConfig = BugsConfig { bugsDirectory = "bugs-dir" , bugsState = acid , bugsClckURL = clckShowFn } addPreProc plugins (bugsCmd bugsShowFn) addHandler plugins (pluginName bugsPlugin) (bugsHandler bugsShowFn bugsConfig) return Nothing addBugsAdminMenu :: ClckT url IO () addBugsAdminMenu = do p <- plugins <$> get (Just showBugsURL) <- getPluginRouteFn p (pluginName bugsPlugin) let editMilestonesURL = showBugsURL (BugsAdmin EditMilestones) [] addAdminMenu ("Bugs", [("Edit Milestones", editMilestonesURL)]) bugsPlugin :: Plugin BugsURL Theme (ClckT ClckURL (ServerPartT IO) Response) (ClckT ClckURL IO ()) ClckwrksConfig [TL.Text -> ClckT ClckURL IO TL.Text] bugsPlugin = Plugin { pluginName = "bugs" , pluginInit = bugsInit , pluginDepends = [] , pluginToPathInfo = toPathInfo , pluginPostHook = addBugsAdminMenu } plugin :: ClckPlugins -- ^ plugins -> Text -- ^ baseURI -> IO (Maybe Text) plugin plugins baseURI = initPlugin plugins baseURI bugsPlugin