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 | ||||
|   ( getAddR | ||||
|   , postAddR | ||||
|   , putAddR | ||||
|   ) where | ||||
| 
 | ||||
| import Data.Aeson.Types (Result(..)) | ||||
| import qualified Data.Text as T | ||||
| import Network.HTTP.Types.Status (status400) | ||||
| import Text.Blaze.Html (preEscapedToHtml) | ||||
| import Yesod | ||||
| 
 | ||||
| import Hledger | ||||
| import Hledger.Cli.Commands.Add (appendToJournalFileOrStdout) | ||||
| import Hledger.Cli.Commands.Add (appendToJournalFileOrStdout, journalAddTransaction) | ||||
| import Hledger.Web.Import | ||||
| import Hledger.Web.Json () | ||||
| import Hledger.Web.WebOptions (WebOpts(..)) | ||||
| import Hledger.Web.Widget.AddForm (addForm) | ||||
| 
 | ||||
| getAddR :: Handler () | ||||
| @ -31,6 +37,7 @@ postAddR = do | ||||
|       let t = txnTieKnot res' | ||||
|       -- XXX(?) move into balanceTransaction | ||||
|       liftIO $ ensureJournalFileExists (journalFilePath j) | ||||
|       -- XXX why not journalAddTransaction ? | ||||
|       liftIO $ appendToJournalFileOrStdout (journalFilePath j) (showTransaction t) | ||||
|       setMessage "Transaction added." | ||||
|       redirect JournalR | ||||
| @ -46,3 +53,17 @@ postAddR = do | ||||
|           <form#addform.form.col-xs-12.col-md-8 method=post enctype=#{enctype}> | ||||
|             ^{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 | ||||
| /journal         JournalR        GET | ||||
| /register        RegisterR       GET | ||||
| /add             AddR            GET POST | ||||
| /add             AddR            GET POST PUT | ||||
| 
 | ||||
| /manage             ManageR         GET | ||||
| /edit/#FilePath     EditR           GET POST | ||||
|  | ||||
| @ -4,7 +4,7 @@ cabal-version: 1.12 | ||||
| -- | ||||
| -- see: https://github.com/sol/hpack | ||||
| -- | ||||
| -- hash: 561c0c98e7883244294c66058dba4862cbb498a2f5211e2abdd034ff7156be9a | ||||
| -- hash: db2d8932eb2a684f9139d117f6901d746b8795d70264d00fe8d45625cf7a7cc3 | ||||
| 
 | ||||
| name:           hledger-web | ||||
| version:        1.13.99 | ||||
| @ -173,6 +173,7 @@ library | ||||
|     , hledger-lib >=1.13.99 && <1.14 | ||||
|     , http-client | ||||
|     , http-conduit | ||||
|     , http-types | ||||
|     , json | ||||
|     , megaparsec >=7.0.0 && <8 | ||||
|     , mtl | ||||
|  | ||||
| @ -119,6 +119,7 @@ library: | ||||
|   - hjsmin | ||||
|   - http-conduit | ||||
|   - http-client | ||||
|   - http-types | ||||
|   - json | ||||
|   - megaparsec >=7.0.0 && <8 | ||||
|   - mtl | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user