# Extending the API
Some extensions need to have additional API methods to get some data directly from Magento/other CMS or just from custom Elasticsearch data collections.
You may add new ES collections using the Migration mechanism
Then you may extend the vue-storefront-api
(opens new window) to add your custom API methods. Please take a look at: mailchimp-subscribe (opens new window) for reference.
To add the API extension to vue-storefront-api
:
- Create the folder within
src/api/extensions
for example 'custom_extension`. - Then add the
index.js
file and put the API methods code inside. We're using Express.js. Here is a boilerplate/example for the extension code:
import { apiStatus } from '../../../lib/util';
import { Router } from 'express';
module.exports = ({ config, db }) => {
let mcApi = Router();
/**
* POST create an user
*/
mcApi.post('/subscribe', (req, res) => {
let userData = req.body;
if (!userData.email) {
apiStatus(res, 'Invalid e-mail provided!', 500);
return;
}
let request = require('request');
request(
{
url:
config.extensions.mailchimp.apiUrl +
'/lists/' +
encodeURIComponent(config.extensions.mailchimp.listId) +
'/members',
method: 'POST',
headers: {
Authorization: 'apikey ' + config.extensions.mailchimp.apiKey,
},
json: true,
body: { email_address: userData.email, status: 'subscribed' },
},
function(error, response, body) {
if (error) {
apiStatus(res, error, 500);
} else {
apiStatus(res, body, 200);
}
},
);
});
/**
* DELETE delete an user
*/
mcApi.delete('/subscribe', (req, res) => {
let userData = req.body;
if (!userData.email) {
apiStatus(res, 'Invalid e-mail provided!', 500);
return;
}
let request = require('request');
request(
{
url:
config.extensions.mailchimp.apiUrl +
'/lists/' +
encodeURIComponent(config.extensions.mailchimp.listId),
method: 'POST',
headers: {
Authorization: 'apikey ' + config.extensions.mailchimp.apiKey,
},
json: true,
body: {
members: [{ email_address: userData.email, status: 'unsubscribed' }],
update_existing: true,
},
},
function(error, response, body) {
if (error) {
apiStatus(res, error, 500);
} else {
apiStatus(res, body, 200);
}
},
);
});
return mcApi;
};
- Add the extension to
config/local.json
:
"registeredExtensions": ["mailchimp-subscribe"],
- Restart the
vue-storefront-api
- Your new API method is available on
localhost:8080/api/ext/<extension_name>/<extension_method>
for example:localhost:8080/api/ext/mailchimp-subscribe/subscribe