Как вернуть купоны Stripe с помощью Strapi GraphQL - PullRequest
0 голосов
/ 20 июня 2020

У меня есть приложение Nuxt со страницей оформления заказа, а на бэкэнде я использую Strapi GraphQL. Я создал несколько купонов в Stripe, и я хочу иметь возможность проверять купоны на странице оформления заказа, но я изо всех сил пытаюсь понять, как это сделать. Вот что у меня есть:

Frontend (Nuxt)

Cart. vue:

this.$apollo.query({
  query: validateCouponQuery,
  variables: {
    coupon: this.coupon
  }
})

validateCoupon.gql:

query($coupon: String!) {
  validateCoupon(coupon: $coupon) {
    id
    name
    valid
  }
}

Backend (Strapi): . / Order / config / routes. json:

{
  "method": "GET",
  "path": "/orders/validateCoupon",
  "handler": "order.validateCoupon",
  "config": {
    "policies": []
  }
}

. / Order / config / schema.graphql. js:

const { sanitizeEntity } = require('strapi-utils');

module.exports = {
  query: `
    validateCoupon(coupon: String): Order
  `,
  resolver: {
    Query: {
      validateCoupon: {
        resolverOf: 'Order.validateCoupon',
        async resolver(_, { coupon }) {
          const entity = await strapi.services.order.validateCoupon({ coupon });
          return sanitizeEntity(entity, { model: strapi.models.order });
        }
      }
    }
  }
}

. / Order / controllers / order. js :

'use strict';
require('dotenv').config();

const stripe = require('stripe')(`${process.env.STRIPE_SECRET_KEY}`);

module.exports = {
  validateCoupon: async ctx => {
    const { coupon } = ctx.request.body;
    console.log('request coupon: ', coupon);

    try {
      const coupons = await stripe.coupons.list({ limit: 3 }, function (err, coupons) {
        console.log('err: ', err);
        console.log('coupons: ', coupons);
      });

      return coupons;
    } catch (err) {
      console.error('error validating coupon: ', err)
    }
  }
};

Прямо сейчас, когда я пытаюсь запустить запрос в GraphQL Playground, я получаю сообщение об ошибке strapi.services.order.validateCoupon is not a function.

Я новичок в GraphQL ... есть ли лучший способ получить внешние данные, чем запуск запроса?

**** Обновление ****

Я добавил свою службу заказов, в которой устранена исходная ошибка. Теперь проблема в том, что, хотя служба, похоже, возвращает купон правильно, const entity в schema.graphql.js по какой-то причине возвращает undefined. Интересно, не может ли резолвер быть async / await?

. / Order / services / order. js:

'use strict';
const stripe = require('stripe')(`${process.env.STRIPE_SECRET_KEY}`);

module.exports = {
  validateCoupon: ({ coupon }) => {
    stripe.coupons.list()
      .then(coupons => {
        return coupons.data.filter(c => {
          return (c.name === coupon && c.valid) ? c : null;
        });
        console.log('found: ', found);
      })
      .catch(err => console.error(err));
  }
};

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Что ж, ваш код для поиска купонов в Stripe выглядит отлично! Похоже, Страпи ожидает, что ваш сервис будет на уровне ./order/services/order.js - может ли это быть так просто? В вашем примере это показано на ./order/controllers/order.js. https://strapi.io/documentation/3.0.0-beta.x/concepts/services.html#custom -услуги

0 голосов
/ 23 июня 2020

Итак, я закончил тем, что создал модель купона в конструкторе контента Strapi. Это позволило мне более легко вернуть объект Coupon из моего запроса GraphQL. Это не идеально, потому что мне нужно убедиться, что я создаю объекты купона Stripe и Strapi, чтобы они соответствовали, однако я также не ожидаю создания слишком большого количества купонов в первую очередь.

Мой обновленный код выглядит вот так: schema.graphql. js:

const { sanitizeEntity } = require('strapi-utils/lib');

module.exports = {
  query: `
    validateCoupon(coupon: String): Coupon
  `,
  resolver: {
    Query: {
      validateCoupon: {
        description: 'Validate Stripe coupon',
        resolver: 'application::order.order.validateCoupon',
      }
    }
  }
}

. / order / controllers / order. js:

'use strict';
require('dotenv').config();

const { sanitizeEntity } = require('strapi-utils');

module.exports = {
  validateCoupon: async ctx => {
    const coupon = ctx.query._coupon;
    const found = await strapi.services.order.validateCoupon({ coupon });
    return sanitizeEntity(found, { model: strapi.models.order });
  }
};

. / Заказ / услуги / заказ. js:

'use strict';

const stripe = require('stripe')(`${process.env.STRIPE_SECRET_KEY}`);

module.exports = {
  async validateCoupon({ coupon }) {
    let foundCoupon = null;

    try {
      const coupons = await stripe.coupons.list();
      const found = coupons.data.filter(c => {
        return (c.name === coupon && c.valid) ? c : null;
      });
      if (found) foundCoupon = found[0];
    } catch (err) {
      console.error(err);
    }

    return foundCoupon;
  }
};
...