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;
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('has no members at the beginning', function() {
expect(members.members).to.be.an('object');
expect(members.members).to.eql({});
expect(members.selectedMember).to.be.undefined;
});
it('populates members', function(){
var uid = 'abc';
members.populate({
members: [{ _id: uid }]
});
expect(members.members).to.eql({
abc: { _id: uid }
describe('addToMembersList', function() {
it('adds member to members object', function() {
var member = { _id: 'user_id' };
members.addToMembersList(member);
expect(members.members).to.eql({
user_id: { _id: 'user_id' }
});
});
});
it('selects a member', function(){
var uid = 'abc';
$httpBackend.expectGET('/api/v2/members/' + uid).respond({ _id: uid });
members.selectMember(uid, function(){});
$httpBackend.flush();
describe('selectMember', function() {
it('fetches member if not already in cache', function() {
var uid = 'abc';
$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);
expect(members.selectedMember._id).to.eql(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';
(function(){
angular
.module('habitrpg')
.factory('Members', membersFactory);
/**
* Services that persists and retrieves user from localStorage.
*/
membersFactory.$inject = [
'$rootScope',
'Shared',
'ApiUrl',
'$resource'
];
angular.module('habitrpg').factory('Members',
['$rootScope', 'Shared', 'ApiUrl', '$resource',
function($rootScope, Shared, ApiUrl, $resource) {
var members = {};
var Member = $resource(ApiUrl.get() + '/api/v2/members/:uid', {uid:'@_id'});
var memberServices = {
function membersFactory($rootScope, Shared, ApiUrl, $resource) {
var members = {};
var fetchMember = $resource(ApiUrl.get() + '/api/v2/members/:uid', { uid: '@_id' }).get;
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;
// Fetch from cache if we can. For guild members, only their uname will have been fetched on initial load,
// 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
// and then for guild)
// 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();
var memberIsReady = _checkIfMemberIsReady(members[uid]);
if (memberIsReady) {
_prepareMember(self, members[uid], cb);
} else {
Member.get({uid: uid}, function(member){
self.populate(member); // lazy load for later
Shared.wrap(member,false);
self.selectedMember = members[member._id];
cb();
fetchMember({ uid: uid }, function(member) {
addToMembersList(member); // lazy load for later
_prepareMember(self, member, 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 @@
/**
* Created by Sabe on 7/7/2015.
*/
'use strict';
(function(){
angular
.module('habitrpg')