Add a few calls
This commit is contained in:
parent
e908d9dd8e
commit
3e4548dc75
@ -1,3 +1,4 @@
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE OverloadedRecordDot #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE TypeApplications #-}
|
||||
@ -69,6 +70,12 @@ locations = all_ garfieldDb.locations
|
||||
|
||||
-- Inserts
|
||||
|
||||
runIns
|
||||
:: Connection
|
||||
-> SqlInsert Postgres table
|
||||
-> IO ()
|
||||
runIns conn i = runBeamPostgresDebug putStrLn conn $ runInsert i
|
||||
|
||||
transfer
|
||||
:: InventoryItemId -- ^ to
|
||||
-> InventoryItemId -- ^ from
|
||||
@ -94,6 +101,9 @@ transfer from to amount
|
||||
|
||||
type SqlFunction a = Connection -> IO a
|
||||
|
||||
runFunction :: Connection -> SqlFunction a -> IO a
|
||||
runFunction conn f = f conn
|
||||
|
||||
snackDelete :: SnackId -> SqlFunction ()
|
||||
snackDelete snack conn = do
|
||||
[Only ()] <- query conn "SELECT garfield.snack_delete(?)" (Only $ snack.unSnackId)
|
||||
@ -105,6 +115,18 @@ snackCreate name barcode price taxGroup location conn = do
|
||||
(name, barcode, price, taxGroup.unTaxGroupId, location.unLocationId)
|
||||
pure $ mkSnackId rawSnackId
|
||||
|
||||
snackUpdate
|
||||
:: SnackId
|
||||
-> Text -- Name
|
||||
-> Text -- Barcode
|
||||
-> Scientific
|
||||
-> TaxGroupId
|
||||
-> SqlFunction SnackId
|
||||
snackUpdate snack name barcode price taxGroup conn = do
|
||||
[Only rawSnackId] <- query conn "SELECT garfield.snack_update(?, ?, ?, ?, ?)"
|
||||
(snack.unSnackId, name, barcode, price, taxGroup.unTaxGroupId)
|
||||
pure $ mkSnackId rawSnackId
|
||||
|
||||
inventoryMapSnack :: SnackId -> InventoryItemId -> SqlFunction ()
|
||||
inventoryMapSnack snack item conn = do
|
||||
[Only ()] <- query conn "SELECT garfield.inventory_map_snack(?, ?)" (snack.unSnackId, item.unInventoryItemId)
|
||||
|
@ -1,5 +1,7 @@
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE TypeOperators #-}
|
||||
|
||||
module Jon.Main
|
||||
( main
|
||||
@ -12,7 +14,6 @@ import Control.Exception (bracket)
|
||||
import Database.Beam
|
||||
import Database.Beam.Postgres
|
||||
import Servant
|
||||
import Servant.Swagger
|
||||
import Servant.Swagger.UI
|
||||
import System.Environment
|
||||
import Network.Wai.Handler.Warp (run)
|
||||
@ -28,6 +29,7 @@ main = withGarfieldConn $ \conn ->
|
||||
p :: Proxy (JonAPI :<|> SwaggerSchemaUI "swagger" "swagger.json")
|
||||
p = Proxy
|
||||
|
||||
withGarfieldConn :: (Connection -> IO a) -> IO a
|
||||
withGarfieldConn = bracket
|
||||
(do pass <- getEnv "JON_PASS"
|
||||
connectPostgreSQL $ BS8.pack $ "host=localhost dbname=garfield password=" ++ pass)
|
||||
|
@ -1,9 +1,15 @@
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE DeriveAnyClass #-}
|
||||
{-# LANGUAGE DeriveGeneric #-}
|
||||
{-# LANGUAGE DuplicateRecordFields #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE FlexibleInstances #-}
|
||||
{-# LANGUAGE OverloadedLists #-}
|
||||
{-# LANGUAGE OverloadedRecordDot #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE StandaloneDeriving #-}
|
||||
{-# LANGUAGE TypeOperators #-}
|
||||
{-# LANGUAGE TypeSynonymInstances #-}
|
||||
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
||||
|
||||
module Jon.Server (JonAPI, jonSwaggerDoc, server) where
|
||||
@ -12,7 +18,8 @@ import Control.Lens
|
||||
import Control.Monad.IO.Class (liftIO)
|
||||
import Data.Aeson (FromJSON, ToJSON(toJSON))
|
||||
import Data.Text (Text)
|
||||
import Data.Int (Int32)
|
||||
import Data.Int (Int32, Int64)
|
||||
import Data.Scientific (Scientific)
|
||||
import Data.Swagger
|
||||
import Database.PostgreSQL.Simple (Connection)
|
||||
import GHC.Generics (Generic)
|
||||
@ -27,13 +34,24 @@ import qualified Jon.Garfield.Queries as Queries
|
||||
|
||||
type JonAPI =
|
||||
"rpc" :>
|
||||
( "getUnsoundBarcodes" :> ReqBody '[JSON] GetUnsoundBarcodesP
|
||||
( "getUnsoundBarcodes" :> Summary "Get information on barcodes with at least two items"
|
||||
:> ReqBody '[JSON] GetUnsoundBarcodesP
|
||||
:> Post '[JSON] [UnsoundBarcodeDTO]
|
||||
:<|> "getOverviewItems" :> ReqBody '[JSON] GetOverviewItemsP
|
||||
:<|> "getOverviewItems" :> Summary "Get overview of all active items"
|
||||
:> ReqBody '[JSON] GetOverviewItemsP
|
||||
:> Post '[JSON] [OverviewItemDTO]
|
||||
:<|> "getActiveItems" :> ReqBody '[JSON] GetActiveItemsP
|
||||
:<|> "getActiveItems" :> Summary "Get currently active items for a barcode"
|
||||
:> ReqBody '[JSON] GetActiveItemsP
|
||||
:> Post '[JSON] [OverviewItemDTO]
|
||||
:<|> "getLocations" :> Post '[JSON] [Location]
|
||||
:<|> "getLocations" :> Summary "Get a list of all locations"
|
||||
:> Post '[JSON] [Location]
|
||||
:<|> "transferInventory" :> Summary "Transfer inventory between items"
|
||||
:> Description "If `amount` is negative, its absolute value is transferred in the opposite direction."
|
||||
:> ReqBody '[JSON] TransferInventoryP
|
||||
:> PostNoContent
|
||||
:<|> "updateSnack" :> Summary "Update a snack"
|
||||
:> ReqBody '[JSON] UpdateSnackP
|
||||
:> Post '[JSON] SnackId
|
||||
)
|
||||
|
||||
data GetUnsoundBarcodesP = GetUnsoundBarcodesP
|
||||
@ -63,7 +81,22 @@ data GetActiveItemsP = GetActiveItemsP
|
||||
, location :: Int32
|
||||
} deriving (Generic, FromJSON, ToSchema)
|
||||
|
||||
data TransferInventoryP = TransferInventoryP
|
||||
{ from :: Int32
|
||||
, to :: Int32
|
||||
, amount :: Int64
|
||||
} deriving (Generic, FromJSON, ToSchema)
|
||||
|
||||
data UpdateSnackP = UpdateSnackP
|
||||
{ snack :: Int32
|
||||
, name :: Text
|
||||
, barcode :: Text
|
||||
, price :: Scientific
|
||||
, taxGroup :: Int32
|
||||
} deriving (Generic, FromJSON, ToSchema)
|
||||
|
||||
-- Orphan instances for database types
|
||||
-- needed for serialization and swagger doc
|
||||
|
||||
instance ToJSON InventoryItemId where
|
||||
toJSON = toJSON . (.unInventoryItemId)
|
||||
@ -85,6 +118,11 @@ instance ToJSON LocationId where
|
||||
instance ToSchema LocationId where
|
||||
declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy Int32)
|
||||
|
||||
instance ToJSON SnackId where
|
||||
toJSON = toJSON . (.unSnackId)
|
||||
instance ToSchema SnackId where
|
||||
declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy Int32)
|
||||
|
||||
deriving instance ToJSON Overview
|
||||
deriving instance ToSchema Overview
|
||||
|
||||
@ -97,7 +135,7 @@ deriving instance ToSchema Location
|
||||
-- server
|
||||
|
||||
server :: Connection -> Server JonAPI
|
||||
server conn = getUnsoundBarcodes :<|> getOverviewItems :<|> getActiveItems :<|> getLocations
|
||||
server conn = getUnsoundBarcodes :<|> getOverviewItems :<|> getActiveItems :<|> getLocations :<|> transferInventory :<|> updateSnack
|
||||
where
|
||||
getUnsoundBarcodes :: GetUnsoundBarcodesP -> Handler [UnsoundBarcodeDTO]
|
||||
getUnsoundBarcodes params = do
|
||||
@ -120,5 +158,23 @@ server conn = getUnsoundBarcodes :<|> getOverviewItems :<|> getActiveItems :<|>
|
||||
getLocations = do
|
||||
liftIO $ Queries.runSelect conn Queries.locations
|
||||
|
||||
transferInventory params = do
|
||||
liftIO $ Queries.runIns conn $ Queries.transfer
|
||||
(mkInventoryItemId params.from)
|
||||
(mkInventoryItemId params.to)
|
||||
params.amount
|
||||
pure NoContent
|
||||
|
||||
updateSnack params = do
|
||||
liftIO $ Queries.runFunction conn $ Queries.snackUpdate
|
||||
(mkSnackId params.snack)
|
||||
params.name
|
||||
params.barcode
|
||||
params.price
|
||||
(mkTaxGroupId params.taxGroup)
|
||||
|
||||
jonSwaggerDoc :: Swagger
|
||||
jonSwaggerDoc = toSwagger (Proxy :: Proxy JonAPI)
|
||||
& info . title .~ "jon API"
|
||||
& info . title .~ "jon API"
|
||||
& info . version .~ "0.1.1"
|
||||
& applyTags [Tag "jon RPC" (Just "Crudely improvised Garfield API") Nothing]
|
||||
|
Loading…
x
Reference in New Issue
Block a user