53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package invoice
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/noderunners/nip05api/internal/user"
|
|
)
|
|
|
|
type PendingInvoice struct {
|
|
PaymentHash string
|
|
PaymentRequest string
|
|
Username string
|
|
Pubkey string
|
|
SubscriptionType user.SubscriptionType
|
|
Years int
|
|
AmountSats int64
|
|
ExpiresAt time.Time
|
|
Paid bool
|
|
IsRenewal bool
|
|
CreatedAt time.Time
|
|
// TargetExpiresAt captures the user's new expiry value at first
|
|
// confirmation. Persisted so retries after a crash apply the same
|
|
// absolute value and stay idempotent. nil for lifetime.
|
|
TargetExpiresAt *time.Time
|
|
// TargetSet is true when target_expires_at has been written (even if
|
|
// the value is NULL for lifetime). Distinguishes "unset" from "lifetime".
|
|
TargetSet bool
|
|
}
|
|
|
|
type Status string
|
|
|
|
const (
|
|
StatusPending Status = "pending"
|
|
StatusPaid Status = "paid"
|
|
StatusExpired Status = "expired"
|
|
)
|
|
|
|
var (
|
|
ErrInvoiceNotFound = errors.New("invoice not found")
|
|
ErrLNbits = errors.New("lnbits error")
|
|
)
|
|
|
|
func (p *PendingInvoice) Status() Status {
|
|
if p.Paid {
|
|
return StatusPaid
|
|
}
|
|
if time.Now().UTC().After(p.ExpiresAt) {
|
|
return StatusExpired
|
|
}
|
|
return StatusPending
|
|
}
|