From f484bd0f6d9c7a2038b36c6ef2145fe16fbe716f Mon Sep 17 00:00:00 2001 From: thejsj Date: Sun, 21 Aug 2016 21:43:11 -0700 Subject: [PATCH 1/4] Add script to clean up creating Stripe customers --- scripts/clean-up-stripe-customers.js | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 scripts/clean-up-stripe-customers.js diff --git a/scripts/clean-up-stripe-customers.js b/scripts/clean-up-stripe-customers.js new file mode 100644 index 0000000..3b03ee6 --- /dev/null +++ b/scripts/clean-up-stripe-customers.js @@ -0,0 +1,39 @@ +'use strict' + +'use strict' +require('loadenv')() + +const Promise = require('bluebird') + +const logger = require('util/logger').child({ module: 'scripts/migrage-organizations' }) +const bigPoppa = require('util/big-poppa') +const stripeClient = require('util/stripe').stripeClient +const log = require('util/logger').child({ module: 'scripts/clean-up-stripe-customers' }) + +const fetchAndDeleteCustomers = (orgIds) => { + log.trace({ orgIds: orgIds }, 'Fetch customers from Stripe') + return stripeClient.customers.list({ limit: 100 }) + .then(customers => { + let customersNotInBigPoppa = customers.filter(customer => !orgIds.includes(customer.id)) + log.trace({ customersNotInBigPoppa: customersNotInBigPoppa }, 'Filter customer that are not in Big Poppa') + if (customersNotInBigPoppa.length > 0) { + return Promise.map(customersNotInBigPoppa, c => stripeClient.customers.del(c.id)) + .then(() => fetchAndDeleteCustomers(orgIds)) + } + return null + }) +} + +Promise.resolve() + .then(function getAllOrgs () { + logger.info('getAllOrgs') + return bigPoppa.getOrganizations({}) + }) + .then(function getAllOrgStripeCustomerIds (orgs) { + logger.info('Map all organizations to get stripeCustomerId') + return orgs.map(x => x.stripeCustomerId) + }) + .then(function fetchAndDeleteCustomers (orgIds) { + log.trace('Call fetchAndDeleteCustomers') + return fetchAndDeleteCustomers(orgIds) + }) From a9f7fb36f659df897d6a2b62e0309b823e63ad3e Mon Sep 17 00:00:00 2001 From: thejsj Date: Sun, 21 Aug 2016 22:22:02 -0700 Subject: [PATCH 2/4] Clean up script --- scripts/clean-up-stripe-customers.js | 29 +++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/scripts/clean-up-stripe-customers.js b/scripts/clean-up-stripe-customers.js index 3b03ee6..1fb915e 100644 --- a/scripts/clean-up-stripe-customers.js +++ b/scripts/clean-up-stripe-customers.js @@ -1,5 +1,3 @@ -'use strict' - 'use strict' require('loadenv')() @@ -10,14 +8,23 @@ const bigPoppa = require('util/big-poppa') const stripeClient = require('util/stripe').stripeClient const log = require('util/logger').child({ module: 'scripts/clean-up-stripe-customers' }) +const isDryRun = process.env.DRY_RUN + const fetchAndDeleteCustomers = (orgIds) => { log.trace({ orgIds: orgIds }, 'Fetch customers from Stripe') return stripeClient.customers.list({ limit: 100 }) - .then(customers => { - let customersNotInBigPoppa = customers.filter(customer => !orgIds.includes(customer.id)) - log.trace({ customersNotInBigPoppa: customersNotInBigPoppa }, 'Filter customer that are not in Big Poppa') + .then(res => { + log.trace({ res: res }, 'Response from Stripe') + let customers = res.data + + let customersNotInBigPoppa = customers.filter(customer => orgIds.indexOf(customer.id) === -1) + log.trace({ numberOfcustomersNotInBigPoppa: customersNotInBigPoppa.length }, 'Filter customer that are not in Big Poppa') if (customersNotInBigPoppa.length > 0) { - return Promise.map(customersNotInBigPoppa, c => stripeClient.customers.del(c.id)) + return Promise.map(customersNotInBigPoppa, customer => { + log.trace({ customer: customer }, 'Deleting Stripe Customer') + if (isDryRun) return null + return stripeClient.customers.del(customer.id) + }) .then(() => fetchAndDeleteCustomers(orgIds)) } return null @@ -30,10 +37,10 @@ Promise.resolve() return bigPoppa.getOrganizations({}) }) .then(function getAllOrgStripeCustomerIds (orgs) { - logger.info('Map all organizations to get stripeCustomerId') - return orgs.map(x => x.stripeCustomerId) - }) - .then(function fetchAndDeleteCustomers (orgIds) { - log.trace('Call fetchAndDeleteCustomers') + logger.info({ numberOfOrgs: orgs.length }, 'Map all organizations to get stripeCustomerId') + let orgIds = orgs.map(x => x.stripeCustomerId).filter(x => !!x) + log.trace({ orgIds: orgIds }, 'Call fetchAndDeleteCustomers') return fetchAndDeleteCustomers(orgIds) }) + .catch(err => log.error({ err: err }, 'Error')) + .finally(process.exit) From 7c1655a1c2add18b38eef96ccc7200041d56b154 Mon Sep 17 00:00:00 2001 From: thejsj Date: Wed, 24 Aug 2016 14:57:07 -0700 Subject: [PATCH 3/4] Fix script to fetch all Stripe customers --- package.json | 3 ++- scripts/clean-up-stripe-customers.js | 36 +++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 9363e30..7cad08f 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "test-integration": "NODE_PATH=./lib NODE_ENV=test mocha --recursive test/integration", "start-worker": "NODE_PATH=./lib node lib/workers", "start-http": "NODE_PATH=./lib node lib/http", - "migrate-organizations": "NODE_PATH=./lib node scripts/migrate-organizations" + "migrate-organizations": "NODE_PATH=./lib node scripts/migrate-organizations", + "clean-up-unused-stripe-customers": "NODE_PATH=./lib node scripts/clean-up-stripe-customers" }, "repository": { "type": "git", diff --git a/scripts/clean-up-stripe-customers.js b/scripts/clean-up-stripe-customers.js index 1fb915e..5aaad25 100644 --- a/scripts/clean-up-stripe-customers.js +++ b/scripts/clean-up-stripe-customers.js @@ -10,15 +10,36 @@ const log = require('util/logger').child({ module: 'scripts/clean-up-stripe-cust const isDryRun = process.env.DRY_RUN +const getAllStripeCustomers = () => { + let allCustomers = [] + + const _getAllStripeCustomers = (lastCustomerId) => { + return stripeClient.customers.list({ limit: 10, starting_after: lastCustomerId }) + .then(res => { + allCustomers = allCustomers.concat(res.data) + if (res.has_more) { + let lastCustomerId = res.data[res.data.length - 1].id + return _getAllStripeCustomers(lastCustomerId) + } + return + }) + } + return _getAllStripeCustomers() + .return(allCustomers) +} + const fetchAndDeleteCustomers = (orgIds) => { log.trace({ orgIds: orgIds }, 'Fetch customers from Stripe') - return stripeClient.customers.list({ limit: 100 }) - .then(res => { - log.trace({ res: res }, 'Response from Stripe') - let customers = res.data + return getAllStripeCustomers() + .then(customers => { + log.trace({ customers: customers.length }, 'Response from Stripe') let customersNotInBigPoppa = customers.filter(customer => orgIds.indexOf(customer.id) === -1) - log.trace({ numberOfcustomersNotInBigPoppa: customersNotInBigPoppa.length }, 'Filter customer that are not in Big Poppa') + log.trace({ + numberOfcustomersNotInBigPoppa: customersNotInBigPoppa.length, + customers: customers.length, + orgIds: orgIds.length + }, 'Filter customer that are not in Big Poppa') if (customersNotInBigPoppa.length > 0) { return Promise.map(customersNotInBigPoppa, customer => { log.trace({ customer: customer }, 'Deleting Stripe Customer') @@ -43,4 +64,7 @@ Promise.resolve() return fetchAndDeleteCustomers(orgIds) }) .catch(err => log.error({ err: err }, 'Error')) - .finally(process.exit) + .finally(function () { + log.trace('Finished') + process.exit() + }) From 658343faa6ddf213ce88c41db5b4efbbe4f2c2d3 Mon Sep 17 00:00:00 2001 From: thejsj Date: Wed, 24 Aug 2016 16:04:54 -0700 Subject: [PATCH 4/4] Fixing script --- scripts/clean-up-stripe-customers.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/clean-up-stripe-customers.js b/scripts/clean-up-stripe-customers.js index 5aaad25..26c7f82 100644 --- a/scripts/clean-up-stripe-customers.js +++ b/scripts/clean-up-stripe-customers.js @@ -11,21 +11,31 @@ const log = require('util/logger').child({ module: 'scripts/clean-up-stripe-cust const isDryRun = process.env.DRY_RUN const getAllStripeCustomers = () => { + log.trace('getAllStripeCustomers call') let allCustomers = [] const _getAllStripeCustomers = (lastCustomerId) => { - return stripeClient.customers.list({ limit: 10, starting_after: lastCustomerId }) + log.trace('Fetch customers again') + let query = { limit: 10 } + if (lastCustomerId) { + query.starting_after = lastCustomerId + } + log.trace(query, 'Fetch customers again') + return stripeClient.customers.list(query) .then(res => { + log.trace({ dataLength: res.data.length }, 'Number of customers') allCustomers = allCustomers.concat(res.data) if (res.has_more) { + log.trace('Has more...') let lastCustomerId = res.data[res.data.length - 1].id return _getAllStripeCustomers(lastCustomerId) } + log.trace({ allCustomers: allCustomers.length }, 'Number of customers END') return }) } return _getAllStripeCustomers() - .return(allCustomers) + .then(() => allCustomers) } const fetchAndDeleteCustomers = (orgIds) => { @@ -67,4 +77,4 @@ Promise.resolve() .finally(function () { log.trace('Finished') process.exit() - }) + }