async createOfflineUserDataJob()

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;
    }
  }