Подписка Stripe не обновляет количество

У меня есть довольно простое приложение, которое просто позволяет вам создать одного администратора, который может создавать дополнительных пользователей под своей учетной записью. Когда администратор создает другого пользователя, я хочу, чтобы он обновлял свою подписку на полосе с текущим количеством пользователей, которое сохраняется в user.company.subUserCount. Но когда я это делаю, модель пользователя не обновляется с правильным значением, и полоса вообще не обновляется.

Надеялся, что кто-то может взглянуть на мои фрагменты кода и увидеть, что с ним не так, из-за чего он не обновляет Stripe.

Маршрут

// POST USER/NEW
    app.post('/user/new', 
    isAuthenticated,
    company.postNewUserPlan,
    sessions.postSignupSub,
    (req, res) => {
        User.findById(req.user.id, function(err, user) {
            user.company.subUserCount = req.user.company.subUserCount + 1;
            user.save();
        });
    });

company.postNewUserPlan

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();
};

sessions.postSignupSub код паспорта

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.info(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.'));
          }
          var preRole = req.body.role;
          var role = ''
          if (preRole === undefined) {
            role = 'manager';
          } else if (preRole === 'on')  {
            role = 'employee';
          }
          // edit this portion to accept other properties when creating a user.
          var user = new User({
            email: req.body.email,
            password: req.body.password, // user schema pre save task hashes this password
            role: role,
            companyID: req.user.companyID,
            isVerified: true
          });

          user.save(function(err) {
            if (err) return done(err, false, req.flash('error', 'Error saving user.'));

            var time = 14 * 24 * 3600000;
            req.session.cookie.maxAge = time; //2 weeks
            req.session.cookie.expires = new Date(Date.now() + time);
            req.session.touch();
            return done(null, user, req.flash('success', `Your new ${role} has been created`));
          });
        });

    })
  );
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
38
1

Ответы 1

Мне удалось решить проблему, связанную с кодом, который не был включен в OP, после небольшого тестирования я понял, что подписка не обновлялась с определенным количеством, а вместо этого только создавалась с ним.

Код

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*** }, <-- Part I had to change
          subscriptionHandler
        );
      } else {
        createSubscription();
      }
    }
  };

Другие вопросы по теме