49a30ce4a7
* Slight adjustments to the migration Change-Id: I68ae81c010c3414fde2845df16ab124f8d17834b * Change Coupon Value Change-Id: I0f241d09e5f716f1d1b3f0688643ba7f614d83c4 * Change AlphaUsage to 5GB Change-Id: I5d25c6b5750684510cda8b14a27f38d5b2b07408 * change config lock Change-Id: Ib7c7a54555ba2387c9aa8dd60a0501b0ee6491dd * Use Scan properly Change-Id: Ie39cf4644e3ddd703a254e2f5e616763dd805235 * Fix Config Lock Change-Id: I558ecc1c1becfaaefc7aea5ad2fe83fd6bf6b561
115 lines
2.7 KiB
Go
115 lines
2.7 KiB
Go
// Copyright (C) 2020 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/zeebo/errs"
|
|
"go.uber.org/zap"
|
|
|
|
"storj.io/storj/private/dbutil"
|
|
"storj.io/storj/satellite"
|
|
"storj.io/storj/satellite/payments"
|
|
"storj.io/storj/satellite/payments/stripecoinpayments"
|
|
"storj.io/storj/satellite/satellitedb"
|
|
"storj.io/storj/satellite/satellitedb/dbx"
|
|
)
|
|
|
|
// UserData contains the uuid and email of a satellite user.
|
|
type UserData struct {
|
|
ID []byte
|
|
Email string
|
|
}
|
|
|
|
// generateStripeCustomers creates missing stripe-customers for users in our database.
|
|
func generateStripeCustomers(ctx context.Context) (err error) {
|
|
//Open SatelliteDB for the Payment Service
|
|
logger := zap.L()
|
|
db, err := satellitedb.New(logger.Named("db"), runCfg.Database, satellitedb.Options{})
|
|
if err != nil {
|
|
return errs.New("error connecting to master database on satellite: %+v", err)
|
|
}
|
|
defer func() {
|
|
err = errs.Combine(err, db.Close())
|
|
}()
|
|
|
|
//Open direct DB connection to execute custom queries
|
|
driver, source, implementation, err := dbutil.SplitConnStr(runCfg.Database)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if implementation != dbutil.Postgres && implementation != dbutil.Cockroach {
|
|
return errs.New("unsupported driver %q", driver)
|
|
}
|
|
|
|
dbxDB, err := dbx.Open(driver, source)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
logger.Debug("Connected to:", zap.String("db source", source))
|
|
defer func() {
|
|
err = errs.Combine(err, dbxDB.Close())
|
|
}()
|
|
|
|
handler, err := setupPayments(zap.L().Named("payments"), db)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rows, err := dbxDB.Query(ctx, "SELECT id, email FROM users WHERE id NOT IN (SELECT user_id from stripe_customers)")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func() {
|
|
err = errs.Combine(err, rows.Close())
|
|
}()
|
|
var n int64
|
|
for rows.Next() {
|
|
n++
|
|
var user UserData
|
|
err := rows.Scan(&user.ID, &user.Email)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
uid, err := dbutil.BytesToUUID(user.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = handler.Setup(ctx, uid, user.Email)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
logger.Info("Ensured Stripe-Customer", zap.Int64("created", n))
|
|
return err
|
|
}
|
|
|
|
func setupPayments(log *zap.Logger, db satellite.DB) (handler payments.Accounts, err error) {
|
|
pc := runCfg.Payments
|
|
service, err := stripecoinpayments.NewService(
|
|
log.Named("payments.stripe:service"),
|
|
pc.StripeCoinPayments,
|
|
db.StripeCoinPayments(),
|
|
db.Console().Projects(),
|
|
db.ProjectAccounting(),
|
|
pc.StorageTBPrice,
|
|
pc.EgressTBPrice,
|
|
pc.ObjectPrice,
|
|
pc.BonusRate,
|
|
pc.CouponValue,
|
|
pc.CouponDuration,
|
|
pc.CouponProjectLimit,
|
|
pc.MinCoinPayment)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
handler = service.Accounts()
|
|
|
|
return handler, err
|
|
}
|