From 8c7d60dcb724ada482d5beddec6f25a882015999 Mon Sep 17 00:00:00 2001 From: Neylix Date: Thu, 31 Aug 2023 12:21:01 +0200 Subject: [PATCH] Use TransactionSchema in RPC method --- .../methods/estimate_transaction_fee.ex | 22 ++++++------- .../api/jsonrpc/methods/send_transaction.ex | 22 ++++++------- .../methods/simulate_contract_execution.ex | 22 ++++++------- .../controllers/jsonrpc_controller_test.exs | 2 +- .../methods/estimate_transaction_fee_test.exs | 31 +++---------------- .../jsonrpc/methods/send_transaction_test.exs | 30 ++---------------- .../simulate_contract_execution_test.exs | 31 +++---------------- 7 files changed, 39 insertions(+), 121 deletions(-) diff --git a/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex b/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex index d4bc70471..41a974b87 100644 --- a/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex +++ b/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex @@ -8,9 +8,7 @@ defmodule ArchethicWeb.API.JsonRPC.Method.EstimateTransactionFee do alias Archethic.TransactionChain.Transaction alias ArchethicWeb.API.JsonRPC.Method - alias ArchethicWeb.API.TransactionPayload - - alias ArchethicWeb.WebUtils + alias ArchethicWeb.API.JsonRPC.TransactionSchema @behaviour Method @@ -20,21 +18,19 @@ defmodule ArchethicWeb.API.JsonRPC.Method.EstimateTransactionFee do @spec validate_params(param :: map()) :: {:ok, params :: Transaction.t()} | {:error, reasons :: map()} def validate_params(%{"transaction" => transaction_params}) do - case TransactionPayload.changeset(transaction_params) do - {:ok, changeset = %{valid?: true}} -> - tx = changeset |> TransactionPayload.to_map() |> Transaction.cast() - {:ok, tx} - - {:ok, changeset} -> - reasons = Ecto.Changeset.traverse_errors(changeset, &WebUtils.translate_error/1) - {:error, reasons} + case TransactionSchema.validate(transaction_params) do + :ok -> + {:ok, TransactionSchema.to_transaction(transaction_params)} :error -> - {:error, %{transaction: ["must be an object"]}} + {:error, %{"transaction" => "Must be an object"}} + + {:error, reasons} -> + {:error, reasons} end end - def validate_params(_), do: {:error, %{transaction: ["is required"]}} + def validate_params(_), do: {:error, %{"transaction" => "Is required"}} @doc """ Execute the function to send a new tranaction in the network diff --git a/lib/archethic_web/api/jsonrpc/methods/send_transaction.ex b/lib/archethic_web/api/jsonrpc/methods/send_transaction.ex index a562395d5..ba642954c 100644 --- a/lib/archethic_web/api/jsonrpc/methods/send_transaction.ex +++ b/lib/archethic_web/api/jsonrpc/methods/send_transaction.ex @@ -6,12 +6,10 @@ defmodule ArchethicWeb.API.JsonRPC.Method.SendTransaction do alias Archethic.TransactionChain.Transaction alias ArchethicWeb.API.JsonRPC.Method - alias ArchethicWeb.API.TransactionPayload + alias ArchethicWeb.API.JsonRPC.TransactionSchema alias ArchethicWeb.TransactionSubscriber - alias ArchethicWeb.WebUtils - @behaviour Method @doc """ @@ -20,21 +18,19 @@ defmodule ArchethicWeb.API.JsonRPC.Method.SendTransaction do @spec validate_params(param :: map()) :: {:ok, params :: Transaction.t()} | {:error, reasons :: map()} def validate_params(%{"transaction" => transaction_params}) do - case TransactionPayload.changeset(transaction_params) do - {:ok, changeset = %{valid?: true}} -> - tx = changeset |> TransactionPayload.to_map() |> Transaction.cast() - {:ok, tx} - - {:ok, changeset} -> - reasons = Ecto.Changeset.traverse_errors(changeset, &WebUtils.translate_error/1) - {:error, reasons} + case TransactionSchema.validate(transaction_params) do + :ok -> + {:ok, TransactionSchema.to_transaction(transaction_params)} :error -> - {:error, %{transaction: ["must be an object"]}} + {:error, %{"transaction" => "Must be an object"}} + + {:error, reasons} -> + {:error, reasons} end end - def validate_params(_), do: {:error, %{transaction: ["is required"]}} + def validate_params(_), do: {:error, %{"transaction" => "Is required"}} @doc """ Execute the function to send a new tranaction in the network diff --git a/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex b/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex index 7994d8868..4e17cb319 100644 --- a/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex +++ b/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex @@ -14,9 +14,7 @@ defmodule ArchethicWeb.API.JsonRPC.Method.SimulateContractExecution do alias ArchethicWeb.API.JsonRPC.Method alias ArchethicWeb.API.JsonRPC.Error - alias ArchethicWeb.API.TransactionPayload - - alias ArchethicWeb.WebUtils + alias ArchethicWeb.API.JsonRPC.TransactionSchema @behaviour Method @@ -26,21 +24,19 @@ defmodule ArchethicWeb.API.JsonRPC.Method.SimulateContractExecution do @spec validate_params(param :: map()) :: {:ok, params :: Transaction.t()} | {:error, reasons :: map()} def validate_params(%{"transaction" => transaction_params}) do - case TransactionPayload.changeset(transaction_params) do - {:ok, changeset = %{valid?: true}} -> - tx = changeset |> TransactionPayload.to_map() |> Transaction.cast() - {:ok, tx} - - {:ok, changeset} -> - reasons = Ecto.Changeset.traverse_errors(changeset, &WebUtils.translate_error/1) - {:error, reasons} + case TransactionSchema.validate(transaction_params) do + :ok -> + {:ok, TransactionSchema.to_transaction(transaction_params)} :error -> - {:error, %{transaction: ["must be an object"]}} + {:error, %{"transaction" => "Must be an object"}} + + {:error, reasons} -> + {:error, reasons} end end - def validate_params(_), do: {:error, %{transaction: ["is required"]}} + def validate_params(_), do: {:error, %{"transaction" => "Is required"}} @doc """ Execute the function to send a new tranaction in the network diff --git a/test/archethic_web/api/jsonrpc/controllers/jsonrpc_controller_test.exs b/test/archethic_web/api/jsonrpc/controllers/jsonrpc_controller_test.exs index b8ba4d804..dc8116dcf 100644 --- a/test/archethic_web/api/jsonrpc/controllers/jsonrpc_controller_test.exs +++ b/test/archethic_web/api/jsonrpc/controllers/jsonrpc_controller_test.exs @@ -106,7 +106,7 @@ defmodule ArchethicWeb.API.JsonRPCControllerTest do "address" => "0000a9f3bc500d0ed7d923e983eafc080113633456f53c400814e1d4f34c5fa67220", "type" => type, "data" => %{ - "content" => "73616c7574", + "content" => "hello", "code" => "", "ownerships" => [], "ledger" => %{ diff --git a/test/archethic_web/api/jsonrpc/methods/estimate_transaction_fee_test.exs b/test/archethic_web/api/jsonrpc/methods/estimate_transaction_fee_test.exs index cbead05b0..da6b5a2f3 100644 --- a/test/archethic_web/api/jsonrpc/methods/estimate_transaction_fee_test.exs +++ b/test/archethic_web/api/jsonrpc/methods/estimate_transaction_fee_test.exs @@ -31,38 +31,15 @@ defmodule ArchethicWeb.API.JsonRPC.Methods.EstimateTransactionFeeTest do describe "validate_params" do test "should send error when transaction key is missing" do - assert {:error, - %{ - transaction: [ - "is required" - ] - }} = EstimateTransactionFee.validate_params(%{}) + assert {:error, %{"transaction" => "Is required"}} = + EstimateTransactionFee.validate_params(%{}) end test "should send bad_request response for invalid transaction body" do assert {:error, %{ - address: [ - "can't be blank" - ], - data: [ - "can't be blank" - ], - originSignature: [ - "can't be blank" - ], - previousPublicKey: [ - "can't be blank" - ], - previousSignature: [ - "can't be blank" - ], - type: [ - "can't be blank" - ], - version: [ - "can't be blank" - ] + "#" => + "Required properties version, address, type, previousPublicKey, previousSignature, originSignature, data were not present." }} = EstimateTransactionFee.validate_params(%{"transaction" => %{}}) end end diff --git a/test/archethic_web/api/jsonrpc/methods/send_transaction_test.exs b/test/archethic_web/api/jsonrpc/methods/send_transaction_test.exs index 2569a540d..fada91b68 100644 --- a/test/archethic_web/api/jsonrpc/methods/send_transaction_test.exs +++ b/test/archethic_web/api/jsonrpc/methods/send_transaction_test.exs @@ -42,38 +42,14 @@ defmodule ArchethicWeb.API.JsonRPC.Methods.SendTransactionTest do describe "validate_params" do test "should send error when transaction key is missing" do - assert {:error, - %{ - transaction: [ - "is required" - ] - }} = SendTransaction.validate_params(%{}) + assert {:error, %{"transaction" => "Is required"}} = SendTransaction.validate_params(%{}) end test "should send bad_request response for invalid transaction body" do assert {:error, %{ - address: [ - "can't be blank" - ], - data: [ - "can't be blank" - ], - originSignature: [ - "can't be blank" - ], - previousPublicKey: [ - "can't be blank" - ], - previousSignature: [ - "can't be blank" - ], - type: [ - "can't be blank" - ], - version: [ - "can't be blank" - ] + "#" => + "Required properties version, address, type, previousPublicKey, previousSignature, originSignature, data were not present." }} = SendTransaction.validate_params(%{"transaction" => %{}}) end end diff --git a/test/archethic_web/api/jsonrpc/methods/simulate_contract_execution_test.exs b/test/archethic_web/api/jsonrpc/methods/simulate_contract_execution_test.exs index 847752c59..91b163fc5 100644 --- a/test/archethic_web/api/jsonrpc/methods/simulate_contract_execution_test.exs +++ b/test/archethic_web/api/jsonrpc/methods/simulate_contract_execution_test.exs @@ -42,38 +42,15 @@ defmodule ArchethicWeb.API.JsonRPC.Methods.SimulateContractExecutionTest do describe "validate_params" do test "should send error when transaction key is missing" do - assert {:error, - %{ - transaction: [ - "is required" - ] - }} = SimulateContractExecution.validate_params(%{}) + assert {:error, %{"transaction" => "Is required"}} = + SimulateContractExecution.validate_params(%{}) end test "should send bad_request response for invalid transaction body" do assert {:error, %{ - address: [ - "can't be blank" - ], - data: [ - "can't be blank" - ], - originSignature: [ - "can't be blank" - ], - previousPublicKey: [ - "can't be blank" - ], - previousSignature: [ - "can't be blank" - ], - type: [ - "can't be blank" - ], - version: [ - "can't be blank" - ] + "#" => + "Required properties version, address, type, previousPublicKey, previousSignature, originSignature, data were not present." }} = SimulateContractExecution.validate_params(%{"transaction" => %{}}) end end