storj/satellite/payments/billing/transactions.go

94 lines
3.7 KiB
Go
Raw Normal View History

// Copyright (C) 2022 Storj Labs, Inc.
// See LICENSE for copying information.
package billing
import (
"context"
"time"
"github.com/zeebo/errs"
"storj.io/common/uuid"
"storj.io/storj/satellite/payments/monetary"
)
// TransactionStatus indicates transaction status.
type TransactionStatus string
// ErrInsufficientFunds represents err when a user balance is too low for some transaction.
var ErrInsufficientFunds = errs.New("Insufficient funds for this transaction")
// ErrNoWallet represents err when there is no wallet in the DB.
var ErrNoWallet = errs.New("no wallet in the database")
// ErrNoTransactions represents err when there is no billing transactions in the DB.
var ErrNoTransactions = errs.New("no transactions in the database")
const (
// TransactionStatusPending indicates that status of this transaction is pending.
TransactionStatusPending = "pending"
// TransactionStatusCancelled indicates that status of this transaction is cancelled.
TransactionStatusCancelled = "cancelled"
// TransactionStatusCompleted indicates that status of this transaction is complete.
TransactionStatusCompleted = "complete"
)
// TransactionType indicates transaction type.
type TransactionType string
const (
// TransactionTypeCredit indicates that type of this transaction is credit.
TransactionTypeCredit = "credit"
// TransactionTypeDebit indicates that type of this transaction is debit.
TransactionTypeDebit = "debit"
// TransactionTypeUnknown indicates that type of this transaction is unknown.
TransactionTypeUnknown = "unknown"
)
// TransactionsDB is an interface which defines functionality
// of DB which stores billing transactions.
//
// architecture: Database
type TransactionsDB interface {
// Insert inserts the provided transaction.
Insert(ctx context.Context, tx Transaction) (txID int64, err error)
// UpdateStatus updates the status of the transaction.
UpdateStatus(ctx context.Context, txID int64, status TransactionStatus) error
// UpdateMetadata updates the metadata of the transaction.
UpdateMetadata(ctx context.Context, txID int64, metadata []byte) error
// LastTransaction returns the timestamp and metadata of the last known transaction for given source and type.
LastTransaction(ctx context.Context, txSource string, txType TransactionType) (time.Time, []byte, error)
// List returns all transactions for the specified user.
List(ctx context.Context, userID uuid.UUID) ([]Transaction, error)
// GetBalance returns the current usable balance for the specified user.
GetBalance(ctx context.Context, userID uuid.UUID) (monetary.Amount, error)
}
// PaymentType is an interface which defines functionality required for all billing payment types. Payment types can
// include but are not limited to Bitcoin, Ether, credit or debit card, ACH transfer, or even physical transfer of live
// goats. In each case, a source, type, and method to get new transactions must be defined by the service, though
// metadata specific to each payment type is also supported (i.e. goat hair type).
type PaymentType interface {
// Source the source of the payment
Source() string
// Type the type of the payment
Type() TransactionType
// GetNewTransactions returns new transactions that occurred after the provided last transaction received.
GetNewTransactions(ctx context.Context, lastTransactionTime time.Time, metadata []byte) ([]Transaction, error)
}
// Transaction defines billing related transaction info that is stored in the DB.
type Transaction struct {
ID int64
UserID uuid.UUID
Amount monetary.Amount
Description string
Source string
Status TransactionStatus
Type TransactionType
Metadata []byte
Timestamp time.Time
CreatedAt time.Time
}