From b508a6bd35d28260f307acf8ffde8b7acf843a09 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Sat, 23 Jan 2016 12:52:15 +0000 Subject: Db layout, persistent-inst. & printer framework --- server/src/Thermoprint/Server/Database.hs | 5 +++- .../src/Thermoprint/Server/Database/Instances.hs | 33 ++++++++++++++++++++++ server/src/Thermoprint/Server/Printer.hs | 29 +++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 server/src/Thermoprint/Server/Database/Instances.hs create mode 100644 server/src/Thermoprint/Server/Printer.hs (limited to 'server/src') diff --git a/server/src/Thermoprint/Server/Database.hs b/server/src/Thermoprint/Server/Database.hs index 61179e6..65bfc37 100644 --- a/server/src/Thermoprint/Server/Database.hs +++ b/server/src/Thermoprint/Server/Database.hs @@ -11,13 +11,16 @@ module Thermoprint.Server.Database , migrateAll ) where -import Thermoprint.API (Printout, DraftTitle) +import Thermoprint.API (Printout, DraftTitle, JobStatus) import Database.Persist.TH +import Thermoprint.Server.Database.Instances + share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| Job content Printout + status JobStatus Draft title DraftTitle Maybe content Printout diff --git a/server/src/Thermoprint/Server/Database/Instances.hs b/server/src/Thermoprint/Server/Database/Instances.hs new file mode 100644 index 0000000..f5c22fd --- /dev/null +++ b/server/src/Thermoprint/Server/Database/Instances.hs @@ -0,0 +1,33 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE FlexibleInstances #-} + +module Thermoprint.Server.Database.Instances where + +import Thermoprint.API (Printout, JobStatus, PrintingError) + +import Database.Persist (PersistField(..)) +import Database.Persist.Sql (PersistFieldSql(..)) +import Database.Persist.TH + +import Control.Monad ((<=<)) +import Data.Bifunctor + +import qualified Data.Aeson as JSON (encode, eitherDecodeStrict') + +import Data.ByteString (ByteString) +import qualified Data.ByteString.Lazy as LBS (toStrict) +import qualified Data.Text as T (pack) + +import Data.Proxy + +-- | Instead of deriving an instance using 'derivePersistField', which would use 'show' and 'read', we write our own by hand in order to use json +instance PersistField Printout where + toPersistValue = toPersistValue . LBS.toStrict . JSON.encode + fromPersistValue = first T.pack . JSON.eitherDecodeStrict' <=< fromPersistValue + +instance PersistFieldSql Printout where + sqlType _ = sqlType (Proxy :: Proxy ByteString) + +derivePersistField "PrintingError" +derivePersistField "JobStatus" diff --git a/server/src/Thermoprint/Server/Printer.hs b/server/src/Thermoprint/Server/Printer.hs new file mode 100644 index 0000000..e66afff --- /dev/null +++ b/server/src/Thermoprint/Server/Printer.hs @@ -0,0 +1,29 @@ +{-# LANGUAGE RankNTypes #-} + +module Thermoprint.Server.Printer + ( Printer + ) where + +import Thermoprint.API (PrintingError(..), Printout) + +import Thermoprint.Server.Database + +import Database.Persist +import Database.Persist.Sql + +import Data.Sequence (Seq, ViewL(..)) +import qualified Data.Sequence as Seq +import Data.Map (Map) +import qualified Data.Map as Map + +import Control.Monad.IO.Class (MonadIO) + +import Control.Concurrent.STM + +data Printer = Printer + { print :: forall m. (MonadIO m) => Printout -> m (Maybe PrintingError) + , queue :: TVar (Seq JobId) + } + +runPrinter :: Printer -> IO () +runPrinter = undefined -- cgit v1.2.3