Skip to content

Commit

Permalink
channeldb: update channeldb to set and store SettleDate for invoices
Browse files Browse the repository at this point in the history
  • Loading branch information
mlerner authored and Roasbeef committed Dec 9, 2017
1 parent 231ed5b commit cf6f313
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 4 deletions.
9 changes: 7 additions & 2 deletions channeldb/invoice_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,9 @@ func TestInvoiceWorkflow(t *testing.T) {
spew.Sdump(fakeInvoice), spew.Sdump(dbInvoice))
}

// Settle the invoice, the versin retreived from the database should
// now have the settled bit toggle to true.
// Settle the invoice, the version retrieved from the database should
// now have the settled bit toggle to true and a non-default
// SettledDate
if err := db.SettleInvoice(paymentHash); err != nil {
t.Fatalf("unable to settle invoice: %v", err)
}
Expand All @@ -100,6 +101,10 @@ func TestInvoiceWorkflow(t *testing.T) {
t.Fatalf("invoice should now be settled but isn't")
}

if dbInvoice2.SettleDate.IsZero() {
t.Fatalf("invoice should have non-zero SettledDate but isn't")
}

// Attempt to insert generated above again, this should fail as
// duplicates are rejected by the processing logic.
if err := db.AddInvoice(fakeInvoice); err != ErrDuplicateInvoice {
Expand Down
24 changes: 22 additions & 2 deletions channeldb/invoices.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ type Invoice struct {
// CreationDate is the exact time the invoice was created.
CreationDate time.Time

// SettleDate is the exact time the invoice was settled.
SettleDate time.Time

// Terms are the contractual payment terms of the invoice. Once
// all the terms have been satisfied by the payer, then the invoice can
// be considered fully fulfilled.
Expand Down Expand Up @@ -330,10 +333,20 @@ func serializeInvoice(w io.Writer, i *Invoice) error {
if err != nil {
return err
}

if err := wire.WriteVarBytes(w, 0, birthBytes); err != nil {
return err
}

settleBytes, err := i.SettleDate.MarshalBinary()
if err != nil {
return err
}

if err := wire.WriteVarBytes(w, 0, settleBytes); err != nil {
return err
}

if _, err := w.Write(i.Terms.PaymentPreimage[:]); err != nil {
return err
}
Expand Down Expand Up @@ -389,6 +402,14 @@ func deserializeInvoice(r io.Reader) (*Invoice, error) {
return nil, err
}

settledBytes, err := wire.ReadVarBytes(r, 0, 300, "settled")
if err != nil {
return nil, err
}
if err := invoice.SettleDate.UnmarshalBinary(settledBytes); err != nil {
return nil, err
}

if _, err := io.ReadFull(r, invoice.Terms.PaymentPreimage[:]); err != nil {
return nil, err
}
Expand All @@ -412,13 +433,12 @@ func settleInvoice(invoices *bolt.Bucket, invoiceNum []byte) error {
}

invoice.Terms.Settled = true
invoice.SettleDate = time.Now()

var buf bytes.Buffer
if err := serializeInvoice(&buf, invoice); err != nil {
return nil
}

// TODO(roasbeef): add timestamp

return invoices.Put(invoiceNum[:], buf.Bytes())
}

0 comments on commit cf6f313

Please sign in to comment.