defmodule DaProductAppWeb.TransactionController do use DaProductAppWeb, :controller alias DaProductApp.Mypinpad require Logger @doc """ Mypinpad Transaction Processing: POST /transaction/process """ def create(conn, %{"transaction_id" => tx_id} = params) do # 1. Idempotency Check case Mypinpad.get_transaction_by_id(tx_id) do nil -> # 2. Process New Transaction # Here you would typically call your Acquirer/Bank API # We simulate a success with EMV data response_payload = %{ "responseCode" => "00", "emvData" => "8A023030", # EMV approved code "authCode" => "OK" <> tx_id } with {:ok, _tx} <- Mypinpad.create_transaction(%{ transaction_id: tx_id, payload: params, response: response_payload, status: "success" }) do conn |> put_status(:ok) |> json(response_payload) end existing_tx -> # 3. Return existing response (Retry handling) conn |> put_status(:ok) |> json(existing_tx.response) end end def create(conn, _params) do conn |> put_status(:bad_request) |> json(%{error: "missing_transaction_id"}) end end