Refactor member service; Remove logic in functions that were never used

This commit is contained in:
Blade Barringer
2015-07-17 08:43:37 -05:00
parent 6525cd6f8c
commit a9757c9dbb
3 changed files with 95 additions and 94 deletions

View File

@@ -8,30 +8,59 @@ describe('memberServices', function() {
members = Members; members = Members;
})); }));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('has no members at the beginning', function() { it('has no members at the beginning', function() {
expect(members.members).to.be.an('object'); expect(members.members).to.be.an('object');
expect(members.members).to.eql({}); expect(members.members).to.eql({});
expect(members.selectedMember).to.be.undefined; expect(members.selectedMember).to.be.undefined;
}); });
it('populates members', function(){ describe('addToMembersList', function() {
var uid = 'abc'; it('adds member to members object', function() {
members.populate({ var member = { _id: 'user_id' };
members: [{ _id: uid }] members.addToMembersList(member);
}); expect(members.members).to.eql({
expect(members.members).to.eql({ user_id: { _id: 'user_id' }
abc: { _id: uid } });
}); });
}); });
it('selects a member', function(){ describe('selectMember', function() {
var uid = 'abc'; it('fetches member if not already in cache', function() {
$httpBackend.expectGET('/api/v2/members/' + uid).respond({ _id: uid }); var uid = 'abc';
members.selectMember(uid, function(){}); $httpBackend.expectGET('/api/v2/members/' + uid).respond({ _id: uid });
$httpBackend.flush(); members.selectMember(uid, function(){});
$httpBackend.flush();
expect(members.selectedMember._id).to.eql(uid); expect(members.selectedMember._id).to.eql(uid);
expect(members.members).to.have.property(uid); expect(members.members).to.have.property(uid);
});
it('fetches member if member data in cache is incomplete', function() {
var uid = 'abc';
members.members = {
abc: { _id: 'abc', items: {} }
}
$httpBackend.expectGET('/api/v2/members/' + uid).respond({ _id: uid });
members.selectMember(uid, function(){});
$httpBackend.flush();
expect(members.selectedMember._id).to.eql(uid);
expect(members.members).to.have.property(uid);
});
it('gets member from cache if member has a weapons object', function() {
var uid = 'abc';
members.members[uid] = { _id: uid, items: { weapon: {} } };
members.selectMember(uid, function(){
expect(members.selectedMember._id).to.eql(uid);
expect(members.members).to.have.property(uid);
});
});
}); });
}); });

View File

@@ -1,87 +1,60 @@
'use strict'; 'use strict';
(function(){
angular
.module('habitrpg')
.factory('Members', membersFactory);
/** membersFactory.$inject = [
* Services that persists and retrieves user from localStorage. '$rootScope',
*/ 'Shared',
'ApiUrl',
'$resource'
];
angular.module('habitrpg').factory('Members', function membersFactory($rootScope, Shared, ApiUrl, $resource) {
['$rootScope', 'Shared', 'ApiUrl', '$resource', var members = {};
function($rootScope, Shared, ApiUrl, $resource) { var fetchMember = $resource(ApiUrl.get() + '/api/v2/members/:uid', { uid: '@_id' }).get;
var members = {};
var Member = $resource(ApiUrl.get() + '/api/v2/members/:uid', {uid:'@_id'});
var memberServices = {
Member: Member, function selectMember(uid, cb) {
members: members,
/**
* Allows us to lazy-load party / group / public members throughout the application.
* @param obj - either a group or an individual member. If it's a group, we lazy-load all of its members.
*/
populate: function(obj){
function populateGroup(group){
_.each(group.members, function(member){
// meaning `populate('members')` wasn't run on the server, so we're getting the "in-database" form of
// the members array, which is just a list of IDs - not the populated objects
if (_.isString(member)) return;
// lazy-load
members[member._id] = member;
})
}
// Array of groups
if (_.isArray(obj)) {
if (obj[0] && obj[0].members) {
_.each(obj, function(group){
populateGroup(group);
})
}
// Individual Group
} else if (obj.members)
populateGroup(obj);
// individual Member
if (obj._id) {
members[obj._id] = obj;
}
},
selectedMember: undefined,
/**
* Once users are populated, we fetch them throughout the application (eg, modals). This
* either gets them or fetches if not available
* @param uid
*/
selectMember: function(uid, cb) {
var self = this; var self = this;
// Fetch from cache if we can. For guild members, only their uname will have been fetched on initial load, var memberIsReady = _checkIfMemberIsReady(members[uid]);
// check if they have full fields (eg, check profile.items and an item inside
// because sometimes profile.items exists but it's empty like when user is fetched for party if (memberIsReady) {
// and then for guild) _prepareMember(self, members[uid], cb);
// and if not, fetch them
if (members[uid] && members[uid].items && members[uid].items.weapon) {
Shared.wrap(members[uid],false);
self.selectedMember = members[uid];
cb();
} else { } else {
Member.get({uid: uid}, function(member){ fetchMember({ uid: uid }, function(member) {
self.populate(member); // lazy load for later addToMembersList(member); // lazy load for later
Shared.wrap(member,false); _prepareMember(self, member, cb);
self.selectedMember = members[member._id];
cb();
}); });
} }
} }
function addToMembersList(member){
if (member._id) {
members[member._id] = member;
}
}
function _checkIfMemberIsReady(member) {
return member && member.items && member.items.weapon;
}
function _prepareMember(self, member, cb) {
Shared.wrap(member, false);
self.selectedMember = members[member._id];
cb();
}
$rootScope.$on('userUpdated', function(event, user){
populate(user);
})
return {
members: members,
addToMembersList: addToMembersList,
selectedMember: undefined,
selectMember: selectMember
}
} }
}());
$rootScope.$on('userUpdated', function(event, user){
memberServices.populate(user);
})
return memberServices;
}]);

View File

@@ -1,6 +1,5 @@
/** 'use strict';
* Created by Sabe on 7/7/2015.
*/
(function(){ (function(){
angular angular
.module('habitrpg') .module('habitrpg')