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.hs34
1 files changed, 19 insertions, 15 deletions
diff --git a/server/src/Thermoprint/Server/API.hs b/server/src/Thermoprint/Server/API.hs
index f7a8576..30ef290 100644
--- a/server/src/Thermoprint/Server/API.hs
+++ b/server/src/Thermoprint/Server/API.hs
@@ -29,6 +29,7 @@ import qualified Data.Text as T
29 29
30import Servant hiding (Handler) 30import Servant hiding (Handler)
31import Servant.Server hiding (Handler) 31import Servant.Server hiding (Handler)
32import qualified Servant.Server as Servant (Handler(..))
32import Servant.Utils.Enter 33import Servant.Utils.Enter
33import Servant.Utils.Links 34import Servant.Utils.Links
34 35
@@ -75,8 +76,8 @@ data HandlerInput = HandlerInput { sqlPool :: ConnectionPool -- ^ How to intera
75 76
76handlerNat :: ( MonadReader ConnectionPool m 77handlerNat :: ( MonadReader ConnectionPool m
77 , MonadLoggerIO m 78 , MonadLoggerIO m
78 ) => Map PrinterId Printer -> TChan Notification -> m (Handler :~> ExceptT ServantErr IO) 79 ) => Map PrinterId Printer -> TChan Notification -> m (Handler :~> Servant.Handler)
79-- ^ Servant requires its handlers to be 'ExceptT ServantErr IO' 80-- ^ Servant requires its handlers to be essentially 'ExceptT ServantErr IO'
80-- 81--
81-- This generates a 'Nat'ural transformation for squashing the monad-transformer-stack we use in our handlers to the monad 'servant-server' wants 82-- This generates a 'Nat'ural transformation for squashing the monad-transformer-stack we use in our handlers to the monad 'servant-server' wants
82handlerNat printerMap nChan = do 83handlerNat printerMap nChan = do
@@ -89,8 +90,11 @@ handlerNat printerMap nChan = do
89 , nChan = nChan 90 , nChan = nChan
90 } 91 }
91 protoNat :: ProtoHandler :~> IO 92 protoNat :: ProtoHandler :~> IO
92 protoNat = Nat runResourceT . Nat (($ logFunc) . runLoggingT) . runReaderTNat handlerInput 93 protoNat = NT runResourceT . NT (($ logFunc) . runLoggingT) . runReaderTNat handlerInput
93 return $ hoistNat protoNat 94 return $ NT Servant.Handler . hoistNat protoNat
95
96runSql :: ReaderT SqlBackend ProtoHandler a -> Handler a
97runSql act = lift $ runSqlPool act =<< asks sqlPool
94 98
95thermoprintServer :: ServerT ThermoprintAPI Handler 99thermoprintServer :: ServerT ThermoprintAPI Handler
96-- ^ A 'servant-server' for 'ThermoprintAPI' 100-- ^ A 'servant-server' for 'ThermoprintAPI'
@@ -157,7 +161,7 @@ listJobs pId idR timeR = fmap (filterJobs . extractJobs) . (\(a, b) -> (,) a
157 ) 161 )
158 162
159getJob :: API.JobId -> Handler Printout 163getJob :: API.JobId -> Handler Printout
160getJob jobId = fmap jobContent . maybe (throwError err404) return =<< runSqlPool (get $ castId jobId) =<< asks sqlPool 164getJob jobId = fmap jobContent . maybe (throwError err404) return =<< runSql (get $ castId jobId)
161 165
162jobStatus :: API.JobId -> Handler JobStatus 166jobStatus :: API.JobId -> Handler JobStatus
163jobStatus jobId = maybe (throwError err404) return . lookup jobId . map (\(id, _, st) -> (id, st)) . toList =<< listJobs Nothing Nothing Nothing 167jobStatus jobId = maybe (throwError err404) return . lookup jobId . map (\(id, _, st) -> (id, st)) . toList =<< listJobs Nothing Nothing Nothing
@@ -174,36 +178,36 @@ abortJob needle = do
174 return . not $ ((==) `on` length) pending filtered 178 return . not $ ((==) `on` length) pending filtered
175 when found $ do 179 when found $ do
176 $(logInfo) $ "Removed job #" <> (T.pack $ show (castId needle :: Integer)) <> " from " <> (T.pack . show $ pId') 180 $(logInfo) $ "Removed job #" <> (T.pack $ show (castId needle :: Integer)) <> " from " <> (T.pack . show $ pId')
177 notify $ safeLink thermoprintAPI (Proxy :: Proxy ("jobs" :> Get '[JSON] (Seq (API.JobId, UTCTime, JobStatus)))) 181 notify . linkURI $ safeLink thermoprintAPI (Proxy :: Proxy ("jobs" :> Get '[JSON] (Seq (API.JobId, UTCTime, JobStatus))))
178 return found 182 return found
179 when (not found) $ throwError err404 183 when (not found) $ throwError err404
180 184
181listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle)) 185listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle))
182listDrafts = asks sqlPool >>= runSqlPool (selectSourceRes [] []) >>= flip with toMap 186listDrafts = runSql (selectSourceRes [] []) >>= lift . flip with toMap
183 where 187 where
184 toMap source = fmap Map.fromList . sourceToList $ (\(Entity key (Draft title _)) -> (castId key, title)) `mapOutput` source 188 toMap source = fmap Map.fromList . sourceToList $ (\(Entity key (Draft title _)) -> (castId key, title)) `mapOutput` source
185 189
186addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId 190addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId
187addDraft title content = do 191addDraft title content = do
188 id <- fmap castId . runSqlPool (insert $ Draft title content) =<< asks sqlPool 192 id <- castId <$> runSql (insert $ Draft title content)
189 $(logInfo) $ "Added draft #" <> (T.pack $ show (castId id :: Integer)) <> " (" <> (T.pack $ show title) <> ")" 193 $(logInfo) $ "Added draft #" <> (T.pack $ show (castId id :: Integer)) <> " (" <> (T.pack $ show title) <> ")"
190 notify $ safeLink thermoprintAPI (Proxy :: Proxy ("drafts" :> Get '[JSON] (Map API.DraftId (Maybe DraftTitle)))) 194 notify . linkURI $ safeLink thermoprintAPI (Proxy :: Proxy ("drafts" :> Get '[JSON] (Map API.DraftId (Maybe DraftTitle))))
191 return id 195 return id
192 196
193updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler () 197updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler ()
194updateDraft draftId title content = handle (\(KeyNotFound _) -> throwError $ err404) $ do 198updateDraft draftId title content = handle (\(KeyNotFound _) -> throwError $ err404) $ do
195 void . runSqlPool (updateGet (castId draftId) [ DraftTitle =. title, DraftContent =. content ]) =<< asks sqlPool 199 void . runSql $ updateGet (castId draftId) [ DraftTitle =. title, DraftContent =. content ]
196 $(logInfo) $ "Updated draft #" <> (T.pack $ show (castId draftId :: Integer)) 200 $(logInfo) $ "Updated draft #" <> (T.pack $ show (castId draftId :: Integer))
197 notify $ safeLink thermoprintAPI (Proxy :: Proxy ("draft" :> Capture "draftId" API.DraftId :> Get '[JSON] (Maybe DraftTitle, Printout))) $ draftId 201 notify . linkURI $ safeLink thermoprintAPI (Proxy :: Proxy ("draft" :> Capture "draftId" API.DraftId :> Get '[JSON] (Maybe DraftTitle, Printout))) $ draftId
198 202
199getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout) 203getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout)
200getDraft draftId = fmap (\(Draft title content) -> (title, content)) . maybe (throwError err404) return =<< runSqlPool (get $ castId draftId) =<< asks sqlPool 204getDraft draftId = fmap (\(Draft title content) -> (title, content)) . maybe (throwError err404) return =<< runSql (get $ castId draftId)
201 205
202deleteDraft :: API.DraftId -> Handler () 206deleteDraft :: API.DraftId -> Handler ()
203deleteDraft draftId = do 207deleteDraft draftId = do
204 runSqlPool (delete $ (castId draftId :: Key Draft)) =<< asks sqlPool 208 runSql $ delete (castId draftId :: Key Draft)
205 $(logInfo) $ "Made sure draft #" <> (T.pack $ show (castId draftId :: Integer)) <> " is Deleted" 209 $(logInfo) $ "Made sure draft #" <> (T.pack $ show (castId draftId :: Integer)) <> " is Deleted"
206 notify $ safeLink thermoprintAPI (Proxy :: Proxy ("drafts" :> Get '[JSON] (Map API.DraftId (Maybe DraftTitle)))) 210 notify . linkURI $ safeLink thermoprintAPI (Proxy :: Proxy ("drafts" :> Get '[JSON] (Map API.DraftId (Maybe DraftTitle))))
207 211
208printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId 212printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId
209printDraft draftId printerId = (\(Draft _ content) -> queueJob printerId content) =<< maybe (throwError err404) return =<< runSqlPool (get $ castId draftId) =<< asks sqlPool 213printDraft draftId printerId = (\(Draft _ content) -> queueJob printerId content) =<< maybe (throwError err404) return =<< runSql (get $ castId draftId)