aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2016-01-23 11:26:50 +0000
committerGregor Kleen <gkleen@yggdrasil.li>2016-01-23 11:26:50 +0000
commitd776f630c6bf60a14e496694bcb502e93f215a41 (patch)
tree9d66a31dae0ab13c72a9759fea240598bc70e75c /server
parent08a6ee538ced1afb059491c7fd25f233999f5ca4 (diff)
downloadthermoprint-d776f630c6bf60a14e496694bcb502e93f215a41.tar
thermoprint-d776f630c6bf60a14e496694bcb502e93f215a41.tar.gz
thermoprint-d776f630c6bf60a14e496694bcb502e93f215a41.tar.bz2
thermoprint-d776f630c6bf60a14e496694bcb502e93f215a41.tar.xz
thermoprint-d776f630c6bf60a14e496694bcb502e93f215a41.zip
Split out Thermoprint.Server.API
Diffstat (limited to 'server')
-rw-r--r--server/src/Thermoprint/Server.hs105
-rw-r--r--server/src/Thermoprint/Server/API.hs104
-rw-r--r--server/thermoprint-server.cabal1
3 files changed, 117 insertions, 93 deletions
diff --git a/server/src/Thermoprint/Server.hs b/server/src/Thermoprint/Server.hs
index d1ee6ee..419679c 100644
--- a/server/src/Thermoprint/Server.hs
+++ b/server/src/Thermoprint/Server.hs
@@ -14,47 +14,34 @@ module Thermoprint.Server
14import Data.Default.Class 14import Data.Default.Class
15import qualified Config.Dyre as Dyre 15import qualified Config.Dyre as Dyre
16 16
17import System.IO (hPutStrLn, stderr) 17import Control.Monad (mapM_)
18import System.Exit (exitFailure)
19
20import Control.Monad ((<=<), mapM_, liftM2)
21import Prelude hiding ((.), id)
22import Control.Category
23 18
24import Data.Maybe (maybe) 19import Data.Maybe (maybe)
25 20
21import Control.Monad.Trans.Resource
26import Control.Monad.Logger 22import Control.Monad.Logger
27import Control.Monad.Reader 23import Control.Monad.Reader
28import Control.Monad.Trans.Resource
29import Control.Monad.Trans.Either
30import Control.Monad.IO.Class 24import Control.Monad.IO.Class
31 25
32import Data.Functor.Compose
33
34import Thermoprint.API hiding (JobId(..), DraftId(..))
35import qualified Thermoprint.API as API (JobId(..), DraftId(..))
36import Data.Set (Set)
37import qualified Data.Set as Set
38import Data.Sequence (Seq)
39import qualified Data.Sequence as Seq
40import Data.Map (Map)
41import qualified Data.Map as Map
42
43import Data.Text (Text) 26import Data.Text (Text)
44import qualified Data.Text as T (pack) 27import qualified Data.Text as T (pack)
45 28
46import qualified Network.Wai.Handler.Warp as Warp 29import qualified Network.Wai.Handler.Warp as Warp
47import Network.Wai (Application) 30import Network.Wai (Application)
48 31
49import Servant 32import Servant.Server (serve)
50import Servant.Server 33import Servant.Server.Internal.Enter (enter, (:~>)(..))
51import Servant.Server.Internal.Enter
52 34
53import Database.Persist.Sql (runMigrationSilent, ConnectionPool, runSqlPool) 35import Database.Persist.Sql (runMigrationSilent, ConnectionPool, runSqlPool)
54 36
55 37
38import Thermoprint.API (thermoprintAPI)
39
56import Thermoprint.Server.Database 40import Thermoprint.Server.Database
41import qualified Thermoprint.Server.API as API (thermoprintServer)
42import Thermoprint.Server.API hiding (thermoprintServer)
57 43
44
58data Config = Config { dyreError :: Maybe String -- ^ Set by 'Dyre' -- sent to log as an error 45data Config = Config { dyreError :: Maybe String -- ^ Set by 'Dyre' -- sent to log as an error
59 , warpSettings :: Warp.Settings -- ^ Configure 'Warp's behaviour 46 , warpSettings :: Warp.Settings -- ^ Configure 'Warp's behaviour
60 } 47 }
@@ -64,9 +51,6 @@ instance Default Config where
64 , warpSettings = Warp.defaultSettings 51 , warpSettings = Warp.defaultSettings
65 } 52 }
66 53
67data HandlerInput = HandlerInput { sqlPool :: ConnectionPool
68 }
69
70 54
71thermoprintServer :: ( MonadLoggerIO m 55thermoprintServer :: ( MonadLoggerIO m
72 , MonadIO m 56 , MonadIO m
@@ -82,70 +66,5 @@ thermoprintServer io = Dyre.wrapMain $ Dyre.defaultParams
82 where 66 where
83 realMain Config{..} = unNat io $ do 67 realMain Config{..} = unNat io $ do
84 maybe (return ()) ($(logErrorS) "Dyre" . T.pack) dyreError 68 maybe (return ()) ($(logErrorS) "Dyre" . T.pack) dyreError
85 69 mapM_ ($(logWarnS) "DB") =<< runSqlPool (runMigrationSilent migrateAll) =<< ask
86 sqlPool <- ask 70 liftIO . Warp.runSettings warpSettings . serve thermoprintAPI . flip enter API.thermoprintServer =<< handlerNat
87 logFunc <- askLoggerIO
88
89 runSqlPool (runMigrationSilent migrateAll) sqlPool >>= mapM_ ($(logWarnS) "DB")
90
91 let
92 handlerInput = HandlerInput
93 { sqlPool = sqlPool
94 }
95 io' :: ProtoHandler :~> IO
96 io' = Nat (($ logFunc) . runLoggingT) . runReaderTNat handlerInput
97 liftIO . Warp.runSettings warpSettings . serve thermoprintAPI $ enter (hoistNat io') thermoprintServer'
98
99type ProtoHandler = ReaderT HandlerInput (LoggingT IO)
100type Handler = EitherT ServantErr ProtoHandler
101
102(<||>) :: Monad m => m a -> m b -> m (a :<|> b)
103(<||>) = liftM2 (:<|>)
104infixr 9 <||>
105
106thermoprintServer' :: ServerT ThermoprintAPI Handler
107thermoprintServer' = listPrinters
108 :<|> (listJobs :<|> queueJob)
109 :<|> getJob <||> jobStatus <||> deleteJob
110 :<|> (listDrafts :<|> addDraft)
111 :<|> updateDraft <||> getDraft <||> deleteDraft <||> printDraft
112
113
114listPrinters :: Handler (Map PrinterId PrinterStatus)
115listPrinters = return $ Map.fromList [(1, Available), (7, Available), (3, Available)]
116
117queueJob :: Maybe PrinterId -> Printout -> Handler API.JobId
118queueJob = return undefined
119
120printerStatus :: PrinterId -> Handler PrinterStatus
121printerStatus = return undefined
122
123listJobs :: Maybe PrinterId -> Maybe API.JobId -> Maybe API.JobId -> Handler (Seq (API.JobId, JobStatus))
124listJobs = return undefined
125
126getJob :: API.JobId -> Handler Printout
127getJob = return undefined
128
129jobStatus :: API.JobId -> Handler JobStatus
130jobStatus = return undefined
131
132deleteJob :: API.JobId -> Handler ()
133deleteJob = return undefined
134
135listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle))
136listDrafts = return undefined
137
138addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId
139addDraft = return undefined
140
141updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler ()
142updateDraft = return undefined
143
144getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout)
145getDraft = return undefined
146
147deleteDraft :: API.DraftId -> Handler ()
148deleteDraft = return undefined
149
150printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId
151printDraft = return undefined
diff --git a/server/src/Thermoprint/Server/API.hs b/server/src/Thermoprint/Server/API.hs
new file mode 100644
index 0000000..9559ad1
--- /dev/null
+++ b/server/src/Thermoprint/Server/API.hs
@@ -0,0 +1,104 @@
1{-# LANGUAGE TypeOperators #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE TemplateHaskell #-}
4
5module Thermoprint.Server.API
6 ( ProtoHandler, Handler
7 , thermoprintServer
8 , handlerNat
9 ) where
10
11import Thermoprint.API hiding (JobId(..), DraftId(..))
12import qualified Thermoprint.API as API (JobId(..), DraftId(..))
13import Data.Set (Set)
14import qualified Data.Set as Set
15import Data.Sequence (Seq)
16import qualified Data.Sequence as Seq
17import Data.Map (Map)
18import qualified Data.Map as Map
19
20import Servant
21import Servant.Server
22import Servant.Server.Internal.Enter
23
24import Control.Monad.Logger
25import Control.Monad.Reader
26import Control.Monad.Trans.Either
27import Control.Monad.IO.Class
28
29import Control.Monad ((<=<), liftM2)
30import Prelude hiding ((.), id)
31import Control.Category
32
33import Database.Persist
34import Database.Persist.Sql
35
36type ProtoHandler = ReaderT HandlerInput (LoggingT IO)
37type Handler = EitherT ServantErr ProtoHandler
38
39data HandlerInput = HandlerInput { sqlPool :: ConnectionPool
40 }
41
42handlerNat :: ( MonadReader ConnectionPool m
43 , MonadLoggerIO m
44 ) => m (Handler :~> EitherT ServantErr IO)
45handlerNat = do
46 sqlPool <- ask
47 logFunc <- askLoggerIO
48 let
49 handlerInput = HandlerInput
50 { sqlPool = sqlPool
51 }
52 protoNat :: ProtoHandler :~> IO
53 protoNat = Nat (($ logFunc) . runLoggingT) . runReaderTNat handlerInput
54 return $ hoistNat protoNat
55
56thermoprintServer :: ServerT ThermoprintAPI Handler
57thermoprintServer = listPrinters
58 :<|> (listJobs :<|> queueJob)
59 :<|> getJob <||> jobStatus <||> deleteJob
60 :<|> (listDrafts :<|> addDraft)
61 :<|> updateDraft <||> getDraft <||> deleteDraft <||> printDraft
62 where
63 (<||>) :: Monad m => m a -> m b -> m (a :<|> b)
64 (<||>) = liftM2 (:<|>)
65 infixr 9 <||>
66
67listPrinters :: Handler (Map PrinterId PrinterStatus)
68listPrinters = return $ Map.fromList [(1, Available), (7, Available), (3, Available)]
69
70queueJob :: Maybe PrinterId -> Printout -> Handler API.JobId
71queueJob = return undefined
72
73printerStatus :: PrinterId -> Handler PrinterStatus
74printerStatus = return undefined
75
76listJobs :: Maybe PrinterId -> Maybe API.JobId -> Maybe API.JobId -> Handler (Seq (API.JobId, JobStatus))
77listJobs = return undefined
78
79getJob :: API.JobId -> Handler Printout
80getJob = return undefined
81
82jobStatus :: API.JobId -> Handler JobStatus
83jobStatus = return undefined
84
85deleteJob :: API.JobId -> Handler ()
86deleteJob = return undefined
87
88listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle))
89listDrafts = return undefined
90
91addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId
92addDraft = return undefined
93
94updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler ()
95updateDraft = return undefined
96
97getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout)
98getDraft = return undefined
99
100deleteDraft :: API.DraftId -> Handler ()
101deleteDraft = return undefined
102
103printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId
104printDraft = return undefined
diff --git a/server/thermoprint-server.cabal b/server/thermoprint-server.cabal
index 45e57a6..45f24d3 100644
--- a/server/thermoprint-server.cabal
+++ b/server/thermoprint-server.cabal
@@ -19,6 +19,7 @@ cabal-version: >=1.10
19library 19library
20 exposed-modules: Thermoprint.Server 20 exposed-modules: Thermoprint.Server
21 , Thermoprint.Server.Database 21 , Thermoprint.Server.Database
22 , Thermoprint.Server.API
22 -- other-modules: 23 -- other-modules:
23 -- other-extensions: 24 -- other-extensions:
24 build-depends: base >=4.8 && <5 25 build-depends: base >=4.8 && <5