Smart relationship between model and stripe cards

Please be sure of your agent type and version and pick the right documentation accordingly.

This is the documentation of the forest-express-sequelize and forest-express-mongoose Node.js agents that will soon reach end-of-support.

forest-express-sequelize v9 and forest-express-mongoose v9 are replaced by @forestadmin/agent v1.

Please check your agent type and version and read on or switch to the right documentation.

Smart relationship between model and stripe cards

Context: as a user I want to display stripe cards associated to a user using the Stripe API.

Implementation

First step is to declare the smart collection user_stripe_cards in a user-stripe-cards.js file in the forest folder.

const { collection } = require('forest-express-sequelize');
const models = require('../models');

collection('users_stripe_cards', {
  isSearchable: true,
  fields: [
    {
      field: 'id',
      type: 'String',
    },
    {
      field: 'country',
      type: 'String',
    },
    {
      field: 'brand',
      type: 'String',
    },
    {
      field: 'exp_month',
      type: 'Number',
    },
    {
      field: 'exp_year',
      type: 'Number',
    },
    {
      field: 'last4',
      type: 'Number',
    },
  ],
});

Next step is to add the smart relationship between users and stripe cards in the forest/users.js file.

collection('users', {
  actions: [],
  fields: [
    {
      field: 'stripe-cards',
      type: ['String'],
      reference: 'users_stripe_cards.id',
    },
  ],
  segments: [],
});

Final step is to implement the route for the relationship for the cards to be displayed as related data of a user. This is done in the routes/users.js file.

const express = require('express');
const { PermissionMiddlewareCreator } = require('forest-express-sequelize');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const { users, usersData } = require('../models');
var JSONAPISerializer = require('jsonapi-serializer').Serializer;

const router = express.Router();
const permissionMiddlewareCreator = new PermissionMiddlewareCreator('users');

router.get(
  '/users/:userId/relationships/stripe-cards',
  async (request, response, next) => {
    const UserStripeCardSerializer = new JSONAPISerializer(
      'users_stripe_cards',
      {
        attributes: ['country', 'brand', 'exp_year', 'exp_month', 'last4'],
      }
    );
    const { userId } = request.params;
    const stripeId = await usersData
      .findOne({
        where: { userId },
      })
      .then((userData) => userData.stripeId)
      .catch(() => null);
    const cardsInfo = await stripe.customers.listSources(stripeId, {
      object: 'card',
      limit: 3,
    });
    const data = UserStripeCardSerializer.serialize(cardsInfo.data);
    return response.send(data);
  }
);

module.exports = router;

Last updated