channeldb: update channeldb to set and store SettleDate for invoices

This commit is contained in:
Micah Lerner 2017-12-04 22:07:21 -08:00 committed by Olaoluwa Osuntokun
parent 231ed5bb32
commit cf6f313cff
2 changed files with 29 additions and 4 deletions

@ -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)
}
@ -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 {

@ -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.
@ -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
}
@ -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
}
@ -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())
}