deposit.rs 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use crate::{Context, Handler};
  2. use axum::{extract::State, http::StatusCode, Json};
  3. use serde::Deserialize;
  4. use verax::{AccountId, AnyAmount, Status, Tag};
  5. #[derive(Deserialize)]
  6. pub struct Deposit {
  7. pub account: AccountId,
  8. #[serde(flatten)]
  9. pub amount: AnyAmount,
  10. pub memo: String,
  11. pub tags: Vec<Tag>,
  12. pub status: Status,
  13. }
  14. #[async_trait::async_trait]
  15. impl Handler for Deposit {
  16. type Ok = verax::Transaction;
  17. type Err = verax::Error;
  18. async fn handle(self, ctx: &Context) -> Result<Self::Ok, Self::Err> {
  19. ctx.ledger
  20. .deposit(
  21. &self.account,
  22. self.amount.try_into()?,
  23. self.status,
  24. self.tags,
  25. self.memo,
  26. )
  27. .await
  28. }
  29. }
  30. pub async fn handler(
  31. State(ledger): State<Context>,
  32. Json(item): Json<Deposit>,
  33. ) -> Result<Json<verax::Transaction>, (StatusCode, String)> {
  34. Ok(Json(item.handle(&ledger).await.map_err(|err| {
  35. (StatusCode::BAD_REQUEST, err.to_string())
  36. })?))
  37. }