web: support adding new transactions via JSON PUT (#316)
A single transaction can be added by PUT to /add. (I read that PUT, not POST, should be used to create; perhaps the web add form should also use PUT ?) As with the web form, the `add` capability is required (and enabled by default). Here's how to test with curl: $ curl -s http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @in.json; echo New readJsonFile/writeJsonFile helpers in Hledger.Web.Json are handy for generating test data. Eg: >>> writeJsonFile "in.json" (head $ jtxns samplejournal)
This commit is contained in:
parent
b46212ae50
commit
2dc716cdb4
@ -7,14 +7,20 @@
|
|||||||
module Hledger.Web.Handler.AddR
|
module Hledger.Web.Handler.AddR
|
||||||
( getAddR
|
( getAddR
|
||||||
, postAddR
|
, postAddR
|
||||||
|
, putAddR
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Data.Aeson.Types (Result(..))
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
|
import Network.HTTP.Types.Status (status400)
|
||||||
import Text.Blaze.Html (preEscapedToHtml)
|
import Text.Blaze.Html (preEscapedToHtml)
|
||||||
|
import Yesod
|
||||||
|
|
||||||
import Hledger
|
import Hledger
|
||||||
import Hledger.Cli.Commands.Add (appendToJournalFileOrStdout)
|
import Hledger.Cli.Commands.Add (appendToJournalFileOrStdout, journalAddTransaction)
|
||||||
import Hledger.Web.Import
|
import Hledger.Web.Import
|
||||||
|
import Hledger.Web.Json ()
|
||||||
|
import Hledger.Web.WebOptions (WebOpts(..))
|
||||||
import Hledger.Web.Widget.AddForm (addForm)
|
import Hledger.Web.Widget.AddForm (addForm)
|
||||||
|
|
||||||
getAddR :: Handler ()
|
getAddR :: Handler ()
|
||||||
@ -31,6 +37,7 @@ postAddR = do
|
|||||||
let t = txnTieKnot res'
|
let t = txnTieKnot res'
|
||||||
-- XXX(?) move into balanceTransaction
|
-- XXX(?) move into balanceTransaction
|
||||||
liftIO $ ensureJournalFileExists (journalFilePath j)
|
liftIO $ ensureJournalFileExists (journalFilePath j)
|
||||||
|
-- XXX why not journalAddTransaction ?
|
||||||
liftIO $ appendToJournalFileOrStdout (journalFilePath j) (showTransaction t)
|
liftIO $ appendToJournalFileOrStdout (journalFilePath j) (showTransaction t)
|
||||||
setMessage "Transaction added."
|
setMessage "Transaction added."
|
||||||
redirect JournalR
|
redirect JournalR
|
||||||
@ -46,3 +53,17 @@ postAddR = do
|
|||||||
<form#addform.form.col-xs-12.col-md-8 method=post enctype=#{enctype}>
|
<form#addform.form.col-xs-12.col-md-8 method=post enctype=#{enctype}>
|
||||||
^{view}
|
^{view}
|
||||||
|]
|
|]
|
||||||
|
|
||||||
|
-- Add a single new transaction, send as JSON via PUT, to the journal.
|
||||||
|
-- The web form handler above should probably use PUT as well.
|
||||||
|
putAddR :: Handler RepJson
|
||||||
|
putAddR = do
|
||||||
|
VD{caps, j, opts} <- getViewData
|
||||||
|
when (CapAdd `notElem` caps) (permissionDenied "Missing the 'add' capability")
|
||||||
|
|
||||||
|
(r :: Result Transaction) <- parseCheckJsonBody
|
||||||
|
case r of
|
||||||
|
Error err -> sendStatusJSON status400 ("could not parse json: " ++ err ::String)
|
||||||
|
Success t -> do
|
||||||
|
liftIO $ journalAddTransaction j (cliopts_ opts) t
|
||||||
|
sendResponseCreated TransactionsR
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
/ RootR GET
|
/ RootR GET
|
||||||
/journal JournalR GET
|
/journal JournalR GET
|
||||||
/register RegisterR GET
|
/register RegisterR GET
|
||||||
/add AddR GET POST
|
/add AddR GET POST PUT
|
||||||
|
|
||||||
/manage ManageR GET
|
/manage ManageR GET
|
||||||
/edit/#FilePath EditR GET POST
|
/edit/#FilePath EditR GET POST
|
||||||
|
|||||||
@ -4,7 +4,7 @@ cabal-version: 1.12
|
|||||||
--
|
--
|
||||||
-- see: https://github.com/sol/hpack
|
-- see: https://github.com/sol/hpack
|
||||||
--
|
--
|
||||||
-- hash: 561c0c98e7883244294c66058dba4862cbb498a2f5211e2abdd034ff7156be9a
|
-- hash: db2d8932eb2a684f9139d117f6901d746b8795d70264d00fe8d45625cf7a7cc3
|
||||||
|
|
||||||
name: hledger-web
|
name: hledger-web
|
||||||
version: 1.13.99
|
version: 1.13.99
|
||||||
@ -173,6 +173,7 @@ library
|
|||||||
, hledger-lib >=1.13.99 && <1.14
|
, hledger-lib >=1.13.99 && <1.14
|
||||||
, http-client
|
, http-client
|
||||||
, http-conduit
|
, http-conduit
|
||||||
|
, http-types
|
||||||
, json
|
, json
|
||||||
, megaparsec >=7.0.0 && <8
|
, megaparsec >=7.0.0 && <8
|
||||||
, mtl
|
, mtl
|
||||||
|
|||||||
@ -119,6 +119,7 @@ library:
|
|||||||
- hjsmin
|
- hjsmin
|
||||||
- http-conduit
|
- http-conduit
|
||||||
- http-client
|
- http-client
|
||||||
|
- http-types
|
||||||
- json
|
- json
|
||||||
- megaparsec >=7.0.0 && <8
|
- megaparsec >=7.0.0 && <8
|
||||||
- mtl
|
- mtl
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user