Skip to content
This repository has been archived by the owner on Nov 21, 2024. It is now read-only.

feat(nut05): impl get_mint_quote and integration test #41

Merged
merged 1 commit into from
Oct 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions integration-tests/nut05.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,31 @@ pub async fn melt_quote_ok() {
assert_matches!(
melt_quote,
MeltQuote {
id,
ref id,
unit: _,
amount,
request: _,
fee_reserve,
state,
expiry,
payment_preimage
} if Uuid::try_parse(&id).is_ok()
ref payment_preimage
} if Uuid::try_parse(id).is_ok()
&& amount == Amount::from(10)
&& fee_reserve == Amount::from(1)
&& state == MeltQuoteState::Unpaid
&& expiry >= now
&& payment_preimage.is_none()
)
);

let melt_quote_status = wallet.melt_quote_status(&melt_quote.id).await.unwrap();

assert_eq!(melt_quote.id, melt_quote_status.quote);
assert_eq!(melt_quote.amount, melt_quote_status.amount);
assert_eq!(melt_quote.fee_reserve, melt_quote_status.fee_reserve);
assert_eq!(melt_quote.state, melt_quote_status.state);
assert_eq!(melt_quote.expiry, melt_quote_status.expiry);
assert_eq!(
melt_quote.payment_preimage,
melt_quote_status.payment_preimage
);
}
12 changes: 9 additions & 3 deletions lib/cashubrew/NUTs/NUT-05/impl.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ defmodule Cashubrew.Nuts.Nut05.Impl do
Implementation and structs of the NUT-05
"""
alias Cashubrew.Schema
require Logger

defp percent_fee_reserve, do: 1
defp min_fee_reserve, do: 1
Expand All @@ -26,8 +27,7 @@ defmodule Cashubrew.Nuts.Nut05.Impl do
fee = max(relative_fee_reserve, min_fee_reserve())

expiry = System.os_time(:second) + melt_quote_validity_duration_in_sec()
quote_id = Ecto.UUID.bingenerate()
quote_id_as_string = Ecto.UUID.cast!(quote_id)
quote_id = Ecto.UUID.generate()

Schema.MeltQuote.create!(repo, %{
id: quote_id,
Expand All @@ -40,11 +40,17 @@ defmodule Cashubrew.Nuts.Nut05.Impl do
})

%{
quote: quote_id_as_string,
quote: quote_id,
amount: amount,
fee_reserve: fee,
state: "UNPAID",
expiry: expiry
}
end

def get_melt_quote_by_id(quote_id) do
repo = Application.get_env(:cashubrew, :repo)

repo.get!(Schema.MeltQuote, quote_id)
end
end
2 changes: 1 addition & 1 deletion lib/cashubrew/NUTs/NUT-05/routes.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ defmodule Cashubrew.Nuts.Nut05.Routes do
@doc """
The route to check a melt quote state
"""
def v1_melt_quote_for_quote_id do
def v1_melt_quote_by_id do
v1_melt_quote() <> "/:quote_id"
end

Expand Down
11 changes: 11 additions & 0 deletions lib/cashubrew/NUTs/NUT-05/serde.ex
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,15 @@ defmodule Cashubrew.Nuts.Nut05.Serde.PostMeltQuoteBolt11Response do
@enforce_keys [:quote, :amount, :fee_reserve, :state, :expiry]
@derive [Jason.Encoder]
defstruct [:quote, :amount, :fee_reserve, :state, :expiry, :payment_preimage]

def from_melt_quote(melt_quote, state, payment_preimage) do
%__MODULE__{
quote: Ecto.UUID.cast!(melt_quote.id),
amount: melt_quote.amount,
fee_reserve: melt_quote.fee_reserve,
expiry: melt_quote.expiry,
state: state,
payment_preimage: payment_preimage
}
end
end
12 changes: 10 additions & 2 deletions lib/cashubrew/schema/melt_quote.ex
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,16 @@ defmodule Cashubrew.Schema.MeltQuote do

def changeset(quote, attrs) do
quote
|> cast(attrs, [:request, :unit, :amount, :fee_reserve, :expiry, :request_lookup_id])
|> validate_required([:request, :unit, :amount, :fee_reserve, :expiry, :request_lookup_id])
|> cast(attrs, [:id, :request, :unit, :amount, :fee_reserve, :expiry, :request_lookup_id])
|> validate_required([
:id,
:request,
:unit,
:amount,
:fee_reserve,
:expiry,
:request_lookup_id
])
end

def create!(repo, values) do
Expand Down
27 changes: 12 additions & 15 deletions lib/cashubrew/web/controllers/mint_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ defmodule Cashubrew.Web.MintController do
use Cashubrew.Web, :controller
require :logger
require Logger
alias Cashubrew.Lightning
alias Cashubrew.Mint
alias Cashubrew.Nuts.Nut00
alias Cashubrew.Nuts.Nut01
Expand Down Expand Up @@ -96,28 +95,26 @@ defmodule Cashubrew.Web.MintController do
e in RuntimeError -> conn |> put_status(:bad_request) |> json(Nut00.Error.new_error(0, e))
end

def create_melt_quote(conn, params) do
method = params["method"]

def create_melt_quote(conn, %{"method" => method, "request" => request, "unit" => unit}) do
if method != "bolt11" do
raise "UnsuportedMethod"
end

request = params["request"]

if !request do
raise "NoRequest"
end
res = Nut05.Impl.create_melt_quote!(request, unit)

unit = params["unit"]
json(conn, struct(Nut05.Serde.PostMeltQuoteBolt11Response, res))
rescue
e in RuntimeError -> conn |> put_status(:bad_request) |> json(Nut00.Error.new_error(0, e))
end

if !unit do
raise "NoUnit"
def get_melt_quote(conn, %{"method" => method, "quote_id" => quote_id}) do
if method != "bolt11" do
raise "UnsuportedMethod"
end

res = Nut05.Impl.create_melt_quote!(request, unit)

json(conn, struct(Nut05.Serde.PostMeltQuoteBolt11Response, res))
melt_quote = Nut05.Impl.get_melt_quote_by_id(quote_id)
# TODO: get actual state from ln and payment_preimage
json(conn, Nut05.Serde.PostMeltQuoteBolt11Response.from_melt_quote(melt_quote, "UNPAID", nil))
rescue
e in RuntimeError -> conn |> put_status(:bad_request) |> json(Nut00.Error.new_error(0, e))
end
Expand Down
1 change: 1 addition & 0 deletions lib/cashubrew/web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ defmodule Cashubrew.Web.Router do
get("/v1/info", MintController, :info)
# NUT-05
post(Nut05.Routes.v1_melt_quote(), MintController, :create_melt_quote)
get(Nut05.Routes.v1_melt_quote_by_id(), MintController, :get_melt_quote)
end

if Mix.env() == :dev do
Expand Down
3 changes: 2 additions & 1 deletion priv/repo/migrations/20240918113124_create_melt_quote.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ defmodule Cashubrew.Repo.Migrations.CreateMeltQuote do
use Ecto.Migration

def change do
create table(:melt_quote) do
create table(:melt_quote, primary_key: false) do
add :id, :binary_id, primary_key: true
add :request, :string, null: false
add :unit, :string, null: false
add :amount, :integer, null: false
Expand Down
Loading