aboutsummaryrefslogtreecommitdiff
path: root/server/src/Thermoprint/Server.hs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/Thermoprint/Server.hs')
-rw-r--r--server/src/Thermoprint/Server.hs105
1 files changed, 12 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