0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-03-11 02:12:21 -05:00

Added members CSV export to Admin API (#11198)

no issue
This commit is contained in:
Naz Gargol 2019-10-03 20:36:22 +02:00 committed by GitHub
parent bb355ac9f2
commit a4462c5753
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 114 additions and 4 deletions

View file

@ -128,6 +128,28 @@ const members = {
}
},
exportCSV: {
headers: {
disposition: {
type: 'csv',
value() {
const datetime = (new Date()).toJSON().substring(0, 10);
return `members.${datetime}.csv`;
}
}
},
response: {
format: 'plain'
},
permissions: {
method: 'browse'
},
validation: {},
query(frame) {
return membersService.api.members.list(frame.options);
}
},
importCSV: {
statusCode: 201,
permissions: {

View file

@ -38,6 +38,37 @@ module.exports = {
};
},
exportCSV(models, apiConfig, frame) {
debug('exportCSV');
const fields = ['id', 'email', 'name', 'created_at', 'deleted_at'];
function formatCSV(data) {
let csv = `${fields.join(',')}\r\n`,
entry,
field,
j,
i;
for (j = 0; j < data.length; j = j + 1) {
entry = data[j];
for (i = 0; i < fields.length; i = i + 1) {
field = fields[i];
csv += entry[field] !== null ? entry[field] : '';
if (i !== fields.length - 1) {
csv += ',';
}
}
csv += '\r\n';
}
return csv;
}
frame.response = formatCSV(models.members);
},
importCSV(data, apiConfig, frame) {
debug('importCSV');

View file

@ -128,6 +128,28 @@ const members = {
}
},
exportCSV: {
headers: {
disposition: {
type: 'csv',
value() {
const datetime = (new Date()).toJSON().substring(0, 10);
return `members.${datetime}.csv`;
}
}
},
response: {
format: 'plain'
},
permissions: {
method: 'browse'
},
validation: {},
query(frame) {
return membersService.api.members.list(frame.options);
}
},
importCSV: {
statusCode: 201,
permissions: {

View file

@ -38,6 +38,37 @@ module.exports = {
};
},
exportCSV(models, apiConfig, frame) {
debug('exportCSV');
const fields = ['id', 'email', 'name', 'created_at', 'deleted_at'];
function formatCSV(data) {
let csv = `${fields.join(',')}\r\n`,
entry,
field,
j,
i;
for (j = 0; j < data.length; j = j + 1) {
entry = data[j];
for (i = 0; i < fields.length; i = i + 1) {
field = fields[i];
csv += entry[field] !== null ? entry[field] : '';
if (i !== fields.length - 1) {
csv += ',';
}
}
csv += '\r\n';
}
return csv;
}
frame.response = formatCSV(models.members);
},
importCSV(data, apiConfig, frame) {
debug('importCSV');

View file

@ -105,6 +105,7 @@ module.exports = function apiRoutes() {
router.get('/members', shared.middlewares.labs.members, mw.authAdminApi, http(apiCanary.members.browse));
router.post('/members', shared.middlewares.labs.members, mw.authAdminApi, http(apiCanary.members.add));
router.get('/members/csv', shared.middlewares.labs.members, mw.authAdminApi, http(apiCanary.members.exportCSV));
router.post('/members/csv',
shared.middlewares.labs.members,
mw.authAdminApi,

View file

@ -105,6 +105,7 @@ module.exports = function apiRoutes() {
router.get('/members', shared.middlewares.labs.members, mw.authAdminApi, http(apiv2.members.browse));
router.post('/members', shared.middlewares.labs.members, mw.authAdminApi, http(apiv2.members.add));
router.get('/members/csv', shared.middlewares.labs.members, mw.authAdminApi, http(apiv2.members.exportCSV));
router.post('/members/csv',
shared.middlewares.labs.members,
mw.authAdminApi,

View file

@ -215,7 +215,7 @@ describe('Members API', function () {
});
});
it.skip('Can export CSV', function () {
it('Can export CSV', function () {
return request
.get(localUtils.API.getApiQuery(`members/csv/`))
.set('Origin', config.get('url'))
@ -225,8 +225,9 @@ describe('Members API', function () {
.then((res) => {
should.not.exist(res.headers['x-cache-invalidate']);
res.headers['content-disposition'].should.match(/Attachment;\sfilename="members/);
res.text.should.match(/id,email,created_at,deleted_at/);
res.text.should.match(/id,email,name,created_at,deleted_at/);
res.text.should.match(/member1@test.com/);
res.text.should.match(/Mr Egg/);
});
});

View file

@ -215,7 +215,7 @@ describe('Members API', function () {
});
});
it.skip('Can export CSV', function () {
it('Can export CSV', function () {
return request
.get(localUtils.API.getApiQuery(`members/csv/`))
.set('Origin', config.get('url'))
@ -225,8 +225,9 @@ describe('Members API', function () {
.then((res) => {
should.not.exist(res.headers['x-cache-invalidate']);
res.headers['content-disposition'].should.match(/Attachment;\sfilename="members/);
res.text.should.match(/id,email,created_at,deleted_at/);
res.text.should.match(/id,email,name,created_at,deleted_at/);
res.text.should.match(/member1@test.com/);
res.text.should.match(/Mr Egg/);
});
});