aboutsummaryrefslogtreecommitdiff
path: root/server/src/Thermoprint/Server/API.hs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/Thermoprint/Server/API.hs')
-rw-r--r--server/src/Thermoprint/Server/API.hs74
1 files changed, 41 insertions, 33 deletions
diff --git a/server/src/Thermoprint/Server/API.hs b/server/src/Thermoprint/Server/API.hs
index 3c8fefe..77f33e7 100644
--- a/server/src/Thermoprint/Server/API.hs
+++ b/server/src/Thermoprint/Server/API.hs
@@ -10,48 +10,54 @@ module Thermoprint.Server.API
10 , handlerNat 10 , handlerNat
11 ) where 11 ) where
12 12
13import Thermoprint.API hiding (JobId(..), DraftId(..)) 13import Thermoprint.API hiding (JobId(..), DraftId(..))
14import qualified Thermoprint.API as API (JobId(..), DraftId(..)) 14import qualified Thermoprint.API as API (JobId(..), DraftId(..))
15 15
16import Thermoprint.Server.Printer 16import Thermoprint.Server.Printer
17import Thermoprint.Server.Database 17import Thermoprint.Server.Database
18 18
19import Data.Set (Set) 19import Data.Set (Set)
20import qualified Data.Set as Set 20import qualified Data.Set as Set
21import Data.Sequence (Seq) 21import Data.Sequence (Seq)
22import qualified Data.Sequence as Seq 22import qualified Data.Sequence as Seq
23import Data.Map (Map) 23import Data.Map (Map)
24import qualified Data.Map as Map 24import qualified Data.Map as Map
25 25
26import qualified Data.Text as T 26import qualified Data.Text as T
27 27
28import Servant 28import Servant
29import Servant.Server 29import Servant.Server
30import Servant.Server.Internal.Enter 30import Servant.Server.Internal.Enter
31 31
32import Control.Monad.Logger 32import Control.Monad.Logger
33import Control.Monad.Reader 33import Control.Monad.Reader
34import Control.Monad.Trans.Resource 34import Control.Monad.Trans.Resource
35import Control.Monad.Trans.Either 35import Control.Monad.Trans.Either
36import Control.Monad.IO.Class 36import Control.Monad.IO.Class
37 37
38import Control.Concurrent.STM 38import Control.Concurrent.STM
39 39
40import Control.Monad ((<=<), liftM2) 40import Control.Monad ((<=<), liftM2)
41import Prelude hiding ((.), id, mapM) 41import Prelude hiding ((.), id, mapM)
42import Control.Category 42import Control.Category
43 43
44import Control.DeepSeq 44import Control.DeepSeq
45 45
46import Data.Foldable (toList) 46import Data.Foldable (toList)
47import Data.Traversable (mapM) 47import Data.Traversable (mapM)
48import Data.Bifunctor 48import Data.Bifunctor
49import Data.Monoid 49import Data.Monoid
50import Data.Maybe 50import Data.Maybe
51import Data.Function (on) 51import Data.Function (on)
52 52
53import Database.Persist 53import Database.Persist
54import Database.Persist.Sql 54import Database.Persist.Sql
55
56import Data.Conduit (Source, sourceToList, mapOutput)
57
58import Data.Acquire (with)
59
60import Control.Monad.Catch (handle, catch)
55 61
56type ProtoHandler = ReaderT HandlerInput (LoggingT (ResourceT IO)) 62type ProtoHandler = ReaderT HandlerInput (LoggingT (ResourceT IO))
57type Handler = EitherT ServantErr ProtoHandler 63type Handler = EitherT ServantErr ProtoHandler
@@ -156,19 +162,21 @@ abortJob jobId = do
156 when (not found) $ left err404 162 when (not found) $ left err404
157 163
158listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle)) 164listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle))
159listDrafts = return undefined 165listDrafts = asks sqlPool >>= runSqlPool (selectSourceRes [] []) >>= flip with toMap
166 where
167 toMap source = fmap Map.fromList . sourceToList $ (\(Entity key (Draft title _)) -> (castId key, title)) `mapOutput` source
160 168
161addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId 169addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId
162addDraft = return undefined 170addDraft title content = fmap castId . runSqlPool (insert $ Draft title content) =<< asks sqlPool
163 171
164updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler () 172updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler ()
165updateDraft = return undefined 173updateDraft draftId title content = (\(KeyNotFound _) -> left $ err404) `handle` (runSqlPool (update (castId draftId) [ DraftTitle =. title, DraftContent =. content ]) =<< asks sqlPool)
166 174
167getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout) 175getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout)
168getDraft = return undefined 176getDraft draftId = fmap (\(Draft title content) -> (title, content)) . maybe (left err404) return =<< runSqlPool (get $ castId draftId) =<< asks sqlPool
169 177
170deleteDraft :: API.DraftId -> Handler () 178deleteDraft :: API.DraftId -> Handler ()
171deleteDraft = return undefined 179deleteDraft draftId = runSqlPool (delete $ (castId draftId :: Key Draft)) =<< asks sqlPool
172 180
173printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId 181printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId
174printDraft = return undefined 182printDraft draftId printerId = (\(Draft _ content) -> queueJob printerId content) =<< maybe (left err404) return =<< runSqlPool (get $ castId draftId) =<< asks sqlPool