/lib/HEP/Automation/Model/Server/Yesod.hs

https://github.com/wavewave/model-server · Haskell · 143 lines · 114 code · 22 blank · 7 comment · 9 complexity · 72a72f3ce897b33d37bd6b94e5d5a555 MD5 · raw file

  1. {-# LANGUAGE TemplateHaskell, QuasiQuotes, DeriveDataTypeable,
  2. MultiParamTypeClasses, TypeFamilies, FlexibleContexts,
  3. FlexibleInstances, OverloadedStrings #-}
  4. {-# LANGUAGE EmptyDataDecls #-}
  5. {-# LANGUAGE ScopedTypeVariables #-}
  6. module HEP.Automation.Model.Server.Yesod where
  7. import Yesod hiding (update)
  8. import Network.Wai
  9. import qualified Data.Enumerator.List as EL
  10. import qualified Data.ByteString as S
  11. import HEP.Automation.Model.Type
  12. import Data.Acid
  13. import Data.Attoparsec as P
  14. import Data.Aeson as A
  15. import Data.UUID
  16. import HEP.Automation.Model.Server.Type
  17. mkYesod "ModelServer" [parseRoutes|
  18. / HomeR GET
  19. /listmodel ListModelR GET
  20. /uploadmodel UploadModelR POST
  21. /model/#UUID ModelR
  22. |]
  23. instance Yesod ModelServer where
  24. approot _ = ""
  25. maximumContentLength _ _ = 100000000
  26. {-instance RenderMessage ModelServer FormMessage where
  27. renderMessage _ _ = defaultFormMessage -}
  28. getHomeR :: Handler RepHtml
  29. getHomeR = do
  30. liftIO $ putStrLn "getHomeR called"
  31. defaultLayout [whamlet|
  32. !!!
  33. <html>
  34. <head>
  35. <title> test
  36. <body>
  37. <h1> hello world
  38. |]
  39. defhlet :: GGWidget m Handler ()
  40. defhlet = [whamlet| <h1> HTML output not supported |]
  41. getListModelR :: Handler RepHtmlJson
  42. getListModelR = do
  43. liftIO $ putStrLn "getQueueListR called"
  44. acid <- return.server_acid =<< getYesod
  45. r <- liftIO $ query acid QueryAll
  46. liftIO $ putStrLn $ show r
  47. defaultLayoutJson defhlet (A.toJSON (Just r))
  48. postUploadModelR :: Handler RepHtmlJson
  49. postUploadModelR = do
  50. liftIO $ putStrLn "postQueueR called"
  51. acid <- return.server_acid =<< getYesod
  52. _ <- getRequest
  53. bs' <- lift EL.consume
  54. let bs = S.concat bs'
  55. let parsed = parse json bs
  56. case parsed of
  57. Done _ parsedjson -> do
  58. case (A.fromJSON parsedjson :: A.Result ModelInfo) of
  59. Success minfo -> do
  60. r <- liftIO $ update acid (AddModel minfo)
  61. liftIO $ print (Just r)
  62. liftIO $ print (A.toJSON (Just r))
  63. defaultLayoutJson defhlet (A.toJSON (Just r))
  64. Error err -> do
  65. liftIO $ putStrLn err
  66. defaultLayoutJson defhlet (A.toJSON (Nothing :: Maybe ModelInfo))
  67. Fail _ ctxts err -> do
  68. liftIO $ putStrLn (concat ctxts++err)
  69. defaultLayoutJson defhlet (A.toJSON (Nothing :: Maybe ModelInfo))
  70. Partial _ -> do
  71. liftIO $ putStrLn "partial"
  72. defaultLayoutJson defhlet (A.toJSON (Nothing :: Maybe ModelInfo))
  73. handleModelR :: UUID -> Handler RepHtmlJson
  74. handleModelR name = do
  75. wr <- return.reqWaiRequest =<< getRequest
  76. case requestMethod wr of
  77. "GET" -> getModelR name
  78. "PUT" -> putModelR name
  79. "DELETE" -> deleteModelR name
  80. x -> error ("No such action " ++ show x ++ " in handlerModelR")
  81. getModelR :: UUID -> Handler RepHtmlJson
  82. getModelR idee = do
  83. liftIO $ putStrLn "getModelR called"
  84. acid <- return.server_acid =<< getYesod
  85. r <- liftIO $ query acid (QueryModel idee)
  86. liftIO $ putStrLn $ show r
  87. let hlet = [whamlet| <h1> File #{idee}|]
  88. defaultLayoutJson hlet (A.toJSON (Just r))
  89. putModelR :: UUID -> Handler RepHtmlJson
  90. putModelR idee = do
  91. liftIO $ putStrLn "putModelR called"
  92. acid <- return.server_acid =<< getYesod
  93. _wr <- return.reqWaiRequest =<< getRequest
  94. bs' <- lift EL.consume
  95. let bs = S.concat bs'
  96. let parsed = parse json bs
  97. liftIO $ print parsed
  98. case parsed of
  99. Done _ parsedjson -> do
  100. case (A.fromJSON parsedjson :: A.Result ModelInfo) of
  101. Success minfo -> do
  102. if idee == model_uuid minfo
  103. then do r <- liftIO $ update acid (UpdateModel minfo)
  104. defaultLayoutJson defhlet (A.toJSON (Just r))
  105. else do liftIO $ putStrLn "modelname mismatched"
  106. defaultLayoutJson defhlet (A.toJSON (Nothing :: Maybe ModelInfo))
  107. Error err -> do
  108. liftIO $ putStrLn err
  109. defaultLayoutJson defhlet (A.toJSON (Nothing :: Maybe ModelInfo))
  110. Fail _ ctxts err -> do
  111. liftIO $ putStrLn (concat ctxts++err)
  112. defaultLayoutJson defhlet (A.toJSON (Nothing :: Maybe ModelInfo))
  113. Partial _ -> do
  114. liftIO $ putStrLn "partial"
  115. defaultLayoutJson defhlet (A.toJSON (Nothing :: Maybe ModelInfo))
  116. deleteModelR :: UUID -> Handler RepHtmlJson
  117. deleteModelR idee = do
  118. acid <- return.server_acid =<< getYesod
  119. r <- liftIO $ update acid (DeleteModel idee)
  120. liftIO $ putStrLn $ show r
  121. defaultLayoutJson defhlet (A.toJSON (Just r))