This commit is contained in:
Bernhard Posselt 2013-04-11 11:20:46 +02:00
Родитель bdb241340a
Коммит 50902e1c05
6 изменённых файлов: 276 добавлений и 37 удалений

Просмотреть файл

@ -25,10 +25,93 @@ angular.module('News').factory '_FolderModel',
class FolderModel extends _Model
constructor: ->
@_nameCache = {}
super()
nameExists: (folderName) ->
query = new _EqualQuery('name', folderName.trim(), true)
return @get(query).length > 0
add: (data, clearCache=true) ->
###
We want to add a folder on the client side before
we have an id from the server. Once the server returns
an id, we have to update the existing item without id
###
data.name = @_transformName(data.name)
item = @_nameCache[data.name]
# update in the following cases:
# * the id is defined and the item exists
# * the id is not defined and the name exists in the cache
updateById = angular.isDefined(data.id) and
angular.isDefined(@getById(data.id))
updateByName = angular.isDefined(item) and
angular.isUndefined(item.id)
if updateById or updateByName
@update(data)
else
# if the item is not yet in the name cache it must be added
@_nameCache[data.name] = data
# in case there is an id it can go through the normal add method
if angular.isDefined(data.id)
super(data, clearCache)
# if there is no id we just want it to appear in the list
else
@_data.push(data)
update: (data, clearCache=true) ->
# only when the id on the updated item does not exist we wish
# to update by name, otherwise we always update by id
data.name = @_transformName(data.name)
item = @_nameCache[data.name]
# update by name
if angular.isUndefined(data.id) and angular.isDefined(item)
angular.extend(item, data)
else
# this case happens when there exists an element with the same
# name but it has no id yet
if angular.isDefined(data.id) and
angular.isDefined(item) and
angular.isUndefined(item.id)
item.id = data.id
@_dataMap[data.id] = item
# if an update comes in and we update because of the id
# we need to fix the name cache if the name was changed
itemWithId = @getById(data.id)
if angular.isDefined(itemWithId) and itemWithId.name != data.name
delete @_nameCache[itemWithId.name]
@_nameCache[data.name] = itemWithId
super(data, clearCache)
getByName: (folderName) ->
folderName = @_transformName(folderName)
return @_nameCache[folderName]
clear: ->
@_nameCache = {}
super()
removeById: (id, clearCache=true) ->
item = @getById(id)
delete @_nameCache[@_transformName(item.name)]
super(id, clearCache)
_transformName: (folderName) ->
return folderName.trim().toLowerCase()
return FolderModel

Просмотреть файл

