From 89aaf4d5c6c10e1a43c618cb57e8c8475cc95eb3 Mon Sep 17 00:00:00 2001 From: Pietralberto Mazza <18440657+altafan@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:54:47 +0100 Subject: [PATCH] Handle status updates from senders of payments (#24) * Handle status updates from senders of payments * Lint --- asp/internal/core/application/service.go | 4 +++ asp/internal/core/application/utils.go | 35 ++++++++++++++++++------ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/asp/internal/core/application/service.go b/asp/internal/core/application/service.go index 27cf876..eb5ee6d 100644 --- a/asp/internal/core/application/service.go +++ b/asp/internal/core/application/service.go @@ -87,6 +87,10 @@ func (s *service) ClaimVtxos(ctx context.Context, creds string, receivers []doma return s.paymentRequests.update(*payment) } +func (s *service) UpdatePaymenStatus(_ context.Context, id string) error { + return s.paymentRequests.updatePingTimestamp(id) +} + func (s *service) SignVtxos(ctx context.Context, forfeitTxs map[string]string) error { for txid, tx := range forfeitTxs { if err := s.forfeitTxs.sign(txid, tx); err != nil { diff --git a/asp/internal/core/application/utils.go b/asp/internal/core/application/utils.go index a6c44e2..2ef12a8 100644 --- a/asp/internal/core/application/utils.go +++ b/asp/internal/core/application/utils.go @@ -12,18 +12,19 @@ import ( type timedPayment struct { domain.Payment - timestamp time.Time + timestamp time.Time + pingTimestamp time.Time } type paymentsMap struct { lock *sync.RWMutex - payments map[string]timedPayment + payments map[string]*timedPayment } func newPaymentsMap(payments []domain.Payment) *paymentsMap { - paymentsById := make(map[string]timedPayment) + paymentsById := make(map[string]*timedPayment) for _, p := range payments { - paymentsById[p.Id] = timedPayment{p, time.Now()} + paymentsById[p.Id] = &timedPayment{p, time.Now(), time.Time{}} } lock := &sync.RWMutex{} return &paymentsMap{lock, paymentsById} @@ -44,7 +45,7 @@ func (m *paymentsMap) push(payment domain.Payment) error { return fmt.Errorf("duplicated inputs") } - m.payments[payment.Id] = timedPayment{payment, time.Now()} + m.payments[payment.Id] = &timedPayment{payment, time.Now(), time.Time{}} return nil } @@ -62,7 +63,11 @@ func (m *paymentsMap) pop(num int64) []domain.Payment { if len(p.Receivers) <= 0 { continue } - paymentsByTime = append(paymentsByTime, p) + // Skip payments for which users didn't notify to be online in the last minute. + if p.pingTimestamp.IsZero() || time.Since(p.pingTimestamp).Minutes() > 1 { + continue + } + paymentsByTime = append(paymentsByTime, *p) } sort.SliceStable(paymentsByTime, func(i, j int) bool { return paymentsByTime[i].timestamp.Before(paymentsByTime[j].timestamp) @@ -80,11 +85,25 @@ func (m *paymentsMap) update(payment domain.Payment) error { m.lock.Lock() defer m.lock.Unlock() - if _, ok := m.payments[payment.Id]; !ok { + p, ok := m.payments[payment.Id] + if !ok { return fmt.Errorf("payment %s not found", payment.Id) } - m.payments[payment.Id] = timedPayment{payment, m.payments[payment.Id].timestamp} + p.Payment = payment + return nil +} + +func (m *paymentsMap) updatePingTimestamp(id string) error { + m.lock.Lock() + defer m.lock.Unlock() + + payment, ok := m.payments[id] + if !ok { + return fmt.Errorf("payment %s not found", id) + } + + payment.pingTimestamp = time.Now() return nil }