From f1bcb073a343aacf55201ecd130cc57a2c814a02 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Wed, 5 Jan 2022 12:21:52 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20incorrect=20automatic=20?= =?UTF-8?q?CSV=20download=20when=20bulk-deleting=20members?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/TryGhost/Team/issues/1265 - we were generating the correct query params for the export endpoint but those query params weren't applied to the export URL before fetching it meaning the default GET behaviour of listing first 15 members was always being used when generating the backup CSV --- ghost/admin/app/controllers/members.js | 2 +- ghost/admin/tests/acceptance/members-test.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ghost/admin/app/controllers/members.js b/ghost/admin/app/controllers/members.js index 5cbde7b73e..12806ae45d 100644 --- a/ghost/admin/app/controllers/members.js +++ b/ghost/admin/app/controllers/members.js @@ -428,9 +428,9 @@ export default class MembersController extends Controller { // needs to fetch the file and trigger a download directly rather than // via an iframe. The iframe approach can't tell us when a download has // started/finished meaning we could end up deleting the data before exporting it - const exportUrl = ghostPaths().url.api('members/upload'); const exportParams = new URLSearchParams(this.getApiQueryObject()); exportParams.set('limit', 'all'); + const exportUrl = `${ghostPaths().url.api('members/upload')}?${exportParams.toString()}`; yield fetch(exportUrl, {method: 'GET'}) .then(res => res.blob()) diff --git a/ghost/admin/tests/acceptance/members-test.js b/ghost/admin/tests/acceptance/members-test.js index 50f248e95e..86b0d1677c 100644 --- a/ghost/admin/tests/acceptance/members-test.js +++ b/ghost/admin/tests/acceptance/members-test.js @@ -180,10 +180,19 @@ describe('Acceptance: Members', function () { expect(find('[data-test-modal="delete-members"]')).to.exist; expect(find('[data-test-text="delete-count"]')).to.have.text('5 members'); + // ensure export endpoint gets hit with correct query params when deleting + let exportQueryParams; + this.server.get('/members/upload', (schema, request) => { + exportQueryParams = request.queryParams; + }); + await click('[data-test-button="confirm"]'); + expect(exportQueryParams).to.deep.equal({filter: 'label:[label-0]', limit: 'all'}); + expect(find('[data-test-text="deleted-count"]')).to.have.text('5 members'); expect(find('[data-test-button="confirm"]')).to.not.exist; + // members filter is reset // TODO: fix query params reset for empty strings expect(currentURL()).to.equal('/members?search=');