function upsertEndpoint()

in source/rest-api-handler/index.js [217:295]


function upsertEndpoint(projectID, userID, endpoint, metadata) {
  log.trace("upsertEndpoint...");
  return new Promise((resolve, reject) => {

      var endpointID = endpoint.Id || uuidv4(); //New Endpoint, go generate a UUID

      endpoint.User.UserId = userID;

      //Remove following attributes...they were part of Get, but the Update doesn't like them
      delete endpoint.ApplicationId;
      delete endpoint.CohortId;
      delete endpoint.CreationDate;
      delete endpoint.Id; 

      //Sanitize all user specified values
      endpoint.Address = sanitizer.process(endpoint.Address);
      for (const property in endpoint.User.UserAttributes) {
        endpoint.User.UserAttributes[property].forEach(function(value,index) {
          endpoint.User.UserAttributes[property][index] = sanitizer.process(value);
        });
      }
      
      //Validate Inputs
      var dataToValidate = {};
      var validationRules = {};
      
        //available channels
        metadata.availableChannels.forEach(function(availableChannel) {
            if (availableChannel.id == endpoint.ChannelType) {
                dataToValidate[endpoint.ChannelType] = endpoint.Address;
                validationRules[endpoint.ChannelType] = availableChannel.serverMask || 'string'; //default to string validation
            }
        });
        
        //publications
        metadata.categories.forEach(function(category) {
            category.publications.forEach(function(publication) {
                validationRules[publication.id] = 'array';
                validationRules[`${publication.id}.*`] = 'alpha';
            });
        });
        
        //attributes
        metadata.attributes.forEach(function(attribute) {
            validationRules[attribute.id] = 'array';
            validationRules[`${attribute.id}.*`] = attribute.serverMask || 'string'; //default to string validation
            for (const property in endpoint.User.UserAttributes) {
                dataToValidate[property] = endpoint.User.UserAttributes[property];
            }
        });
      
      const v = new Validator(dataToValidate, validationRules);
     
      v.check().then(function (matched) {
        if (matched === true) {
            var params = {
                ApplicationId: projectID,
                EndpointId: endpointID,
                EndpointRequest: endpoint
              };

              log.trace(JSON.stringify(params,null,2));

              pinpoint.updateEndpoint(params, function(err, data) {
                  if (err) {
                      log.error(err, err.stack); 
                  } else {
                      log.debug(data);
                      resolve(data);
                  }
            });
        } else {
            //validation errors
            log.error("Input Validation Errors:", JSON.stringify(v.errors, null, 2));
            reject(new Error(`Input Validation Errors: ${JSON.stringify(v.errors, null, 2)}`));
        }
      });
  });
}