function main()

in core/routemgmt/deleteApi/deleteApi.js [46:211]


function main(message) {
  //console.log('message: '+JSON.stringify(message));  // ONLY FOR TEMPORARY/LOCAL DEBUG; DON'T ENABLE PERMANENTLY
  var badArgMsg = validateArgs(message);
  if (badArgMsg) {
    return Promise.reject(utils2.makeErrorResponseObject(badArgMsg, (message.__ow_method != undefined)));
  }

  var gwInfo = {
    gwUrl: message.gwUrl,
  };
  if (message.gwUser && message.gwPwd) {
    gwInfo.gwAuth = Buffer.from(message.gwUser+':'+message.gwPwd,'ascii').toString('base64');
  }

  // Set the User-Agent header value
  if (message.__ow_headers && message.__ow_headers['user-agent']) {
    utils2.setSubUserAgent(message.__ow_headers['user-agent']);
  }

  // Set namespace override if provided
  message.namespace = message.__ow_user || message.namespace;

  var tenantInstance = message.tenantInstance || 'openwhisk';

  // This can be invoked as either a web action or as a normal action
  var calledAsWebAction = message.__ow_method !== undefined;

  // Log parameter values
  console.log('GW URL        : '+message.gwUrl);
  console.log('GW URL V2     : '+message.gwUrlV2);
  console.log('GW User       : '+utils.confidentialPrint(message.gwUser));
  console.log('GW Pwd        : '+utils.confidentialPrint(message.gwPwd));
  console.log('__ow_user     : '+message.__ow_user);
  console.log('namespace     : '+message.namespace);
  console.log('tenantInstance: '+message.tenantInstance+' / '+tenantInstance);
  console.log('accesstoken   : '+message.accesstoken);
  console.log('spaceguid     : '+message.spaceguid);
  console.log('basepath/name : '+message.basepath);
  console.log('relpath       : '+message.relpath);
  console.log('operation     : '+message.operation);
  console.log('calledAsWebAction: '+calledAsWebAction);

  // If no relpath (or relpath/operation) is specified, delete the entire API
  var deleteEntireApi = !message.relpath;

  if (message.accesstoken) {
    // Delete an API route
    // 1. Use the spaceguid and basepath to obtain the API from the API GW
    // 2. If a relpath or relpath/operation is specified (i.e. delete subset of API)
    //    a. Remove that section from the API config
    //    b. Update API GW with updated API config
    // 3. If relpath or replath/operation is NOT specified (i.e. delete entire API)
    //    a. Delete entire API from API GW
    gwInfo.gwUrl = message.gwUrlV2;
    gwInfo.gwAuth = message.accesstoken;

    return utils2.getApis(gwInfo, message.spaceguid, message.basepath)
    .then(function(endpointDocs) {
      console.log('Got '+endpointDocs.length+' APIs');
      if (endpointDocs.length === 0) {
        console.log('No API found for namespace '+message.namespace + ' with basePath '+ message.basepath);
        return Promise.reject('API \''+message.basepath+'\' does not exist.');
      } else if (endpointDocs.length > 1) {
        console.error('Multiple APIs found for namespace '+message.namespace+' with basepath/apiname '+message.basepath);
      }
      return Promise.resolve(endpointDocs[0]);
    })
    .then(function(endpointDoc) {
      console.log('Got API');
      if (deleteEntireApi) {
        console.log('Removing entire API '+message.basepath+' from API GW');
        return utils2.deleteApiFromGateway(gwInfo, message.spaceguid, endpointDoc.artifact_id);
      } else {
        console.log('Removing path '+message.relpath+' with operation '+message.operation+' from API '+message.basepath);
        var endpointToRemove = {
          gatewayMethod: message.operation,
          gatewayPath: message.relpath
        };
        var swaggerOrErrMsg = utils2.removeEndpointFromSwaggerApi(endpointDoc.open_api_doc, endpointToRemove);
        if (typeof swaggerOrErrMsg === 'string' ) {
          return Promise.reject(swaggerOrErrMsg);
        }
        if (_.isEmpty(swaggerOrErrMsg.paths)) {
          console.log('After path/operation removal, no paths exist in API; so removing entire API '+message.basepath+' from API GW');
          return utils2.deleteApiFromGateway(gwInfo, message.spaceguid, endpointDoc.artifact_id);
        }
        return utils2.addApiToGateway(gwInfo, message.spaceguid, swaggerOrErrMsg, endpointDoc.artifact_id);
      }
    })
    .then(function() {
      console.log('deleteApi success');
      return Promise.resolve(utils2.makeResponseObject({}, calledAsWebAction));
    })
    .catch(function(reason) {
        var rejmsg = 'API deletion failure: ' + JSON.parse(utils2.makeJsonString(reason)); // Avoid unnecessary JSON escapes
        console.error(rejmsg);
        return Promise.reject(utils2.makeErrorResponseObject(rejmsg, calledAsWebAction));
    });
  } else {
    // Delete an API route
    // 1. Get the tenant ID associated with the specified namespace and optional tenant instance
    // 2. Obtain the tenantId/basepath/apiName associated API configuration from the API GW
    // 3. If a relpath or relpath/operation is specified (i.e. delete subset of API)
    //    a. Remove that section from the API config
    //    b. Update API GW with updated API config
    // 4. If relpath or replath/operation is NOT specified (i.e. delete entire API)
    //    a. Delete entire API from API GW
    var tenantId;
    return utils.getTenants(gwInfo, message.namespace, tenantInstance)
    .then(function(tenants) {
      // If a non-empty tenant array was returned, pick the first one from the list
      if (tenants.length === 0) {
        console.error('No Tenant found for namespace '+message.namespace);
        return Promise.reject('No Tenant found for namespace '+message.namespace);
      } else if (tenants.length > 1 ) {
        console.error('Multiple tenants found for namespace '+message.namespace+' and tenant instance '+tenantInstance);
        return Promise.reject('Internal error. Multiple API Gateway tenants found for namespace '+message.namespace+' and tenant instance '+tenantInstance);
      }
      console.log('Got a tenant: '+JSON.stringify(tenants[0]));
      tenantId = tenants[0].id;
      return Promise.resolve(tenants[0].id);
    })
    .then(function(tenantId) {
      console.log('Got Tenant ID: '+tenantId);
      return utils.getApis(gwInfo, tenantId, message.basepath);
    })
    .then(function(apis) {
      console.log('Got '+apis.length+' APIs');
      if (apis.length === 0) {
        console.log('No APIs found for namespace '+message.namespace+' with basepath/apiname '+message.basepath);
        return Promise.reject('API \''+message.basepath+'\' does not exist.');
      } else if (apis.length > 1) {
        console.error('Multiple APIs found for namespace '+message.namespace+' with basepath/apiname '+message.basepath);
        Promise.reject('Internal error. Multiple APIs found for namespace '+message.namespace+' with basepath '+message.basepath);
      }
      return Promise.resolve(apis[0]);
    })
    .then(function(gwApi) {
      if (deleteEntireApi) {
        console.log('Removing entire API '+gwApi.basePath+' from API GW');
        return utils.deleteApiFromGateway(gwInfo, gwApi.id);
      } else {
        console.log('Removing path '+message.relpath+'; operation '+message.operation+' from API '+gwApi.basePath);
        var swaggerApi = utils.generateSwaggerApiFromGwApi(gwApi);
        var endpoint = {
          gatewayMethod: message.operation,
          gatewayPath: message.relpath
        };
        var swaggerOrErrMsg = utils.removeEndpointFromSwaggerApi(swaggerApi, endpoint);
        if (typeof swaggerOrErrMsg === 'string' ) {
          return Promise.reject(swaggerOrErrMsg);
        }
        return utils.addApiToGateway(gwInfo, gwApi.tenantId, swaggerOrErrMsg, gwApi.id);
      }
    })
    .then(function() {
      console.log('deleteApi success');
      return Promise.resolve(utils2.makeResponseObject({}, calledAsWebAction));
    })
    .catch(function(reason) {
      var rejmsg = 'API deletion failure: ' + JSON.parse(utils2.makeJsonString(reason)); // Avoid unnecessary JSON escapes
      console.error(rejmsg);
      return Promise.reject(utils2.makeErrorResponseObject(rejmsg, calledAsWebAction));
    });
  }
}