aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2016-01-28 12:09:41 +0000
committerGregor Kleen <gkleen@yggdrasil.li>2016-01-28 12:09:41 +0000
commitf236eb926bd554cb6494a0184d1070f264c4d03a (patch)
treec79deb2b5e99dca9019daad6a945d36f4ab24456
parent36bc432fc0f8ae46c7ff0de162ee275d25f12e3a (diff)
downloadthermoprint-f236eb926bd554cb6494a0184d1070f264c4d03a.tar
thermoprint-f236eb926bd554cb6494a0184d1070f264c4d03a.tar.gz
thermoprint-f236eb926bd554cb6494a0184d1070f264c4d03a.tar.bz2
thermoprint-f236eb926bd554cb6494a0184d1070f264c4d03a.tar.xz
thermoprint-f236eb926bd554cb6494a0184d1070f264c4d03a.zip
Draft CRUD
-rw-r--r--server/src/Thermoprint/Server/API.hs74
-rw-r--r--server/src/Thermoprint/Server/Database.hs7
-rw-r--r--server/thermoprint-server.cabal2
-rw-r--r--server/thermoprint-server.nix17
4 files changed, 53 insertions, 47 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
diff --git a/server/src/Thermoprint/Server/Database.hs b/server/src/Thermoprint/Server/Database.hs
index 5bd4512..7f21bf9 100644
--- a/server/src/Thermoprint/Server/Database.hs
+++ b/server/src/Thermoprint/Server/Database.hs
@@ -7,12 +7,7 @@
7{-# LANGUAGE StandaloneDeriving #-} 7{-# LANGUAGE StandaloneDeriving #-}
8{-# LANGUAGE FlexibleInstances #-} 8{-# LANGUAGE FlexibleInstances #-}
9 9
10module Thermoprint.Server.Database 10module Thermoprint.Server.Database where
11 ( Job(..), JobId
12 , Draft(..), DraftId
13 , Key(..)
14 , migrateAll
15 ) where
16 11
17import Control.DeepSeq 12import Control.DeepSeq
18 13
diff --git a/server/thermoprint-server.cabal b/server/thermoprint-server.cabal
index dd495c0..181bd9a 100644
--- a/server/thermoprint-server.cabal
+++ b/server/thermoprint-server.cabal
@@ -43,6 +43,8 @@ library
43 , stm >=2.4.4 && <3 43 , stm >=2.4.4 && <3
44 , deepseq >=1.4.1 && <2 44 , deepseq >=1.4.1 && <2
45 , monad-control >=1.0.0 && <2 45 , monad-control >=1.0.0 && <2
46 , conduit >=1.2.6 && <2
47 , exceptions >=0.8.0 && <1
46 hs-source-dirs: src 48 hs-source-dirs: src
47 default-language: Haskell2010 49 default-language: Haskell2010
48 50
diff --git a/server/thermoprint-server.nix b/server/thermoprint-server.nix
index 46859e2..8ac5456 100644
--- a/server/thermoprint-server.nix
+++ b/server/thermoprint-server.nix
@@ -1,7 +1,8 @@
1{ mkDerivation, base, containers, data-default-class, deepseq, dyre 1{ mkDerivation, base, conduit, containers, data-default-class
2, either, monad-control, monad-logger, mtl, persistent 2, deepseq, dyre, either, exceptions, monad-control, monad-logger
3, persistent-sqlite, persistent-template, resourcet, servant-server 3, mtl, persistent, persistent-sqlite, persistent-template
4, stdenv, stm, text, thermoprint-spec, transformers, wai, warp 4, resourcet, servant-server, stdenv, stm, text, thermoprint-spec
5, transformers, wai, warp
5}: 6}:
6mkDerivation { 7mkDerivation {
7 pname = "thermoprint-server"; 8 pname = "thermoprint-server";
@@ -10,10 +11,10 @@ mkDerivation {
10 isLibrary = true; 11 isLibrary = true;
11 isExecutable = true; 12 isExecutable = true;
12 libraryHaskellDepends = [ 13 libraryHaskellDepends = [
13 base containers data-default-class deepseq dyre either 14 base conduit containers data-default-class deepseq dyre either
14 monad-control monad-logger mtl persistent persistent-template 15 exceptions monad-control monad-logger mtl persistent
15 resourcet servant-server stm text thermoprint-spec transformers wai 16 persistent-template resourcet servant-server stm text
16 warp 17 thermoprint-spec transformers wai warp
17 ]; 18 ];
18 executableHaskellDepends = [ 19 executableHaskellDepends = [
19 base monad-logger mtl persistent-sqlite resourcet 20 base monad-logger mtl persistent-sqlite resourcet