module.exports = function ({ subscriptions, createMember, updateMember, getMember, listMembers, deleteMember, validateMember, sendEmail, encodeToken, decodeToken }) { function requestPasswordReset({email}) { return getMember({email}, {require: true}).then((member) => { return encodeToken({ sub: member.id }).then((token) => { return sendEmail(member, {token}); }); }, (/*err*/) => { // Ignore user not found err; }); } function resetPassword({token, password}) { return decodeToken(token).then(({sub}) => { return updateMember({id: sub}, {password}); }); } function get(...args) { return getMember(...args).then((member) => { return subscriptions.getAdapters().then((adapters) => { return Promise.all(adapters.map((adapter) => { return subscriptions.getSubscription(member, { adapter }).then((subscription) => { return Object.assign(subscription, {adapter}); }); })); }).then((subscriptions) => { return Object.assign({}, member, { subscriptions: subscriptions.filter(sub => sub.status === 'active') }); }); }); } function destroy(...args) { return getMember(...args).then((member) => { if (!member) { return null; } return subscriptions.getAdapters().then((adapters) => { return Promise.all(adapters.map((adapter) => { return subscriptions.removeCustomer(member, { adapter }); })); }).then(() => { return deleteMember(...args); }); }); } return { requestPasswordReset, resetPassword, create: createMember, validate: validateMember, list: listMembers, destroy, get }; };