node-meraki
Version:
Meraki wrapper for nodejs
149 lines (132 loc) • 4.7 kB
JavaScript
const debug = require('debug')('node-meraki:frontend/organizations');
/**
* Create a Meraki Frontend API wrapper for the organizations process. This is uses the same API as the Meraki webfrontend. So stuff can break
*
* @module meraki/frontend/organizations
* @param { string } [target='account'] The Meraki target
* @param { string } [basePath] The Meraki base path for the Authentication ressource
* @param { string } [baseUrl] The Meraki base url for the Authentication ressource
* @param { string } rateLimiter The rate limiter (bottleneck) configuration
* @return { Object } The initialized Meraki REST API wrapper for the Authentication ressource
* @example
* const target = 'n12'
* const basePath = ``
* const rateLimiter = {
* enabled: true
* }
* const organizationEndpoints = require('./lib/frontend/organizations')({ basePath, baseUrl, rateLimiter })
*/
function createOrganizationEndpoints({
targetOrg,
basePath,
baseUrl,
rateLimiter
}) {
const axios = require('./axios')({
baseUrl,
rateLimiter
});
/**
* Get the information about the org from the api
*
* @memberof module:meraki/frontend/organizations
* @param { string } [target=targetOrt] Optional custom target for this request (if not set will take the inital target)
* @param { string } [eid] email address of the user to authenticate with
* @return { Promise } A promise holding the informations about this organization
* @example <caption>Example response</caption>
* {
"id":"123",
"eid":"asdfasdf",
"uid":"123",
"org_admin_type":"write",
"name":"Test api Deletion",
"node_groups":{
},
"num_networks":0,
"locales":{
},
"shard_id":123,
"licensed_product_edition_name":"enterprise",
"license_expires_on":0,
"block_meraki_admins":false,
"org":{
"reported_api_level":4,
"resolved_api_level":4,
"id":"123",
"eid":"asdfasdf",
"l3_vpn_config_hash":{
"participants":[
],
"firewall_rules":[
],
"vpn_firewall_inbound_default_rules_logging":true,
"vpn_firewall_outbound_default_rules_logging":true,
"ipsec_peers":[
]
},
"mcn":"1233-1233"
},
"inventory":[
],
"api_level":4,
"support_password":"1234"
}
*/
async function getOrganization({
target = targetOrg,
eid
}) {
if (typeof eid === 'undefined') {
return Promise.reject(new Error('the parameter email is mandatory'));
}
debug(`get organization information ${eid}`);
return axios._get('', target, `${basePath}/${eid}/manage/organization/map`);
}
/**
* delete the org
*
* @memberof module:meraki/frontend/organizations
* @param { string } [target=targetOrt] Optional custom target for this request (if not set will take the inital target)
* @param { string } [eid] email address of the user to authenticate with
* @return { Promise } A promise holding the informations about this organization
* @example <caption>Example response</caption>
* { success:true }
*/
async function deleteOrganization({
target,
eid
}) {
if (typeof eid === 'undefined') {
return Promise.reject(new Error('the parameter email is mandatory'));
} // the correct shard id is needed to build the url
const org = await getOrganization({
target: 'account',
eid
});
let shardId = 0;
if (org && org.shard_id) {
shardId = org.shard_id;
} else {
return Promise.reject(new Error('unable to determine the correct shard id'));
}
debug(`got the correct shard_id ${shardId}`); // because it is an form in the frontend it need also a csrfToken (no JSON access)
const csrfSource = await axios._get('', `n${shardId}`, `${basePath}/${eid}/manage/organization/edit`);
const csrfToken = csrfSource.split('Mkiconf.authenticity_token = "')[1].split('";')[0];
debug(`got csrf token ${csrfToken}`);
axios.setCSRFToken(csrfToken); // delete the organization and remove the csrf token
const delResponse = await axios._post('', `n${shardId}`, `${basePath}/${eid}/manage/organization/delete_org`, ``);
debug(`organization ${eid} deleted`);
axios.setCSRFToken('');
if (delResponse.indexOf('window.location.reload()') > -1) {
return Promise.reject(new Error('some error occured'));
}
return Promise.resolve({
success: true
});
}
return {
getOrganization,
deleteOrganization
};
}
module.exports = createOrganizationEndpoints;