mirror of
https://github.com/rjNemo/rentease.git
synced 2026-06-06 02:36:49 +00:00
70 lines
2.1 KiB
Go
70 lines
2.1 KiB
Go
package booking
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"log/slog"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/rjNemo/rentease/internal/config"
|
|
stripeclient "github.com/rjNemo/rentease/internal/driver/stripe"
|
|
)
|
|
|
|
// ErrStripeClientNotConfigured indicates the service was asked to run a Stripe operation without a configured client.
|
|
var ErrStripeClientNotConfigured = errors.New("stripe client not configured")
|
|
|
|
// SyncStripePayments pulls Stripe payments within the provided time window and
|
|
// upserts them into the local datastore. Payments lacking booking metadata are
|
|
// skipped to avoid incorrect associations.
|
|
func (bs Service) SyncStripePayments(ctx context.Context, from, to time.Time) error {
|
|
if bs.stripe == nil {
|
|
return ErrStripeClientNotConfigured
|
|
}
|
|
|
|
payments, err := bs.stripe.ListPayments(ctx, stripeclient.ListPaymentsParams{From: from, To: to})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var multi error
|
|
for _, payment := range payments {
|
|
if payment.BookingID == nil {
|
|
bs.logger.Warn("stripe payment missing booking metadata", slog.String("payment_id", payment.ID))
|
|
continue
|
|
}
|
|
|
|
bookingID := uint(*payment.BookingID)
|
|
stripeID := payment.ID
|
|
status := strings.ToLower(payment.Status)
|
|
|
|
_, err = bs.store.UpsertStripePayment(&Payment{
|
|
BookingID: bookingID,
|
|
Amount: payment.Amount,
|
|
PaymentMethod: mapStripeMethod(payment.PaymentMethod),
|
|
StripePaymentID: &stripeID,
|
|
StripeStatus: &status,
|
|
})
|
|
if err != nil {
|
|
multi = errors.Join(multi, err)
|
|
bs.logger.Error("failed to upsert stripe payment", slog.String("payment_id", payment.ID), slog.Any("error", err))
|
|
}
|
|
}
|
|
|
|
return multi
|
|
}
|
|
|
|
func mapStripeMethod(method string) config.PaymentMethod {
|
|
switch strings.ToLower(method) {
|
|
case "card", "link", "apple_pay", "google_pay", "cashapp":
|
|
return config.PaymentMethod("Card")
|
|
case "ach_credit_transfer", "ach_debit", "us_bank_account", "sepa_debit", "bank_transfer", "blik", "bancontact":
|
|
return config.PaymentMethod("Transfer")
|
|
case "cash":
|
|
return config.PaymentMethod("Cash")
|
|
case "check":
|
|
return config.PaymentMethod("Cheque")
|
|
default:
|
|
return config.PaymentMethod("Card")
|
|
}
|
|
}
|