ghost
Version:
The professional publishing platform
120 lines (100 loc) • 2.98 kB
JavaScript
const _ = require('lodash');
const debug = require('@tryghost/debug')('api:endpoints:utils:serializers:input:members');
const mapNQLKeyValues = require('@tryghost/nql').utils.mapKeyValues;
function defaultRelations(frame) {
if (frame.options.withRelated) {
return;
}
if (frame.options.columns && !frame.options.withRelated) {
return false;
}
frame.options.withRelated = ['labels'];
}
// @TODO: move this into the member repository in members-api
function mapSubscribedFlagToNewsletterRelation(frame) {
frame.options.mongoTransformer = mapNQLKeyValues({
key: {
from: 'subscribed',
to: 'newsletters.status'
},
values: [{
from: true,
to: 'active'
}, {
from: false,
to: {$ne: 'active'}
}]
});
}
module.exports = {
all(_apiConfig, frame) {
if (!frame.options.withRelated) {
return;
}
frame.options.withRelated = frame.options.withRelated.map((relation) => {
if (relation === 'tiers') {
return 'products';
}
return relation;
});
},
browse(apiConfig, frame) {
debug('browse');
defaultRelations(frame);
mapSubscribedFlagToNewsletterRelation(frame);
if (!frame.options.order) {
frame.options.autoOrder = 'created_at DESC, id DESC';
}
},
read() {
debug('read');
this.browse(...arguments);
},
exportCSV() {
debug('exportCSV');
this.browse(...arguments);
},
add(apiConfig, frame) {
debug('add');
if (frame.data.members[0].labels) {
frame.data.members[0].labels.forEach((label, index) => {
if (_.isString(label)) {
frame.data.members[0].labels[index] = {
name: label
};
}
});
}
if (frame.data.members[0].tiers) {
frame.data.members[0].products = frame.data.members[0].tiers;
}
defaultRelations(frame);
},
edit(apiConfig, frame) {
debug('edit');
this.add(apiConfig, frame);
},
async importCSV(apiConfig, frame) {
debug('importCSV');
if (!frame.data.labels) {
frame.data.labels = [];
return;
}
if (typeof frame.data.labels === 'string') {
frame.data.labels = [{name: frame.data.labels}];
return;
}
if (Array.isArray(frame.data.labels)) {
frame.data.labels = frame.data.labels.map(name => ({name}));
return;
}
},
bulkEdit(apiConfig, frame) {
debug('bulkEdit');
mapSubscribedFlagToNewsletterRelation(frame);
},
bulkDestroy(apiConfig, frame) {
debug('bulkDestroy');
mapSubscribedFlagToNewsletterRelation(frame);
}
};