node-adwords
Version:
An unofficial - feature complete - Adwords sdk for NodeJS
105 lines (90 loc) • 2.9 kB
JavaScript
;
/**
* Helper class to help build a report
*/
const builder = require('xmlbuilder');
const _ = require('lodash');
const AdwordsConstants = require('./constants');
const moment = require('moment');
class AdwordsReportBuilder {
/**
* Builds a report
* @access public
* @param report {object}
*/
buildReport(report) {
var xml = builder.create('reportDefinition');
this.buildSelector(xml, report);
xml.ele('reportName', {}, report.reportName);
xml.ele('reportType', {}, report.reportType);
if (this.hasDateRangeFilter(report)) {
xml.ele('dateRangeType', {}, report.dateRangeType || AdwordsConstants.DATE_RANGE_TYPES.CUSTOM_DATE);
}
xml.ele('downloadFormat', {}, report.format);
return xml.end();
}
/**
* Builds the fields list in the selector. This function modifies the xmlelement
* @param fields {array} Array of field names
* @access private
* @return null
*/
buildSelector(xml, report) {
var selector = xml.ele('selector');
this.buildFields(selector, report.fields);
this.buildFilters(selector, report.filters);
this.buildDateRange(selector, report.startDate, report.endDate);
}
/**
* Builds the fields
* @access private
* @param selector {xml}
* @param fields {array}
*/
buildFields(selector, fields) {
_.each(fields, (field) => {
selector.ele('fields', {}, field);
});
}
/**
* Builds the date range
* @access private
* @param selector {xml}
* @param startDate {date}
* @param endDate {date}
*/
buildDateRange(selector, startDate, endDate) {
if (startDate || endDate) {
var dateElement = selector.ele('dateRange');
dateElement.ele('min', {}, moment(new Date(startDate)).format('YYYYMMDD'));
dateElement.ele('max', {}, moment(new Date(endDate)).format('YYYYMMDD'));
}
}
/**
* Builds the Filters
* @param selector {xml}
* @param filters {array} an array of filters
*/
buildFilters(selector, filters) {
_.each(filters, (filter) => {
var element = selector.ele('predicates');
element.ele('field', {}, filter.field);
element.ele('operator', {}, filter.operator);
if (!(filter.values instanceof Array)) {
filter.values = [filter.values]
}
_.each(filter.values, (value) => {
element.ele('values', {}, value);
});
});
}
/**
* Determines if a report has a date range filter
* @access public
* @
*/
hasDateRangeFilter(report) {
return !!(report.dateRangeType || report.startDate || report.endDate);
}
}
module.exports = AdwordsReportBuilder;