ldsorg
Version:
A JavaScript library for accessing LDS.org with Node.js or a browser
212 lines (181 loc) • 6.05 kB
JavaScript
/*jshint -W054 */
;(function (exports) {
'use strict';
var forAllAsync = exports.forAllAsync || require('forallasync').forAllAsync
, LdsOrgStake = { init: function (LdsOrg, LdsWard) {
function LdsStake(opts, ldsOrg) {
var me = this
, cacheOpts = {}
;
if (!(me instanceof LdsStake)) {
return new LdsStake(opts, ldsOrg);
}
me._ldsOrg = ldsOrg;
me._stakeOpts = opts;
me._stakeUnitNo = opts.stakeUnitNo;
me._meta = ldsOrg.stakes[opts.stakeUnitNo];
me._emit = ldsOrg._emit;
Object.keys(ldsOrg._cacheOpts).forEach(function (key) {
cacheOpts[key] = ldsOrg._cacheOpts[key];
});
cacheOpts.ldsOrg = ldsOrg;
cacheOpts.ldsStake = me;
me._store = me._ldsOrg._Cache.create(cacheOpts, cacheOpts);
}
LdsStake.create = LdsStake;
var ldsStakeP = LdsStake.prototype
, Lateral = exports.Lateral || require('lateral').Lateral
, nThreads = 10
;
LdsStake.prototype.init = function (cb) {
var me = this
;
me._store.init(cb);
};
// Methods
ldsStakeP.getPositions = function (fn) {
var me = this
;
me._emit('stakePositionsInit', me._stakeUnitNo);
LdsOrg._getJSON(
function (err, data) {
me._emit('stakePositions', me._stakeUnitNo, data);
fn(data);
}
, { url: LdsOrg.getStakeLeadershipPositionsUrl(me._stakeUnitNo)
, store: me._store
, cacheId: 'positions'
, ldsOrg: me._ldsOrg, ldsStake: me }
);
};
ldsStakeP.getLeadership = function (fn, group) {
var me = this
;
me._emit('stakeLeadershipInit', me._stakeUnitNo, group.groupName, group);
LdsOrg._getJSON(
function (err, leadershipWrapped) {
me._emit('stakeLeadership', me._stakeUnitNo, group.groupName, leadershipWrapped);
fn(leadershipWrapped);
}
, { url: LdsOrg.getStakeLeadershipGroupUrl(me._stakeUnitNo, group.groupKey, group.instance)
, store: me._store
, cacheId: 'leadership-' + group.groupName
, ldsOrg: me._ldsOrg, ldsStake: me }
);
};
ldsStakeP.getImages = function (fn, ids, sizes) {
sizes = sizes || ['medium']; // large, medium, thumbnail
var me = this
, url = LdsOrg.getIndividualPhotosUrl(ids)
, photos = {}
;
//me._emit('images', me._stakeUnitNo, ids);
LdsOrg._getJSON(
function (err, photoUrlMaps) {
forAllAsync(photoUrlMaps, function (n, photoUrls) {
photos[photoUrls.individualId] = {};
forAllAsync(sizes, function (next, size) {
var photoUrl = photoUrls[size + 'Uri']
;
if (!photoUrl) {
next();
return;
}
LdsOrg._getImage(
function (err, dataUrl) {
if (!err && dataUrl) {
photos[photoUrls.individualId][size] = dataUrl;
}
next();
}
, { cacheId: 'individual-' + photoUrls.individualId + '-' + size + '.jpg'
// TODO file cache large binaries and return buffer
, binary: size === 'large'
, store: me._store
, url: photoUrl
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, member: photoUrls.individualId }
);
LdsOrg._getImage();
}).then(n);
}).then(function () {
fn(photos);
});
}
, { url: url
, store: me._store
// no cache for image urls
, ldsOrg: me._ldsOrg, ldsStake: me }
);
};
//
// Stake
//
// TODO optionally include fresh pics
// (but always include phone from photos)
// TODO most of this logic should be moved to getHouseholds
ldsStakeP.getWard = function (wardUnitNo) {
var me = this
;
me._realWards = me._realWards || {};
if (!me._realWards[wardUnitNo]) {
me._realWards[wardUnitNo] = LdsWard.create({ wardUnitNo: wardUnitNo }, me._ldsOrg, me);
me._realWards[wardUnitNo].init(function () {});
}
return me._realWards[wardUnitNo];
};
// wardsOrIds can be an array or map of wards or ids
ldsStakeP.getWards = function (fn, wardsOrIds, opts) {
var me = this
, wards = []
;
function getOneWard(next, wardOrId) {
function addWard(ward) {
wards.push(ward);
next();
}
me.getWard(addWard, wardOrId, opts);
}
wardsOrIds = LdsOrg.toArray(wardsOrIds);
Lateral.create(getOneWard, nThreads).add(wardsOrIds).then(function () {
fn(wards);
});
};
ldsStakeP.getCurrentWard = function () {
var me = this
;
return me.getWard(me._ldsOrg.homeWardId);
};
//
// Stake
//
ldsStakeP.getAll = function (fn, opts) {
// TODO get pictures using the individual photos feature
// /photo/url/#{id_1},#{id_2},#{id_x}/individual
var me = this
;
me._emit('stakeCallingsInit');
me.getPositions(function (_positions) {
var positions = _positions.unitLeadership || _positions.stakeLeadership
, groups = []
;
function gotAllCallings() {
me._emit('stakeCallings');
fn({
stake: me._meta
, callings: groups
});
}
Lateral.create(function (next, group) {
me.getLeadership(function (list) {
group.leaders = list.leaders;
group.unitName = list.unitName;
groups.push(group);
next();
}, group);
}, nThreads).add(positions).then(gotAllCallings);
}, opts);
};
return LdsStake;
}};
exports.LdsOrgStake = LdsOrgStake.LdsOrgStake = LdsOrgStake;
}('undefined' !== typeof exports && exports || new Function('return this')()));