From 218a30d16e6f5752425b65390c632d989071ce42 Mon Sep 17 00:00:00 2001 From: ziggie Date: Thu, 13 Nov 2025 15:05:35 +0100 Subject: [PATCH] paymentsdb: add a wrapper to the fetchpayment method We wrap the fetchPayment db call and catch the case where no errors are found in the db, where we now return the ErrPaymentNotInitiated error. --- payments/db/sql_store.go | 54 +++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/payments/db/sql_store.go b/payments/db/sql_store.go index 3de8524de..fc7d4bc0f 100644 --- a/payments/db/sql_store.go +++ b/payments/db/sql_store.go @@ -801,6 +801,24 @@ func (s *SQLStore) QueryPayments(ctx context.Context, query Query) (Response, }, nil } +// fetchPaymentByHash fetches a payment by its hash from the database. It is a +// convenience wrapper around the FetchPayment method and checks for +// no rows error and returns ErrPaymentNotInitiated if no payment is found. +func fetchPaymentByHash(ctx context.Context, db SQLQueries, + paymentHash lntypes.Hash) (sqlc.FetchPaymentRow, error) { + + dbPayment, err := db.FetchPayment(ctx, paymentHash[:]) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + return dbPayment, fmt.Errorf("failed to fetch payment: %w", err) + } + + if errors.Is(err, sql.ErrNoRows) { + return dbPayment, ErrPaymentNotInitiated + } + + return dbPayment, nil +} + // FetchPayment retrieves a complete payment record from the database by its // payment hash. The returned MPPayment includes all payment metadata such as // creation info, payment status, current state, all HTLC attempts (both @@ -816,13 +834,9 @@ func (s *SQLStore) FetchPayment(paymentHash lntypes.Hash) (*MPPayment, error) { var mpPayment *MPPayment err := s.db.ExecTx(ctx, sqldb.ReadTxOpt(), func(db SQLQueries) error { - dbPayment, err := db.FetchPayment(ctx, paymentHash[:]) - if err != nil && !errors.Is(err, sql.ErrNoRows) { - return fmt.Errorf("failed to fetch payment: %w", err) - } - - if errors.Is(err, sql.ErrNoRows) { - return ErrPaymentNotInitiated + dbPayment, err := fetchPaymentByHash(ctx, db, paymentHash) + if err != nil { + return err } mpPayment, err = fetchPaymentWithCompleteData( @@ -878,9 +892,9 @@ func (s *SQLStore) DeleteFailedAttempts(paymentHash lntypes.Hash) error { } err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error { - dbPayment, err := db.FetchPayment(ctx, paymentHash[:]) + dbPayment, err := fetchPaymentByHash(ctx, db, paymentHash) if err != nil { - return fmt.Errorf("failed to fetch payment: %w", err) + return err } paymentStatus, err := computePaymentStatusFromDB( @@ -897,7 +911,7 @@ func (s *SQLStore) DeleteFailedAttempts(paymentHash lntypes.Hash) error { } // Then we delete the failed attempts for this payment. - return db.DeleteFailedAttempts(ctx, dbPayment.Payment.ID) + return db.DeleteFailedAttempts(ctx, dbPayment.GetPayment().ID) }, sqldb.NoOpReset) if err != nil { return fmt.Errorf("failed to delete failed attempts for "+ @@ -967,10 +981,9 @@ func (s *SQLStore) DeletePayment(paymentHash lntypes.Hash, ctx := context.TODO() err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error { - dbPayment, err := db.FetchPayment(ctx, paymentHash[:]) + dbPayment, err := fetchPaymentByHash(ctx, db, paymentHash) if err != nil { - return fmt.Errorf("failed to fetch "+ - "payment: %w", err) + return err } paymentStatus, err := computePaymentStatusFromDB( @@ -989,13 +1002,13 @@ func (s *SQLStore) DeletePayment(paymentHash lntypes.Hash, // If we are only deleting failed HTLCs, we delete them. if failedHtlcsOnly { return db.DeleteFailedAttempts( - ctx, dbPayment.Payment.ID, + ctx, dbPayment.GetPayment().ID, ) } // In case we are not deleting failed HTLCs, we delete the // payment which will cascade delete all related data. - return db.DeletePayment(ctx, dbPayment.Payment.ID) + return db.DeletePayment(ctx, dbPayment.GetPayment().ID) }, sqldb.NoOpReset) if err != nil { return fmt.Errorf("failed to delete failed attempts for "+ @@ -1269,7 +1282,7 @@ func (s *SQLStore) RegisterAttempt(paymentHash lntypes.Hash, // Make sure the payment exists. dbPayment, err := db.FetchPayment(ctx, paymentHash[:]) if err != nil { - return fmt.Errorf("failed to fetch payment: %w", err) + return err } // We fetch the complete payment to determine if the payment is @@ -1393,9 +1406,9 @@ func (s *SQLStore) SettleAttempt(paymentHash lntypes.Hash, var mpPayment *MPPayment err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error { - dbPayment, err := db.FetchPayment(ctx, paymentHash[:]) + dbPayment, err := fetchPaymentByHash(ctx, db, paymentHash) if err != nil { - return fmt.Errorf("failed to fetch payment: %w", err) + return err } paymentStatus, err := computePaymentStatusFromDB( @@ -1468,9 +1481,10 @@ func (s *SQLStore) FailAttempt(paymentHash lntypes.Hash, var mpPayment *MPPayment err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error { - dbPayment, err := db.FetchPayment(ctx, paymentHash[:]) + // Make sure the payment exists. + dbPayment, err := fetchPaymentByHash(ctx, db, paymentHash) if err != nil { - return fmt.Errorf("failed to fetch payment: %w", err) + return err } paymentStatus, err := computePaymentStatusFromDB(