Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ListPayments: filter out non-succeeded payments, include payment status #3190

Merged
merged 2 commits into from Jun 13, 2019
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1,034 changes: 545 additions & 489 deletions lnrpc/rpc.pb.go

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions lnrpc/rpc.pb.gw.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions lnrpc/rpc.proto
Expand Up @@ -2158,9 +2158,21 @@ message Payment {

/// The optional payment request being fulfilled.
string payment_request = 9 [json_name = "payment_request"];

enum PaymentStatus {
UNKNOWN = 0;
IN_FLIGHT = 1;
SUCCEEDED = 2;
FAILED = 3;
}

// The status of the payment.
PaymentStatus status = 10 [json_name = "status"];
}

message ListPaymentsRequest {
/// Set to also return payments that are not (yet) succeeded.
bool non_succeeded = 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

naming suggestion: include_incomplete or include_unsuccessful?

}

message ListPaymentsResponse {
Expand Down
24 changes: 24 additions & 0 deletions lnrpc/rpc.swagger.json
Expand Up @@ -938,6 +938,16 @@
}
}
},
"parameters": [
{
"name": "non_succeeded",
"description": "/ Set to also return payments that are not (yet) succeeded.",
"in": "query",
"required": false,
"type": "boolean",
"format": "boolean"
}
],
"tags": [
"Lightning"
]
Expand Down Expand Up @@ -1297,6 +1307,16 @@
],
"default": "OPEN"
},
"PaymentPaymentStatus": {
"type": "string",
"enum": [
"UNKNOWN",
"IN_FLIGHT",
"SUCCEEDED",
"FAILED"
],
"default": "UNKNOWN"
},
"PeerSyncType": {
"type": "string",
"enum": [
Expand Down Expand Up @@ -2835,6 +2855,10 @@
"payment_request": {
"type": "string",
"description": "/ The optional payment request being fulfilled."
},
"status": {
"$ref": "#/definitions/PaymentPaymentStatus",
"description": "The status of the payment."
}
}
},
Expand Down
8 changes: 6 additions & 2 deletions lntest/itest/lnd_test.go
Expand Up @@ -13281,7 +13281,9 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {
// The payments should now show up in Alice's ListInvoices, with a zero
// preimage, indicating they are not yet settled.
err = lntest.WaitNoError(func() error {
req := &lnrpc.ListPaymentsRequest{}
req := &lnrpc.ListPaymentsRequest{
NonSucceeded: true,
}
ctxt, _ = context.WithTimeout(ctxt, defaultTimeout)
paymentsResp, err := net.Alice.ListPayments(ctxt, req)
if err != nil {
Expand Down Expand Up @@ -13458,7 +13460,9 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {

// Check that Alice's invoices to be shown as settled and failed
// accordingly, and preimages matching up.
req := &lnrpc.ListPaymentsRequest{}
req := &lnrpc.ListPaymentsRequest{
NonSucceeded: true,
}
ctxt, _ = context.WithTimeout(ctxt, defaultTimeout)
paymentsResp, err := net.Alice.ListPayments(ctxt, req)
if err != nil {
Expand Down
48 changes: 41 additions & 7 deletions rpcserver.go
Expand Up @@ -4131,7 +4131,7 @@ func marshallTopologyChange(topChange *routing.TopologyChange) *lnrpc.GraphTopol

// ListPayments returns a list of all outgoing payments.
func (r *rpcServer) ListPayments(ctx context.Context,
_ *lnrpc.ListPaymentsRequest) (*lnrpc.ListPaymentsResponse, error) {
req *lnrpc.ListPaymentsRequest) (*lnrpc.ListPaymentsResponse, error) {

rpcsLog.Debugf("[ListPayments]")

Expand All @@ -4140,10 +4140,15 @@ func (r *rpcServer) ListPayments(ctx context.Context,
return nil, err
}

paymentsResp := &lnrpc.ListPaymentsResponse{
Payments: make([]*lnrpc.Payment, len(payments)),
}
for i, payment := range payments {
paymentsResp := &lnrpc.ListPaymentsResponse{}
for _, payment := range payments {
// To keep compatibility with the old API, we only return
// non-suceeded payments if requested.
if payment.Status != channeldb.StatusSucceeded &&
!req.NonSucceeded {
continue
}

// If a payment attempt has been made we can fetch the route.
// Otherwise we'll just populate the RPC response with an empty
// one.
Expand All @@ -4165,8 +4170,13 @@ func (r *rpcServer) ListPayments(ctx context.Context,
msatValue := int64(payment.Info.Value)
satValue := int64(payment.Info.Value.ToSatoshis())

status, err := convertPaymentStatus(payment.Status)
if err != nil {
return nil, err
}

paymentHash := payment.Info.PaymentHash
paymentsResp.Payments[i] = &lnrpc.Payment{
paymentsResp.Payments = append(paymentsResp.Payments, &lnrpc.Payment{
PaymentHash: hex.EncodeToString(paymentHash[:]),
Value: satValue,
ValueMsat: msatValue,
Expand All @@ -4176,12 +4186,36 @@ func (r *rpcServer) ListPayments(ctx context.Context,
Fee: int64(route.TotalFees().ToSatoshis()),
PaymentPreimage: hex.EncodeToString(preimage[:]),
PaymentRequest: string(payment.Info.PaymentRequest),
}
Status: status,
})
}

return paymentsResp, nil
}

// convertPaymentStatus converts a channeldb.PaymentStatus to the type expected
// by the RPC.
func convertPaymentStatus(dbStatus channeldb.PaymentStatus) (
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this something that could be defined in lnrpc?

lnrpc.Payment_PaymentStatus, error) {

switch dbStatus {
case channeldb.StatusUnknown:
return lnrpc.Payment_UNKNOWN, nil

case channeldb.StatusInFlight:
return lnrpc.Payment_IN_FLIGHT, nil

case channeldb.StatusSucceeded:
return lnrpc.Payment_SUCCEEDED, nil

case channeldb.StatusFailed:
return lnrpc.Payment_FAILED, nil

default:
return 0, fmt.Errorf("unhandled payment status %v", dbStatus)
}
}

// DeleteAllPayments deletes all outgoing payments from DB.
func (r *rpcServer) DeleteAllPayments(ctx context.Context,
_ *lnrpc.DeleteAllPaymentsRequest) (*lnrpc.DeleteAllPaymentsResponse, error) {
Expand Down