aboutsummaryrefslogtreecommitdiff
path: root/server/src/Thermoprint/Server/API.hs
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/src/Thermoprint/Server/API.hs
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/src/Thermoprint/Server/API.hs')
-rw-r--r--server/src/Thermoprint/Server/API.hs104
1 files changed, 104 insertions, 0 deletions
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