gatsby-source-smartrecruiters
Version:
Gatsby source plugin for loading job posts from smartrecruiters
149 lines (121 loc) • 4.59 kB
JavaScript
;
/**
* Return all open jobs for a given department
* @param apiToken string.
* @param departmentId string.
*/
let getJobsForDepartment = (() => {
var _ref = _asyncToGenerator(function* (companyIdentifier, departmentId) {
return getJobPosts(companyIdentifier, {
department: departmentId
});
});
return function getJobsForDepartment(_x, _x2) {
return _ref.apply(this, arguments);
};
})();
/**
* Return all job posts
* @param apiToken string.
* @param queryParams object, defaults to only live job posts
*/
let getJobPosts = (() => {
var _ref2 = _asyncToGenerator(function* (companyIdentifier, queryParams = {}) {
return axios.get(`https://api.smartrecruiters.com/v1/companies/${companyIdentifier}/postings`, {
params: queryParams
});
});
return function getJobPosts(_x3) {
return _ref2.apply(this, arguments);
};
})();
/**
* Gets all departments for a given organization
* @param apiToken string.
*/
let getDepartments = (() => {
var _ref3 = _asyncToGenerator(function* (companyIdentifier) {
return axios.get(`https://api.smartrecruiters.com/v1/companies/${companyIdentifier}/departments`);
});
return function getDepartments(_x4) {
return _ref3.apply(this, arguments);
};
})();
/**
* Gatsby requires ID to be a string to define nodes and greenhouse.io uses an integer instead.
*
* @param obj object.
* @returns object.
*/
var _nodes = require('./nodes');
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
const crypto = require('crypto');
const axios = require('axios');
const changeId = obj => {
const updatedObj = obj;
updatedObj.id = updatedObj.id.toString();
return updatedObj;
};
exports.sourceNodes = (() => {
var _ref4 = _asyncToGenerator(function* ({ boundActionCreators }, { companyIdentifier, pluginOptions }) {
const createNode = boundActionCreators.createNode;
const options = pluginOptions || {};
console.log(`Starting to fetch data from Smart Recruiters`);
let departments, jobPosts;
try {
departments = yield getDepartments(companyIdentifier).then(function (response) {
return response.data.content;
});
jobPosts = yield getJobPosts(companyIdentifier, options.jobPosts).then(function (response) {
return response.data.content;
});
} catch (e) {
console.log(`Failed to fetch data from Smart Recruiters`);
process.exit(1);
}
console.log(`jobPosts fetched`, jobPosts.length);
console.log(`departments fetched`, departments.length);
return Promise.all(departments.map((() => {
var _ref5 = _asyncToGenerator(function* (department) {
const convertedDepartment = changeId(department);
let jobs;
try {
const jobsForDepartmentResults = yield getJobsForDepartment(companyIdentifier, convertedDepartment.id);
jobs = jobsForDepartmentResults.data.content.map(function (job) {
return changeId(job);
});
} catch (e) {
console.log(`Failed to fetch jobs for department.`);
process.exit(1);
}
var jobPostsMapping = jobPosts.reduce(function (map, jobPost) {
map[jobPost.id] = jobPost;
return map;
}, {});
var jobPostsForDepartment = jobs.reduce(function (arr, job) {
const mappedJobPost = jobPostsMapping[job.id];
if (mappedJobPost) {
arr.push(mappedJobPost);
}
return arr;
}, []);
convertedDepartment.jobPosts = jobPostsForDepartment;
const departmentNode = (0, _nodes.DepartmentNode)(changeId(convertedDepartment));
jobPostsForDepartment.forEach(function (jobPost) {
const convertedJobPost = changeId(jobPost);
const jobPostNode = (0, _nodes.JobPostNode)(convertedJobPost, {
parent: departmentNode.id
});
createNode(jobPostNode);
});
createNode(departmentNode);
});
return function (_x7) {
return _ref5.apply(this, arguments);
};
})()));
});
return function (_x5, _x6) {
return _ref4.apply(this, arguments);
};
})();