ldsorg
Version:
A JavaScript library for accessing LDS.org with Node.js or a browser
479 lines (414 loc) • 13.2 kB
JavaScript
/*jshint -W054 */
;(function (exports) {
'use strict';
exports.LdsOrgWard = { init: function (LdsOrg) {
function LdsWard(opts, ldsOrg, ldsStake) {
var me = this
, cacheOpts = {}
;
if (!(me instanceof LdsWard)) {
return new LdsWard(opts, ldsOrg, ldsStake);
}
me._ldsOrg = ldsOrg;
me._ldsStake = ldsStake;
me._wardUnitNo = opts.wardUnitNo;
me._wardOpts = opts;
me._meta = ldsOrg.wards[opts.wardUnitNo];
me._emit = ldsOrg._emit;
Object.keys(ldsOrg._cacheOpts).forEach(function (key) {
cacheOpts[key] = ldsOrg._cacheOpts[key];
});
cacheOpts.ldsOrg = ldsOrg;
cacheOpts.ldsStake = ldsStake;
cacheOpts.ldsWard = me;
me._store = me._ldsOrg._Cache.create(cacheOpts, cacheOpts);
}
LdsWard.create = LdsWard;
var ldsWardP = LdsWard.prototype
, Join = exports.Join || require('join').Join
, Lateral = exports.Lateral || require('lateral').Lateral
, nThreads = 10
;
ldsWardP.init = function (cb) {
var me = this
;
me._store.init(cb);
};
//
// Ward Core
//
ldsWardP.getMemberList = function (fn) {
var me = this
;
me._emit('wardMemberListInit');
LdsOrg._getJSON(
function (err, list) {
me._emit('wardMemberList', list);
fn(list);
}
, { url: LdsOrg.getMemberListUrl(me._wardUnitNo)
, store: me._store
, cacheId: 'member-list'
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me }
);
};
ldsWardP.getPhotoList = function (fn) {
var me = this
;
me._emit('wardPhotoDirectoryInit');
LdsOrg._getJSON(
function (err, list) {
me._emit('wardPhotoDirectory', list);
fn(list);
}
, { url: LdsOrg.getPhotosUrl(me._wardUnitNo)
, store: me._store
, cacheId: 'photo-list'
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me }
);
};
ldsWardP.getOrganization = function (fn, orgname) {
var me = this
, orgnameL = orgname.toLowerCase()
;
me._emit('wardOrganizationInit', me._wardUnitNo, orgname.toLowerCase());
LdsOrg._getJSON(
function (err, orgs) {
me._emit('wardOrganization', me._wardUnitNo, orgnameL, orgs);
fn(orgs);
}
, { url: LdsOrg.getWardOrganizationUrl(me._wardUnitNo, orgname)
, store: me._store
, cacheId: orgnameL
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me }
);
};
ldsWardP.getPositions = function (fn) {
var me = this
;
me._emit('wardPositionsInit', me._wardUnitNo);
LdsOrg._getJSON(
function (err, positionsWrapped) {
me._emit('wardPositions', me._wardUnitNo, positionsWrapped);
fn(positionsWrapped);
}
, { url: LdsOrg.getWardLeadershipPositionsUrl(me._wardUnitNo)
, store: me._store
, cacheId: 'positions'
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me }
);
};
ldsWardP.getLeadership = function (fn, group) {
var me = this
;
me._emit('wardLeadershipInit', me._wardUnitNo, group.groupName);
LdsOrg._getJSON(
function (err, leadershipWrapped) {
me._emit('wardLeadership', me._wardUnitNo, group.groupName, leadershipWrapped);
fn(leadershipWrapped);
}
, { url: LdsOrg.getWardLeadershipGroupUrl(me._wardUnitNo, group.groupKey, group.instance)
, store: me._store
, cacheId: 'leadership-' + group.groupName
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me }
);
};
//
// Ward Composite
//
ldsWardP.getHouseholdWithPhotos = function (fn, profileOrId, opts) {
opts = opts || {};
var join = Join.create()
, me = this
, id
;
id = profileOrId.householdId || profileOrId.id || profileOrId;
me.getHousehold(function (profile) {
if (!opts.noFamilyPhoto) {
me.getHouseholdPhoto(join.add(), id, opts);
}
if (!opts.noIndividualPhoto) {
me.getIndividualPhoto(join.add(), id, opts);
}
join.then(function (famArgs, indArgs) {
me._emit('householdEnd', profile);
profile.headOfHousehold.imageData = famArgs[0];
profile.householdInfo.imageData = indArgs[0];
fn(profile);
});
}, id);
};
ldsWardP.getOrganizations = function (fn, orgnames) {
var me = this
, id = me._wardUnitNo
, orgs = {}
;
if (!Array.isArray(orgnames)) {
orgnames = LdsOrg._organizations.slice(0);
}
me._emit('wardOrganizationsInit', id, orgnames);
function gotAllOrgs() {
me._emit('wardOrganizations', id, orgs);
fn(orgs);
}
Lateral.create(function (next, orgname) {
// UPPER_UNDERSCORE to camelCase
var orgnameL = orgname
.toLowerCase()
.replace(/(_[a-z])/g, function($1){
return $1.toUpperCase().replace('_','');
});
me.getOrganization(function (members) {
members.organizationName = orgnameL;
orgs[orgnameL] = members;
next();
}, orgname);
}, nThreads).add(orgnames).then(gotAllOrgs);
};
ldsWardP.getCallings = function (fn) {
var me = this
;
me._emit('wardCallingsInit', me._wardUnitNo);
me.getPositions(function (_positions) {
var positions = _positions.unitLeadership || _positions.wardLeadership
, groups = []
;
function gotAllCallings() {
me._emit('wardCallings', me._wardUnitNo, groups);
fn(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);
});
};
ldsWardP.getHouseholds = function (fn, _households, opts) {
_households = LdsOrg.mapIds(_households, 'householdId');
var me = this
, households = []
;
me._emit('householdsInit', _households);
function gotOneHousehold(next, household) {
me.getHouseholdWithPhotos(function (_household) {
households.push(_household);
next();
}, household, opts);
}
Lateral.create(gotOneHousehold, nThreads).add(_households).then(function () {
me._emit('households', _households);
fn(households);
});
};
ldsWardP.getRoster = function (fn, opts) {
var me = this
, id = me._wardUnitNo
, roster = []
, photoMap = {}
, memberMap = {}
, join = Join.create()
, listJ = join.add()
, photoJ = join.add()
;
me._emit('wardRosterInit');
me.getMemberList(function (list) {
listJ(null, list);
}, id);
me.getPhotoList(function (photos) {
photoJ(null, photos);
}, id);
join.then(function (memberListArgs, photoListArgs) {
var memberList = memberListArgs[1]
, photoList = photoListArgs[1]
;
photoList.forEach(function (_photo) {
photoMap[_photo.householdId] = _photo;
});
memberList.forEach(function (_member) {
memberMap[_member.headOfHouseIndividualId] = _member;
});
photoList.forEach(function (_photo) {
var member
, photo
;
photo = JSON.parse(JSON.stringify(_photo));
if (!memberMap[_photo.householdId]) {
roster.push(photo);
return;
}
member = JSON.parse(JSON.stringify(memberMap[_photo.householdId]));
// householdId
// householdPhotoName
// phoneNumber
// photoUrl
member.householdPhotoName = photo.householdName;
delete photo.householdName;
Object.keys(photo).forEach(function (key) {
if (member[key]) {
console.warn("member profile now includes '" + key + "', not overwriting");
} else {
member[key] = photo[key];
}
});
roster.push(member);
});
me._emit('wardRoster', roster);
me.getHouseholds(fn, roster, opts);
});
};
ldsWardP.getAll = function (fn, opts) {
opts = opts || {};
var me = this
, id = me._wardUnitNo
, join = Join.create()
, listJ = join.add()
, photoJ = join.add()
, orgsJ = join.add()
, callsJ = join.add()
;
me._emit('wardInit', id);
function onResult(ward) {
me._emit('ward', id, ward);
me._emit('wardEnd', id);
fn(ward);
}
me.getOrganizations(function (orgs) {
orgsJ(null, orgs);
});
me.getCallings(function (callings) {
callsJ(null, callings);
});
me.getMemberList(function (list) {
listJ(null, list);
}, id);
me.getPhotoList(function (photos) {
photoJ(null, photos);
}, id);
join.then(function (memberListArgs, photoListArgs, orgsArgs, callsArgs) {
var memberList = memberListArgs[1]
, photoList = photoListArgs[1]
, organizations = orgsArgs[1]
, callings = callsArgs[1]
;
function sendStuff(households) {
onResult({
ward: me._meta
, members: memberList
, photos: photoList
, organizations: organizations
, callings: callings
, households: households
});
}
if (false === opts.fullHouseholds) {
sendStuff();
} else {
me.getRoster(sendStuff, opts);
}
});
};
// Composite
// Methods (individuals)
ldsWardP.getHousehold = function (fn, profileOrId) {
// this is the only place to get email addresses for members without callings
var me = this
, id
, profileId
;
id = profileOrId.householdId || profileOrId.id || profileOrId;
profileId = 'profile-' + id;
me._emit('householdInit', id);
LdsOrg._getJSON(
function (err, profile) {
if (err) {
console.error('[ERROR] getHousehold');
console.error(profileOrId);
console.error(err);
fn();
return;
}
me._emit('household', profile);
me._emit('householdEnd', profile);
fn(profile);
}
, { url: LdsOrg.getHouseholdUrl(id)
, store: me._store
, cacheId: 'household-' + id
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me, member: id }
);
};
ldsWardP.getHouseholdPhoto = function (fn, id, opts) {
var me = this
, size = opts.size || 'medium'
;
me.getHousehold(function (profile) {
if (!profile.householdInfo.photoUrl) {
fn();
return;
}
LdsOrg._getImage(
function (err, dataUrl) {
fn(dataUrl);
}
, { cacheId: 'household-' + id + '-' + size + '.jpg'
, store: me._store
, url: profile.householdInfo.photoUrl
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me, member: id }
);
}, id);
};
ldsWardP.getIndividualPhoto = function (fn, id, opts) {
var me = this
, size = opts.size || 'medium'
;
me.getHousehold(function (profile) {
if (!profile.headOfHousehold.photoUrl) {
fn();
return;
}
LdsOrg._getImage(
function (err, dataUrl) {
fn(dataUrl);
}
, { cacheId: 'individual-' + id + '-' + size + '.jpg'
, store: me._store
, url: profile.headOfHousehold.photoUrl
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me, member: id }
);
}, id);
};
ldsWardP.getHouseholdPhotoByUrl = function (fn, id, photoUrl, size) {
size = size || 'medium';
var me = this
;
LdsOrg._getImage(
function (err, dataUrl) {
fn(dataUrl);
}
, { cacheId: 'household-' + id + '-' + size + '.jpg'
, store: me._store
, url: photoUrl
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me, member: id }
);
};
ldsWardP.getIndividualPhotoByUrl = function (fn, id, photoUrl, size) {
size = size || 'medium';
var me = this
;
LdsOrg._getImage(
function (err, dataUrl) {
fn(dataUrl);
}
, { cacheId: 'individual-' + id + '-' + size + '.jpg'
, store: me._store
, url: photoUrl
, ldsOrg: me._ldsOrg, ldsStake: me._ldsStake, ldsWard: me, member: id }
);
};
return LdsWard;
}};
}('undefined' !== typeof exports && exports || new Function('return this')()));