Next step is to define the logic to retrieve the data of the smart collection in a routes/your-model.js file.
You first need to set variables according to the context to ensure the query follows the UX (nb of records per page, index of the page you're on, search performed or not)
You then need to define a serializer adapted to the format of the data that will be passed and the expected fields of the collection.
Finally you need to implement the API call, serialize the data obtained, filter depending on the search performed and return the payload.
NB: I used the superagent module for the API call
constLiana=require('forest-express-sequelize');constexpress=require('express');constrouter=express.Router();constmodels=require('../models');constP=require('bluebird');constJSONAPISerializer=require('jsonapi-serializer').Serializer;constsuperagent=require('superagent');router.get('/hubspot_companies',Liana.ensureAuthenticated, (req, res, next) => {// set pagination parameters when exist (default limit is 250 as it is the max allowed by Hubspot)let limit =250;let offset =0;req.query.page ? (limit =parseInt(req.query.page.size)) : limit;req.query.page? (offset = (parseInt(req.query.page.number) -1) * limit): offset;// set search terms when existlet search =null;req.query.search ? (search =req.query.search) : search;// define the serializer used to format the payloadconsthubspotCompaniesSerializer=newJSONAPISerializer('hubspotCompanies', { attributes: ['name'], keyForAttribute:'underscore_case', id:'companyId',transform:function (record) {record.name = record['properties']['name']['value'];return record; }, } );// implement function to call hubspot API and return companiesasyncfunctiongetCompanies() {return (hubspot_companies =await superagent.get(`https://api.hubapi.com/companies/v2/companies/paged?hapikey=${process.env.HUBSPOT_API}&properties=name&limit=${limit}&offset=${limit}` ).then((response) => {// parsing the answer from the API companiesJSON =JSON.parse(response.res.text).companies;// serializing the companies to comply with the format expected by the Forest server serializedCompanies =hubspotCompaniesSerializer.serialize(companiesJSON);// return all data or data with a name containing the searched terms from the companies fetchedif (search) {serializedCompanies.data =serializedCompanies.data.filter(function (item) {returnitem.attributes.name.toUpperCase().includes(search.toUpperCase()); } );return serializedCompanies; } else {return serializedCompanies; } })); }asyncfunctionsendCompaniesPayload() {let hubspotCompanies =awaitgetCompanies();// defining the count of companies fetchedlet count =hubspotCompanies.data.length;returnres.send({ ...hubspotCompanies, meta: { count: count } }); }sendCompaniesPayload(); });module.exports= router;