1 module Rakka.Resource.SystemConfig
7 import Network.HTTP.Lucu
8 import Rakka.Environment
10 import Rakka.SystemConfig
11 import Text.XML.HXT.Arrow
15 -- GET /systemConfig ==> 全設定値を返す
16 -- GET /systemConfig/siteName ==> siteName を返す
17 -- PUT /systemConfig/siteName ==> siteName を設定
18 resSystemConfig :: Environment -> ResourceDef
21 resUsesNativeThread = False
23 , resGet = Just $ handleGet env
26 , resPut = Just $ handlePut env
33 <value path="siteName">Rakka</value>
34 <value path="defaultPage">MainPage</value>
37 handleGet :: Environment -> Resource ()
39 = runIdempotentA' $ proc ()
40 -> do tree <- mkSystemConfigTree env -< ()
41 returnA -< outputXml tree
44 mkSystemConfigTree :: (ArrowXml a, ArrowIO a) => Environment -> a b XmlTree
45 mkSystemConfigTree env
46 = let sc = envSysConf env
49 -> do siteName @ (SiteName _) <- getSysConfA sc -< ()
50 baseURI @ (BaseURI _) <- getSysConfA sc -< ()
51 defaultPage @ (DefaultPage _) <- getSysConfA sc -< ()
52 styleSheet @ (StyleSheet _) <- getSysConfA sc -< ()
53 languages @ (Languages _) <- getSysConfA sc -< ()
54 globalLock @ (GlobalLock _) <- getSysConfA sc -< ()
57 += ( eelem "systemConfig"
59 += sattr "path" (confPath siteName)
60 += txt (serialize siteName)
63 += sattr "path" (confPath baseURI)
64 += txt (serialize baseURI)
67 += sattr "path" (confPath defaultPage)
68 += txt (serialize defaultPage)
71 += sattr "path" (confPath styleSheet)
72 += txt (serialize styleSheet)
75 += sattr "path" (confPath languages)
76 += txt (serialize languages)
79 += sattr "path" (confPath globalLock)
80 += txt (serialize globalLock)
85 handlePut :: Environment -> Resource ()
87 = do let sc = envSysConf env
89 userID <- getUserID env
92 -> setStatus Forbidden
94 -> runXmlA env "rakka-config-1.0.rng" $ proc tree
95 -> do listA ( getXPathTreesInDoc "/systemConfig/value"
97 choiceA [ branch (undefined :: SiteName )
98 , branch (undefined :: BaseURI )
99 , branch (undefined :: DefaultPage)
100 , branch (undefined :: StyleSheet )
101 , branch (undefined :: Languages )
102 , branch (undefined :: GlobalLock )
105 returnA -< setStatus Ok
107 branch :: forall a c. (ArrowXml a, ArrowIO a, SysConfValue c) =>
109 -> IfThen (a XmlTree XmlTree) (a XmlTree StatusCode)
111 = hasAttrValue "path" (== confPath c)
115 >>> arr (fromJust . (deserialize :: String -> Maybe c))
116 >>> setSysConfA sc uid )