1 module Rakka.Resource.SystemConfig
6 import Network.HTTP.Lucu
7 import Rakka.Environment
9 import Rakka.SystemConfig
10 import Text.XML.HXT.XPath
14 -- GET /systemConfig ==> 全設定値を返す
15 -- GET /systemConfig/siteName ==> siteName を返す
16 -- PUT /systemConfig/siteName ==> siteName を設定
17 resSystemConfig :: Environment -> ResourceDef
20 resUsesNativeThread = False
22 , resGet = Just $ handleGet env
25 , resPut = Just $ handlePut env
32 <value path="siteName">Rakka</value>
33 <value path="defaultPage">MainPage</value>
36 handleGet :: Environment -> Resource ()
38 = runIdempotentA' $ proc ()
39 -> do tree <- mkSystemConfigTree env -< ()
40 returnA -< outputXml tree
43 mkSystemConfigTree :: (ArrowXml a, ArrowIO a) => Environment -> a b XmlTree
44 mkSystemConfigTree env
45 = let sc = envSysConf env
48 -> do siteName @ (SiteName _) <- getSysConfA sc -< ()
49 baseURI @ (BaseURI _) <- getSysConfA sc -< ()
50 defaultPage @ (DefaultPage _) <- getSysConfA sc -< ()
51 styleSheet @ (StyleSheet _) <- getSysConfA sc -< ()
52 languages @ (Languages _) <- getSysConfA sc -< ()
53 globalLock @ (GlobalLock _) <- getSysConfA sc -< ()
56 += ( eelem "systemConfig"
58 += sattr "path" (confPath siteName)
59 += txt (serialize siteName)
62 += sattr "path" (confPath baseURI)
63 += txt (serialize baseURI)
66 += sattr "path" (confPath defaultPage)
67 += txt (serialize defaultPage)
70 += sattr "path" (confPath styleSheet)
71 += txt (serialize styleSheet)
74 += sattr "path" (confPath languages)
75 += txt (serialize languages)
78 += sattr "path" (confPath globalLock)
79 += txt (serialize globalLock)
84 handlePut :: Environment -> Resource ()
86 = do let sc = envSysConf env
88 userID <- getUserID env
91 -> setStatus Forbidden
93 -> runXmlA env "rakka-config-1.0.rng" $ proc tree
94 -> do listA ( getXPathTreesInDoc "/systemConfig/value"
96 choiceA [ branch (undefined :: SiteName )
97 , branch (undefined :: BaseURI )
98 , branch (undefined :: DefaultPage)
99 , branch (undefined :: StyleSheet )
100 , branch (undefined :: Languages )
101 , branch (undefined :: GlobalLock )
104 returnA -< setStatus Ok
106 branch :: forall a c. (ArrowXml a, ArrowIO a, SysConfValue c) =>
108 -> IfThen (a XmlTree XmlTree) (a XmlTree StatusCode)
110 = hasAttrValue "path" (== confPath c)
114 >>> arr (fromJust . (deserialize :: String -> Maybe c))
115 >>> setSysConfA sc uid )