Сервер Apollo: Как я могу добавить пользовательскую конечную точку для Stripe webhook? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть сервер graphql, для которого я хочу добавить пользовательскую конечную точку, чтобы Stripe мог связываться с ней при изменении статуса подписки клиента.

В настоящее время мой индексный файл. js выглядит как типичный Настройка сервера Apollo:

import { ApolloServer } from "apollo-server";
import { connectDb } from "./models";

import schema from "./schema";
import resolvers from "./resolvers";
import contexts from "./contexts";

const server = new ApolloServer({
  typeDefs: schema,
  resolvers,
  context: async ({ req }) => {
    const { getCurrentUser } = contexts;

    const currentUser = await getCurrentUser(req);
    return { models, currentUser };
  },
});

connectDb().then(async () => {
  server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => {
    console.log(`?  Server ready at ${url}`);
  });
});

Таким образом, предоставляется только /graphql.

Как бы добавить пользовательскую конечную точку POST /foobar, которая делает нечто подобное? (источник: https://stripe.com/docs/webhooks/build#example -код )

// This example uses Express to receive webhooks
const app = require('express')();

// Use body-parser to retrieve the raw body as a buffer
const bodyParser = require('body-parser');

// Match the raw body to content type application/json
app.post('/webhook', bodyParser.raw({type: 'application/json'}), (request, response) => {
  let event;

  try {
    event = JSON.parse(request.body);
  } catch (err) {
    response.status(400).send(`Webhook Error: ${err.message}`);
  }

  // Handle the event
  switch (event.type) {
    case 'payment_intent.succeeded':
      const paymentIntent = event.data.object;
      // Then define and call a method to handle the successful payment intent.
      // handlePaymentIntentSucceeded(paymentIntent);
      break;
    case 'payment_method.attached':
      const paymentMethod = event.data.object;
      // Then define and call a method to handle the successful attachment of a PaymentMethod.
      // handlePaymentMethodAttached(paymentMethod);
      break;
    // ... handle other event types
    default:
      // Unexpected event type
      return response.status(400).end();
  }

  // Return a response to acknowledge receipt of the event
  response.json({received: true});
});

app.listen(8000, () => console.log('Running on port 8000'));

1 Ответ

1 голос
/ 22 марта 2020

Вам нужно будет перейти с apollo-server на apollo-server-express. Затем вы можете добавить любые дополнительные конечные точки, которые вам нужны. Если вы не хотите использовать Express, вы также можете использовать любые другие доступные интеграции .

...