}, function (err) {
            if (err)
                return callback(err);
            if (!consumerData.next) // no next link --> we're done
                return callback(null);

            // Continue with next batch; get fresh, as we deleted the other ones.
            wipeConsumerBatch(consumerUrl, callback);
        });
 utils.kongGetConsumerByName(username, function (err, kongConsumer) {
     if (err) {
         // Gracefully accept if already deleted
         if (err.status === 404) {
             warn(`Attempted to delete non-present consumer with username ${username}`);
             return callback(null);
         }
         return callback(err);
     }
     info(`Deleting consumer with username ${username} (id ${kongConsumer.id})`);
     utils.kongDeleteConsumer(kongConsumer.id, callback);
 });
        }, function (err, results) {
            if (err)
                return done(err);
            const portalApis = results.portalApis as ApiDescriptionCollection;
            const kongApis = results.kongApis as KongApiConfigCollection;

            const todoLists = assembleApiTodoLists(portalApis, kongApis);
            debug('Infos on sync APIs todo list:');
            debug('  add items: ' + todoLists.addList.length);
            debug('  update items: ' + todoLists.updateList.length);
            debug('  delete items: ' + todoLists.deleteList.length);
            //debug(utils.getText(todoLists));

            async.series({
                updateApis: function (callback) {
                    // Will call syncPlugins
                    kong.updateKongApis(sync, todoLists.updateList, callback);
                },
                deleteApis: function (callback) {
                    kong.deleteKongApis(todoLists.deleteList, callback);
                },
                addApis: function (callback) {
                    kong.addKongApis(todoLists.addList, callback);
                }
            }, function (err) {
                if (err)
                    return done(err);
                debug("syncApis() finished.");
                return done(null);
            });
        });
 utils.kongGetConsumersByCustomId(customId, function (err, consumerList) {
     if (err)
         return callback(err);
     // Gracefully accept if already deleted
     if (consumerList.data.length <= 0) {
         warn('Could not find user with custom_id ' + customId + ', cannot delete');
         return callback(null);
     }
     if (consumerList.data.length > 1)
         warn('Multiple consumers with custom_id ' + customId + ' found, killing them all.');
     // This should be just one call, but the consumer is in an array, so this does not hurt.
     info(`Deleting consumers with custom ID ${customId}`);
     async.map(consumerList.data, (consumer, callback) => utils.kongDeleteConsumer(consumer.id, callback), function (err, results) {
         if (err)
             return callback(err);
         callback(null);
     });
 });
 kongGetRouteForService(apiId, function (err, route) {
     if (err)
         return callback(err);
     kongDeleteRoute(route.id, function (err) {
         if (err)
             return callback(err);
         kongDeleteService(apiId, callback);
     })
 });
 kong.getKongConsumers(portalConsumers, function (err, resultConsumers) {
     if (err)
         return callback(err);
     const kongConsumers = [] as ConsumerInfo[];
     for (let i = 0; i < resultConsumers.length; ++i) {
         if (resultConsumers[i])
             kongConsumers.push(resultConsumers[i]);
     }
     syncConsumers(portalConsumers, kongConsumers, callback);
 });
function updateKongConsumer(portalConsumer: ConsumerInfo, kongConsumer: ConsumerInfo, callback: ErrorCallback) {
    // The only thing which may differ here is the custom_id
    if (portalConsumer.consumer.custom_id === kongConsumer.consumer.custom_id) {
        debug('Custom ID for consumer username ' + portalConsumer.consumer.username + ' matches: ' + portalConsumer.consumer.custom_id);
        return callback(null); // Nothing to do.
    }
    info('Updating consumer ' + kongConsumer.consumer.id + ' (username ' + kongConsumer.consumer.username + ') with new custom_id: ' + portalConsumer.consumer.custom_id);
    utils.kongPatchConsumer(kongConsumer.consumer.id, {
        custom_id: portalConsumer.consumer.custom_id
    }, callback);
}
    utils.kongGetRaw(consumerUrl, function (err, consumerData: KongCollection<KongConsumer>) {
        if (err)
            return callback(err);
        async.mapSeries(consumerData.data, function (consumer, callback) {
            utils.kongDeleteConsumer(consumer.id, callback);
        }, function (err) {
            if (err)
                return callback(err);
            if (!consumerData.next) // no next link --> we're done
                return callback(null);

            // Continue with next batch; get fresh, as we deleted the other ones.
            wipeConsumerBatch(consumerUrl, callback);
        });
    });
 }, function (err) {
     if (err)
         return callback(err);
     debug("updateKongConsumerPlugins() finished.");
     callback(null);
 });
 ], function (err) {
     if (err)
         return callback(err);
     return callback(null);
 });