n8n-nodes-base
Version:
Base nodes of n8n
681 lines • 24.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.description = void 0;
exports.execute = execute;
const utils_1 = require("../../helpers/utils");
const transport_1 = require("../../transport");
const dimensionDropdown = [
{
displayName: 'Dimension',
name: 'listName',
type: 'options',
default: 'ga:date',
// eslint-disable-next-line n8n-nodes-base/node-param-options-type-unsorted-items
options: [
{
name: 'Browser',
value: 'ga:browser',
},
{
name: 'Campaign',
value: 'ga:campaign',
},
{
name: 'City',
value: 'ga:city',
},
{
name: 'Country',
value: 'ga:country',
},
{
name: 'Date',
value: 'ga:date',
},
{
name: 'Device Category',
value: 'ga:deviceCategory',
},
{
name: 'Item Name',
value: 'ga:productName',
},
{
name: 'Language',
value: 'ga:language',
},
{
name: 'Page',
value: 'ga:pagePath',
},
{
name: 'Source / Medium',
value: 'ga:sourceMedium',
},
{
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased
name: 'Other dimensions…',
value: 'other',
},
],
},
{
displayName: 'Name or ID',
name: 'name',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getDimensions',
loadOptionsDependsOn: ['viewId.value'],
},
default: 'ga:date',
description: 'Name of the dimension to fetch, for example ga:browser. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
displayOptions: {
show: {
listName: ['other'],
},
},
},
];
exports.description = [
{
displayName: 'View',
name: 'viewId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
description: 'The View of Google Analytics',
hint: "If this doesn't work, try changing the 'Property Type' field above",
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select a view...',
typeOptions: {
searchListMethod: 'searchViews',
searchFilterRequired: false,
searchable: false,
},
},
{
displayName: 'By URL',
name: 'url',
type: 'string',
placeholder: 'https://analytics.google.com/analytics/...',
validation: [
{
type: 'regex',
properties: {
regex: '.*analytics.google.com/analytics.*p[0-9]{1,}.*',
errorMessage: 'Not a valid Google Analytics URL',
},
},
],
extractValue: {
type: 'regex',
regex: '.*analytics.google.com/analytics.*p([0-9]{1,})',
},
},
{
displayName: 'By ID',
name: 'id',
type: 'string',
placeholder: '123456',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]{1,}',
errorMessage: 'Not a valid Google Analytics View ID',
},
},
],
},
],
displayOptions: {
show: {
resource: ['report'],
operation: ['get'],
propertyType: ['universal'],
},
},
},
{
displayName: 'Date Range',
name: 'dateRange',
type: 'options',
required: true,
// eslint-disable-next-line n8n-nodes-base/node-param-options-type-unsorted-items
options: [
{
name: 'Last 7 Days',
value: 'last7days',
},
{
name: 'Last 30 Days',
value: 'last30days',
},
{
name: 'Today',
value: 'today',
},
{
name: 'Yesterday',
value: 'yesterday',
},
{
name: 'Last Complete Calendar Week',
value: 'lastCalendarWeek',
},
{
name: 'Last Complete Calendar Month',
value: 'lastCalendarMonth',
},
{
name: 'Custom',
value: 'custom',
},
],
default: 'last7days',
displayOptions: {
show: {
resource: ['report'],
operation: ['get'],
propertyType: ['universal'],
},
},
},
{
displayName: 'Start',
name: 'startDate',
type: 'dateTime',
required: true,
default: (0, utils_1.defaultStartDate)(),
displayOptions: {
show: {
resource: ['report'],
operation: ['get'],
propertyType: ['universal'],
dateRange: ['custom'],
},
},
},
{
displayName: 'End',
name: 'endDate',
type: 'dateTime',
required: true,
default: (0, utils_1.defaultEndDate)(),
displayOptions: {
show: {
resource: ['report'],
operation: ['get'],
propertyType: ['universal'],
dateRange: ['custom'],
},
},
},
{
displayName: 'Metrics',
name: 'metricsUA',
type: 'fixedCollection',
default: { metricValues: [{ listName: 'ga:users' }] },
typeOptions: {
multipleValues: true,
},
placeholder: 'Add metric',
description: 'Metrics in the request',
options: [
{
displayName: 'Metric',
name: 'metricValues',
values: [
{
displayName: 'Metric',
name: 'listName',
type: 'options',
default: 'ga:users',
// eslint-disable-next-line n8n-nodes-base/node-param-options-type-unsorted-items
options: [
{
name: 'Checkouts',
value: 'ga:productCheckouts',
},
{
name: 'Events',
value: 'ga:totalEvents',
},
{
name: 'Page Views',
value: 'ga:pageviews',
},
{
name: 'Session Duration',
value: 'ga:sessionDuration',
},
{
name: 'Sessions',
value: 'ga:sessions',
},
{
name: 'Sessions per User',
value: 'ga:sessionsPerUser',
},
{
name: 'Total Users',
value: 'ga:users',
},
{
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased
name: 'Other metrics…',
value: 'other',
},
{
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased
name: 'Custom metric…',
value: 'custom',
},
],
},
{
displayName: 'Name or ID',
name: 'name',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getMetrics',
loadOptionsDependsOn: ['viewId.value'],
},
default: 'ga:users',
hint: 'If expression is specified, name can be any string that you would like',
description: 'The name of the metric. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
displayOptions: {
show: {
listName: ['other'],
},
},
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: 'custom_metric',
displayOptions: {
show: {
listName: ['custom'],
},
},
},
{
displayName: 'Expression',
name: 'expression',
type: 'string',
default: '',
placeholder: 'e.g. ga:totalRefunds/ga:users',
description: 'Learn more about Google Analytics <a href="https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#Metric">metric expressions</a>',
displayOptions: {
show: {
listName: ['custom'],
},
},
},
{
displayName: 'Formatting Type',
name: 'formattingType',
type: 'options',
default: 'INTEGER',
description: 'Specifies how the metric expression should be formatted',
options: [
{
name: 'Currency',
value: 'CURRENCY',
},
{
name: 'Float',
value: 'FLOAT',
},
{
name: 'Integer',
value: 'INTEGER',
},
{
name: 'Percent',
value: 'PERCENT',
},
{
name: 'Time',
value: 'TIME',
},
],
displayOptions: {
show: {
listName: ['custom'],
},
},
},
],
},
],
displayOptions: {
show: {
resource: ['report'],
operation: ['get'],
propertyType: ['universal'],
},
},
},
{
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased
displayName: 'Dimensions to split by',
name: 'dimensionsUA',
type: 'fixedCollection',
default: { dimensionValues: [{ listName: 'ga:date' }] },
// default: {},
typeOptions: {
multipleValues: true,
},
placeholder: 'Add Dimension',
description: 'Dimensions are attributes of your data. For example, the dimension ga:city indicates the city, for example, "Paris" or "New York", from which a session originates.',
options: [
{
displayName: 'Values',
name: 'dimensionValues',
values: [...dimensionDropdown],
},
],
displayOptions: {
show: {
resource: ['report'],
operation: ['get'],
propertyType: ['universal'],
},
},
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
operation: ['get'],
resource: ['report'],
propertyType: ['universal'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
operation: ['get'],
resource: ['report'],
propertyType: ['universal'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 1000,
},
default: 50,
description: 'Max number of results to return',
},
{
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-wrong-for-simplify
displayName: 'Simplify Output',
name: 'simple',
type: 'boolean',
displayOptions: {
show: {
operation: ['get'],
resource: ['report'],
propertyType: ['universal'],
},
},
default: true,
description: 'Whether to return a simplified version of the response instead of the raw data',
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['report'],
operation: ['get'],
propertyType: ['universal'],
},
},
options: [
{
displayName: 'Dimension Filters',
name: 'dimensionFiltersUi',
type: 'fixedCollection',
default: {},
typeOptions: {
multipleValues: true,
},
placeholder: 'Add Dimension Filter',
description: 'Dimension Filters in the request',
options: [
{
displayName: 'Filters',
name: 'filterValues',
values: [
...dimensionDropdown,
// https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#Operator
{
displayName: 'Operator',
name: 'operator',
type: 'options',
default: 'EXACT',
description: 'Operator to use in combination with value',
options: [
{
name: 'Begins With',
value: 'BEGINS_WITH',
},
{
name: 'Ends With',
value: 'ENDS_WITH',
},
{
name: 'Equals (Number)',
value: 'NUMERIC_EQUAL',
},
{
name: 'Exactly Matches',
value: 'EXACT',
},
{
name: 'Greater Than (Number)',
value: 'NUMERIC_GREATER_THAN',
},
{
name: 'Less Than (Number)',
value: 'NUMERIC_LESS_THAN',
},
{
name: 'Partly Matches',
value: 'PARTIAL',
},
{
name: 'Regular Expression',
value: 'REGEXP',
},
],
},
{
displayName: 'Value',
name: 'expressions',
type: 'string',
default: '',
placeholder: '',
description: 'String or <a href="https://support.google.com/analytics/answer/1034324?hl=en">regular expression</a> to match against',
},
],
},
],
},
{
displayName: 'Hide Totals',
name: 'hideTotals',
type: 'boolean',
default: false,
description: 'Whether to hide the total of all metrics for all the matching rows, for every date range',
displayOptions: {
show: {
'/simple': [false],
},
},
},
{
displayName: 'Hide Value Ranges',
name: 'hideValueRanges',
type: 'boolean',
default: false,
description: 'Whether to hide the minimum and maximum across all matching rows',
displayOptions: {
show: {
'/simple': [false],
},
},
},
{
displayName: 'Include Empty Rows',
name: 'includeEmptyRows',
type: 'boolean',
default: false,
description: 'Whether the response exclude rows if all the retrieved metrics are equal to zero',
},
{
displayName: 'Use Resource Quotas',
name: 'useResourceQuotas',
type: 'boolean',
default: false,
description: 'Whether to enable resource based quotas',
displayOptions: {
show: {
'/simple': [false],
},
},
},
],
},
];
async function execute(index) {
//https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet
// const viewId = this.getNodeParameter('viewId', index) as string;
const viewId = this.getNodeParameter('viewId', index, undefined, {
extractValue: true,
});
const returnAll = this.getNodeParameter('returnAll', 0);
const dateRange = this.getNodeParameter('dateRange', index);
const metricsUA = this.getNodeParameter('metricsUA', index);
const dimensionsUA = this.getNodeParameter('dimensionsUA', index);
const additionalFields = this.getNodeParameter('additionalFields', index);
const simple = this.getNodeParameter('simple', index);
let responseData;
const qs = {};
const body = {
viewId,
dateRanges: utils_1.prepareDateRange.call(this, dateRange, index),
};
if (metricsUA.metricValues) {
const metrics = metricsUA.metricValues.map((metric) => {
switch (metric.listName) {
case 'other':
return {
alias: metric.name,
expression: metric.name,
};
case 'custom':
const newMetric = {
alias: metric.name,
expression: metric.expression,
formattingType: metric.formattingType,
};
return newMetric;
default:
return {
alias: metric.listName,
expression: metric.listName,
};
}
});
if (metrics.length) {
utils_1.checkDuplicates.call(this, metrics, 'alias', 'metrics');
body.metrics = metrics;
}
}
if (dimensionsUA.dimensionValues) {
const dimensions = dimensionsUA.dimensionValues.map((dimension) => {
switch (dimension.listName) {
case 'other':
return { name: dimension.name };
default:
return { name: dimension.listName };
}
});
if (dimensions.length) {
utils_1.checkDuplicates.call(this, dimensions, 'name', 'dimensions');
body.dimensions = dimensions;
}
}
if (additionalFields.useResourceQuotas) {
qs.useResourceQuotas = additionalFields.useResourceQuotas;
}
if (additionalFields.dimensionFiltersUi) {
const dimensionFilters = additionalFields.dimensionFiltersUi
.filterValues;
if (dimensionFilters) {
dimensionFilters.forEach((filter) => {
filter.expressions = [filter.expressions];
switch (filter.listName) {
case 'other':
filter.dimensionName = filter.name;
delete filter.name;
delete filter.listName;
break;
default:
filter.dimensionName = filter.listName;
delete filter.listName;
}
});
body.dimensionFilterClauses = { filters: dimensionFilters };
}
}
if (additionalFields.includeEmptyRows) {
Object.assign(body, { includeEmptyRows: additionalFields.includeEmptyRows });
}
if (additionalFields.hideTotals) {
Object.assign(body, { hideTotals: additionalFields.hideTotals });
}
if (additionalFields.hideValueRanges) {
Object.assign(body, { hideTotals: additionalFields.hideTotals });
}
const method = 'POST';
const endpoint = '/v4/reports:batchGet';
if (returnAll) {
responseData = await transport_1.googleApiRequestAllItems.call(this, 'reports', method, endpoint, { reportRequests: [body] }, qs);
}
else {
body.pageSize = this.getNodeParameter('limit', 0);
responseData = await transport_1.googleApiRequest.call(this, method, endpoint, { reportRequests: [body] }, qs);
responseData = responseData.reports;
}
if (simple) {
responseData = (0, utils_1.simplify)(responseData);
}
else if (returnAll && responseData.length > 1) {
responseData = (0, utils_1.merge)(responseData);
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: index } });
return executionData;
}
//# sourceMappingURL=get.universal.operation.js.map