in marketing-analytics/activation/common-libs/nodejs-common/src/apis/google_ads_api.js [1144:1205]
async createOfflineUserDataJob(offlineUserDataJobConfig) {
const config = this.getCamelConfig_(offlineUserDataJobConfig);
const { customerId, loginCustomerId, listId, type, } = config;
this.logger.debug('Creating OfflineUserDataJob from:',
offlineUserDataJobConfig);
const jobData = { type };
// https://developers.google.com/google-ads/api/rest/reference/rest/latest/OfflineUserDataJobs?hl=en#CustomerMatchUserListMetadata
if (type.startsWith('CUSTOMER_MATCH')) {
const metadata = this.buildCustomerMatchUserListMetadata_(config);
jobData.customerMatchUserListMetadata = metadata;
// https://developers.google.com/google-ads/api/rest/reference/rest/latest/OfflineUserDataJob?hl=en#StoreSalesMetadata
} else if (type.startsWith('STORE_SALES')) {
// Support previous property 'StoreSalesMetadata' for compatibility.
if (config.storeSalesMetadata || config.StoreSalesMetadata) {
jobData.storeSalesMetadata = config.storeSalesMetadata
|| config.StoreSalesMetadata;
}
} else {
throw new Error(`UNSUPPORTED OfflineUserDataJobType: ${type}.`);
}
const job = new OfflineUserDataJob(jobData);
const request = new CreateOfflineUserDataJobRequest({
customerId: getCleanCid(customerId),
job,
validateOnly: this.debugMode, // when true makes no changes
enableMatchRateRangePreview: true,
});
const client = await this.getOfflineUserDataJobServiceClient_();
const options = this.getCallOptions_(loginCustomerId);
try {
/**
* @type {!CreateOfflineUserDataJobResponse}
* @see https://developers.google.com/google-ads/api/reference/rpc/latest/CreateOfflineUserDataJobResponse
*/
const [response] = await client.createOfflineUserDataJob(request, options);
const { resourceName } = response;
if (!resourceName) {
if (this.debugMode) {
throw new Error('No offlineUserDataJob was created in DEBUG mode.');
} else {
throw new Error('No offlineUserDataJob was created.');
}
}
this.logger.info('Created OfflineUserDataJob:', resourceName);
return resourceName;
} catch (error) {
if (error.metadata) {
const failures = this.getGoogleAdsFailures_(error.metadata);
if (failures.length > 0) {
if (this.logger.isDebugEnabled())
debugGoogleAdsFailure(failures, request);
const message = failures.map((failure) => {
return failure.errors.map(({ message }) => message).join(' ');
}).join(';');
throw new Error(message);
}
this.logger.warn(
'Got an error with metadata but no GoogleAdsFailure in it', error);
}
throw error;
}
}