var App = App || {}; App.Services = App.Services || {}; App.Services.PostsAroundCalculator = function(_, promise, util, pager) { pager.init({url: '/posts'}); function resetCache() { pager.resetCache(); } function getLinksToPostsAround(query, postId) { return promise.make(function(resolve, reject) { pager.setSearchParams(query); pager.setPage(query.page); promise.wait(pager.retrieveCached()) .then(function(response) { var postIds = _.pluck(response.entities, 'id'); var position = _.indexOf(postIds, postId); if (position === -1) { resolve(null, null); } promise.wait( getLinkToPostAround(postIds, position, query.page, -1), getLinkToPostAround(postIds, position, query.page, 1)) .then(function(nextPostUrl, prevPostUrl) { resolve(nextPostUrl, prevPostUrl); }).fail(function() { reject(); }); }).fail(function() { reject(); }); }); } function getLinkToPostAround(postIds, position, page, direction) { return promise.make(function(resolve, reject) { if (position + direction >= 0 && position + direction < postIds.length) { var url = util.appendComplexRouteParam( '#/post/' + postIds[position + direction], _.extend({page: page}, pager.getSearchParams())); resolve(url); } else if (page + direction >= 1) { pager.setPage(page + direction); promise.wait(pager.retrieveCached()) .then(function(response) { if (response.entities.length) { var post = direction === - 1 ? _.last(response.entities) : _.first(response.entities); var url = util.appendComplexRouteParam( '#/post/' + post.id, _.extend({page: page + direction}, pager.getSearchParams())); resolve(url); } else { resolve(null); } }).fail(function() { reject(); }); } else { resolve(null); } }); } return { resetCache: resetCache, getLinksToPostsAround: getLinksToPostsAround, }; }; App.DI.register('postsAroundCalculator', ['_', 'promise', 'util', 'pager'], App.Services.PostsAroundCalculator);