Регистрация суб-пользователя создает нового пользователя в Stripe - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь сделать так, чтобы, когда пользователь создает другого пользователя (называемого суб-пользователем), он просто создает пользователя и обновляет только пользователя компании и обновляет количество подписок на полосы до currentUser + 1 или req.user.company.subUserCount + 1

В настоящее время происходит то, что подписка пользователя обновляется правильно, но субпользователь создается как новый клиент в Stripe. Я включил большую часть кода, который запускается при создании нового пользователя. Недостает только маршрут и некоторые блоки несвязанного кода для чередования, но с внутренней бизнес-логикой.

Запуск первого бита для регистрации суб-пользователя

exports.postNewUserPlan = function(req, res, next){
  var plan = req.user.company.stripe.plan;
  var coupon = null;
  var stripeToken = null;
  plan = plan.toLowerCase();

  if(req.body.stripeToken){
    stripeToken = req.body.stripeToken;
  }

  User.findById(req.user.id, function(err, user) {
    if (err) return next(err);
    var quantity = user.company.subUserCount + 1;
    user.setPlan(plan, coupon, quantity, stripeToken, function (err) {
      var msg;

      if (err) {
        if(err.code && err.code == 'card_declined'){
          msg = 'Your card was declined. Please provide a valid card.';
        } else if(err && err.message) {
          msg = err.message;
        } else {
          msg = 'An unexpected error occurred.';
        }
        req.flash('errors', msg);
        return res.redirect('/user/create');
      }
    });
  });
  next();
};

Второй прогон блока

passport.use('signup-sub', new LocalStrategy({
      usernameField: 'email',
      passReqToCallback : true
    },
    function(req, email, password, done) {
        User.findOne({ email: req.body.email }, function(err, existingUser) {
          if(err){
            console.log(err);
          }
          if (existingUser) {
            req.flash('form', {
              email: req.body.email
            });
            return done(null, false, req.flash('error', 'An account with that email address already exists.'));
          }

          // setting value for email using company domain name
          email = req.body.email + req.user.company.companyDomain;

         var user = new User({
            email: email,
            password: req.body.password, // user schema pre save task hashes this password
            role: role,
            companyID: req.user.companyID                
          });              
          user.save(function(err) {
            if (err) return done(err, false, req.flash('error', 'Error saving user.'));
            return done(null, user, req.flash('success', `Your new ${role} has been created.`));
          });
        });

    })
  );

блок setPlan сверху присоединен к пользовательской модели через плагин

schema.methods.setPlan = function(plan, coupon, quantity, stripe_token, cb) {
    var user = this;

    var subscriptionHandler = function(err, subscription) {
      if(err) return cb(err);

      user.company.stripe.plan = plan;
      user.company.stripe.subscriptionId = subscription.id;
      user.company.subUserCount = quantity;
      user.save(function(err){
        if (err) return cb(err);
        return cb(null);
      });
    };

    var createSubscription = function(){
      stripe.customers.createSubscription(
        user.company.stripe.customerId,
        {plan: plan, coupon: coupon, quantity: quantity},
        subscriptionHandler
      );
    };

    if(stripe_token) {
      user.setCard(stripe_token, function(err){
        if (err) return cb(err);
        createSubscription();
      });
    } else {
      if (user.company.stripe.subscriptionId){
        // update subscription
        stripe.customers.updateSubscription(
          user.company.stripe.customerId,
          user.company.stripe.subscriptionId,
          { plan: plan, coupon: coupon, quantity: quantity },
          subscriptionHandler
        );
      } else {
        createSubscription();
      }
    }
  };

Схема пользователя

var UserSchema = new mongoose.Schema({
email: String,
password: String,
companyID: String,

company: {
  companyDomain: String,
  subUserCount: { type: Number, default: 1},
  stripe: {
  customerId: String,
  subscriptionId: String,
  last4: String,
  plan: String,
  isCoupon: {
    type: Boolean,
    default: false
  }
},
}

});


var stripeOptions = config.stripeOptions;


UserSchema.plugin(passportLocalMongoose, { usernameField : 'email' });
UserSchema.plugin(stripeCustomer, stripeOptions);

Я знаю, что это много кода и никаких сообщений об ошибках (потому что они не существуют, существует неправильный результат), но, надеюсь, кто-то может взглянуть и посмотреть, где я ошибся. Я был на этом все выходные без удачи. Даже предложения вещей, которые можно попробовать, были бы потрясающими. Заранее спасибо!

...