@ -40,7 +40,6 @@ files = [
'../../appframework/js/public/app.js',
'tests/stubs/modules.js',
'build/app/directives/*.js',
'build/app/filters/*.js',
'build/app/services/**/*.js',
'build/app/controllers/**/*.js',
'build/tests/**/*Spec.js'

Просмотреть файл

@ -1347,21 +1347,91 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
angular.module('News').factory('_FolderModel', [
'_Model', '_EqualQuery', function(_Model, _EqualQuery) {
var FolderModel, _ref;
var FolderModel;
FolderModel = (function(_super) {
__extends(FolderModel, _super);
function FolderModel() {
_ref = FolderModel.__super__.constructor.apply(this, arguments);
return _ref;
this._nameCache = {};
FolderModel.__super__.constructor.call(this);
}
FolderModel.prototype.nameExists = function(folderName) {
var query;
FolderModel.prototype.add = function(data, clearCache) {
var item, updateById, updateByName;
query = new _EqualQuery('name', folderName.trim(), true);
return this.get(query).length > 0;
if (clearCache == null) {
clearCache = true;
}
/*
We want to add a folder on the client side before
we have an id from the server. Once the server returns
an id, we have to update the existing item without id
*/
data.name = this._transformName(data.name);
item = this._nameCache[data.name];
updateById = angular.isDefined(data.id) && angular.isDefined(this.getById(data.id));
updateByName = angular.isDefined(item) && angular.isUndefined(item.id);
if (updateById || updateByName) {
return this.update(data);
} else {
this._nameCache[data.name] = data;
if (angular.isDefined(data.id)) {
return FolderModel.__super__.add.call(this, data, clearCache);
} else {
return this._data.push(data);
}
}
};
FolderModel.prototype.update = function(data, clearCache) {
var item, itemWithId;
if (clearCache == null) {
clearCache = true;
}
data.name = this._transformName(data.name);
item = this._nameCache[data.name];
if (angular.isUndefined(data.id) && angular.isDefined(item)) {
return angular.extend(item, data);
} else {
if (angular.isDefined(data.id) && angular.isDefined(item) && angular.isUndefined(item.id)) {
item.id = data.id;
this._dataMap[data.id] = item;
}
itemWithId = this.getById(data.id);
if (angular.isDefined(itemWithId) && itemWithId.name !== data.name) {
delete this._nameCache[itemWithId.name];
this._nameCache[data.name] = itemWithId;
}
return FolderModel.__super__.update.call(this, data, clearCache);
}
};
FolderModel.prototype.getByName = function(folderName) {
folderName = this._transformName(folderName);
return this._nameCache[folderName];
};
FolderModel.prototype.clear = function() {
this._nameCache = {};
return FolderModel.__super__.clear.call(this);
};
FolderModel.prototype.removeById = function(id, clearCache) {
var item;
if (clearCache == null) {
clearCache = true;
}
item = this.getById(id);
delete this._nameCache[this._transformName(item.name)];
return FolderModel.__super__.removeById.call(this, id, clearCache);
};
FolderModel.prototype._transformName = function(folderName) {
return folderName.trim().toLowerCase();
};
return FolderModel;

Просмотреть файл

@ -57,7 +57,7 @@ describe 'FolderBl', ->
@persistence.openFolder = jasmine.createSpy('open')
@persistence.collapseFolder = jasmine.createSpy('collapse')
@FolderModel.add({id: 3, opened: false})
@FolderModel.add({id: 3, opened: false, name: 'ho'})
@FolderBl.toggleFolder(4)
expect(@FolderModel.getById(3).opened).toBeFalsy()
@ -122,8 +122,8 @@ describe 'FolderBl', ->
it 'should return all folders', =>
item1 = {id: 3, open: false}
item2 = {id: 4, open: true}
item1 = {id: 3, open: false, name: 'ho'}
item2 = {id: 4, open: true, name: 'hod'}
@FolderModel.add(item1)
@FolderModel.add(item2)
@ -131,7 +131,7 @@ describe 'FolderBl', ->
expect(@FolderBl.getAll()).toContain(item2)
it 'should not create a folder if it already exists', =>
xit 'should not create a folder if it already exists', =>
item1 = {id: 4, open: true, name: 'john'}
@FolderModel.add(item1)

Просмотреть файл

@ -48,25 +48,57 @@ describe 'FeedModel', ->
expect(@utils.imagePath).toHaveBeenCalledWith('news', 'rss.svg')
it 'should also update items when url is the same', =>
@FeedModel.add({id: 2, faviconLink: null, urlHash: 'hi'})
expect(@FeedModel.size()).toBe(1)
@FeedModel.add({id: 2, faviconLink: null, urlHash: 'hi4'})
expect(@FeedModel.size()).toBe(1)
expect(@FeedModel.getById(2).urlHash).toBe('hi4')
@FeedModel.add({id: 3, faviconLink: 'hey', urlHash: 'hi4'})
expect(@FeedModel.size()).toBe(1)
expect(@FeedModel.getById(2)).toBe(undefined)
expect(@FeedModel.getById(3).faviconLink).toBe('hey')
it 'should also remove the feed from the urlHash cache when its removed', =>
item = {id: 2, faviconLink: null, urlHash: 'hi'}
it 'should add feeds without id', =>
item = {faviconLink: null, urlHash: 'hi'}
@FeedModel.add(item)
expect(@FeedModel.getByUrlHash('hi')).toBe(item)
expect(@FeedModel.size()).toBe(1)
it 'should clear the url hash cache', =>
item = {faviconLink: null, urlHash: 'hi'}
@FeedModel.add(item)
@FeedModel.clear()
expect(@FeedModel.getByUrlHash('hi')).toBe(undefined)
expect(@FeedModel.size()).toBe(0)
it 'should delete items from the fodername cache', =>
item = {id:3, faviconLink: null, urlHash: 'hi'}
@FeedModel.add(item)
expect(@FeedModel.size()).toBe(1)
@FeedModel.removeById(3)
expect(@FeedModel.getByUrlHash('hi')).toBe(undefined)
expect(@FeedModel.size()).toBe(0)
it 'should update the id if an update comes in with an id', =>
item = {faviconLink: null, urlHash: 'hi', test: 'heheh'}
@FeedModel.add(item)
item = {id: 3, faviconLink: null, urlHash: 'hi', test: 'hoho'}
@FeedModel.add(item)
item = {id: 4, faviconLink: null, urlHash: 'his'}
@FeedModel.add(item)
expect(@FeedModel.getByUrlHash('hi').id).toBe(3)
expect(@FeedModel.getById(3).id).toBe(3)
expect(@FeedModel.getById(3).test).toBe('hoho')
expect(@FeedModel.size()).toBe(2)
it 'should update normally', =>
item = {id: 3, faviconLink: null, urlHash: 'hi', test: 'heheh'}
@FeedModel.add(item)
item2 = {id: 3, faviconLink: null, urlHash: 'his', test: 'hoho'}
@FeedModel.add(item2)
expect(@FeedModel.getById(3).id).toBe(3)
expect(@FeedModel.getById(3).test).toBe('hoho')
expect(@FeedModel.size()).toBe(1)
@FeedModel.removeById(2)
expect(@FeedModel.getByUrlHash('hi')).toBe(undefined)

Просмотреть файл

@ -32,8 +32,63 @@ describe 'FolderModel', ->
expect(@FolderModel instanceof @_Model).toBeTruthy()
it 'should allow to search for foldernames', =>
@FolderModel.add({id: 3, name: 'hi'})
it 'should add folders without id but name if they dont exist yet', =>
item = {name: 'Hi'}
@FolderModel.add(item)
expect(@FolderModel.getByName('hi')).toBe(item)
expect(@FolderModel.size()).toBe(1)
expect(@FolderModel.nameExists('hi')).toBeTruthy()
expect(@FolderModel.nameExists('dhi')).toBeFalsy()
it 'should clear the fodername cache', =>
item = {name: 'Hi'}
@FolderModel.add(item)
@FolderModel.clear()
expect(@FolderModel.getByName('hi')).toBe(undefined)
expect(@FolderModel.size()).toBe(0)
it 'should delete items from the fodername cache', =>
item = {id: 3, name: 'Hi'}
@FolderModel.add(item)
@FolderModel.removeById(3)
expect(@FolderModel.getByName('hi')).toBe(undefined)
expect(@FolderModel.size()).toBe(0)
it 'should update by foldername', =>
item = {name: 'Hi'}
@FolderModel.add(item)
item2 = {name: 'hi', test: 'hoho'}
@FolderModel.add(item2)
expect(@FolderModel.getByName('hi').test).toBe('hoho')
expect(@FolderModel.size()).toBe(1)
it 'should update the id if an update comes in with an id', =>
item = {name: 'Tony'}
@FolderModel.add(item)
item2 = {id: 3, name: 'tony', test: 'hoho'}
@FolderModel.add(item2)
expect(@FolderModel.getByName('Tony').id).toBe(3)
expect(@FolderModel.getByName('Tony').test).toBe('hoho')
expect(@FolderModel.getById(3).id).toBe(3)
expect(@FolderModel.getById(3).test).toBe('hoho')
expect(@FolderModel.size()).toBe(1)
it 'should update normally', =>
item = {id: 3, name: 'His'}
@FolderModel.add(item)
item2 = {id: 3, name: 'hobo', test: 'hoho'}
@FolderModel.add(item2)
expect(@FolderModel.getByName('His')).toBe(undefined)
expect(@FolderModel.getByName('Hobo').id).toBe(3)
expect(@FolderModel.getByName('Hobo').test).toBe('hoho')
expect(@FolderModel.getById(3).test).toBe('hoho')
expect(@FolderModel.size()).toBe(1)