diff options
Diffstat (limited to 'server/src/Thermoprint/Server/API.hs')
-rw-r--r-- | server/src/Thermoprint/Server/API.hs | 34 |
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 | ||
30 | import Servant hiding (Handler) | 30 | import Servant hiding (Handler) |
31 | import Servant.Server hiding (Handler) | 31 | import Servant.Server hiding (Handler) |
32 | import qualified Servant.Server as Servant (Handler(..)) | ||
32 | import Servant.Utils.Enter | 33 | import Servant.Utils.Enter |
33 | import Servant.Utils.Links | 34 | import Servant.Utils.Links |
34 | 35 | ||
@@ -75,8 +76,8 @@ data HandlerInput = HandlerInput { sqlPool :: ConnectionPool -- ^ How to intera | |||
75 | 76 | ||
76 | handlerNat :: ( MonadReader ConnectionPool m | 77 | handlerNat :: ( 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 |
82 | handlerNat printerMap nChan = do | 83 | handlerNat 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 | |||
96 | runSql :: ReaderT SqlBackend ProtoHandler a -> Handler a | ||
97 | runSql act = lift $ runSqlPool act =<< asks sqlPool | ||
94 | 98 | ||
95 | thermoprintServer :: ServerT ThermoprintAPI Handler | 99 | thermoprintServer :: 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 | ||
159 | getJob :: API.JobId -> Handler Printout | 163 | getJob :: API.JobId -> Handler Printout |
160 | getJob jobId = fmap jobContent . maybe (throwError err404) return =<< runSqlPool (get $ castId jobId) =<< asks sqlPool | 164 | getJob jobId = fmap jobContent . maybe (throwError err404) return =<< runSql (get $ castId jobId) |
161 | 165 | ||
162 | jobStatus :: API.JobId -> Handler JobStatus | 166 | jobStatus :: API.JobId -> Handler JobStatus |
163 | jobStatus jobId = maybe (throwError err404) return . lookup jobId . map (\(id, _, st) -> (id, st)) . toList =<< listJobs Nothing Nothing Nothing | 167 | jobStatus 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 | ||
181 | listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle)) | 185 | listDrafts :: Handler (Map API.DraftId (Maybe DraftTitle)) |
182 | listDrafts = asks sqlPool >>= runSqlPool (selectSourceRes [] []) >>= flip with toMap | 186 | listDrafts = 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 | ||
186 | addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId | 190 | addDraft :: Maybe DraftTitle -> Printout -> Handler API.DraftId |
187 | addDraft title content = do | 191 | addDraft 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 | ||
193 | updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler () | 197 | updateDraft :: API.DraftId -> Maybe DraftTitle -> Printout -> Handler () |
194 | updateDraft draftId title content = handle (\(KeyNotFound _) -> throwError $ err404) $ do | 198 | updateDraft 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 | ||
199 | getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout) | 203 | getDraft :: API.DraftId -> Handler (Maybe DraftTitle, Printout) |
200 | getDraft draftId = fmap (\(Draft title content) -> (title, content)) . maybe (throwError err404) return =<< runSqlPool (get $ castId draftId) =<< asks sqlPool | 204 | getDraft draftId = fmap (\(Draft title content) -> (title, content)) . maybe (throwError err404) return =<< runSql (get $ castId draftId) |
201 | 205 | ||
202 | deleteDraft :: API.DraftId -> Handler () | 206 | deleteDraft :: API.DraftId -> Handler () |
203 | deleteDraft draftId = do | 207 | deleteDraft 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 | ||
208 | printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId | 212 | printDraft :: API.DraftId -> Maybe PrinterId -> Handler API.JobId |
209 | printDraft draftId printerId = (\(Draft _ content) -> queueJob printerId content) =<< maybe (throwError err404) return =<< runSqlPool (get $ castId draftId) =<< asks sqlPool | 213 | printDraft draftId printerId = (\(Draft _ content) -> queueJob printerId content) =<< maybe (throwError err404) return =<< runSql (get $ castId draftId) |