Reduced requests in post view

This commit is contained in:
Marcin Kurczewski 2014-09-28 16:56:15 +02:00
parent c0bc4d4f19
commit 50ca13b136
7 changed files with 99 additions and 48 deletions

1
TODO
View file

@ -3,7 +3,6 @@ first major release.
everything related to posts: everything related to posts:
- single post view - single post view
- reduce requests to server
- editing - editing
- ability to loop video posts - ability to loop video posts
- previous and next post (difficult) - previous and next post (difficult)

View file

@ -84,24 +84,12 @@ App.Presenters.PostPresenter = function(
function refreshPost() { function refreshPost() {
return promise.make(function(resolve, reject) { return promise.make(function(resolve, reject) {
promise.waitAll( promise.waitAll(api.get('/posts/' + postNameOrId))
api.get('/posts/' + postNameOrId), .then(function(postResponse) {
api.get('/posts/' + postNameOrId + '/favorites'),
auth.isLoggedIn() ?
api.get('/posts/' + postNameOrId + '/score') :
null,
privileges.canViewHistory ?
api.get('/posts/' + postNameOrId + '/history') :
null)
.then(function(
postResponse,
postFavoritesResponse,
postScoreResponse,
postHistoryResponse) {
post = postResponse.json; post = postResponse.json;
postScore = postScoreResponse && postScoreResponse.json && postScoreResponse.json.score; postScore = postResponse.json.ownScore;
postFavorites = postFavoritesResponse && postFavoritesResponse.json && postFavoritesResponse.json.data; postFavorites = postResponse.json.favorites;
postHistory = postHistoryResponse && postHistoryResponse.json && postHistoryResponse.json.data; postHistory = postResponse.json.history;
resolve(); resolve();
}).fail(function(response) { }).fail(function(response) {
showGenericError(response); showGenericError(response);

View file

@ -131,6 +131,9 @@ final class PostController extends AbstractController
\Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_RELATIONS => true, \Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_RELATIONS => true,
\Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_TAGS => true, \Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_TAGS => true,
\Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_USER => true, \Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_USER => true,
\Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_HISTORY => true,
\Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_OWN_SCORE => true,
\Szurubooru\Controllers\ViewProxies\PostViewProxy::FETCH_FAVORITES => true,
]; ];
} }

View file

@ -6,23 +6,45 @@ class PostViewProxy extends AbstractViewProxy
const FETCH_USER = 'fetchUser'; const FETCH_USER = 'fetchUser';
const FETCH_TAGS = 'fetchTags'; const FETCH_TAGS = 'fetchTags';
const FETCH_RELATIONS = 'fetchRelations'; const FETCH_RELATIONS = 'fetchRelations';
const FETCH_HISTORY = 'fetchHistory';
const FETCH_OWN_SCORE = 'fetchOwnScore';
const FETCH_FAVORITES = 'fetchFavorites';
private $privilegeService;
private $authService;
private $historyService;
private $favoritesService;
private $postScoreService;
private $tagViewProxy; private $tagViewProxy;
private $userViewProxy; private $userViewProxy;
private $snapshotViewProxy;
public function __construct( public function __construct(
\Szurubooru\Services\PrivilegeService $privilegeService,
\Szurubooru\Services\AuthService $authService,
\Szurubooru\Services\HistoryService $historyService,
\Szurubooru\Services\FavoritesService $favoritesService,
\Szurubooru\Services\PostScoreService $postScoreService,
TagViewProxy $tagViewProxy, TagViewProxy $tagViewProxy,
UserViewProxy $userViewProxy) UserViewProxy $userViewProxy,
SnapshotViewProxy $snapshotViewProxy)
{ {
$this->privilegeService = $privilegeService;
$this->authService = $authService;
$this->historyService = $historyService;
$this->favoritesService = $favoritesService;
$this->postScoreService = $postScoreService;
$this->tagViewProxy = $tagViewProxy; $this->tagViewProxy = $tagViewProxy;
$this->userViewProxy = $userViewProxy; $this->userViewProxy = $userViewProxy;
$this->snapshotViewProxy = $snapshotViewProxy;
} }
public function fromEntity($post, $config = []) public function fromEntity($post, $config = [])
{ {
$result = new \StdClass; $result = new \StdClass;
if ($post) if (!$post)
{ return $result;
$result->id = $post->getId(); $result->id = $post->getId();
$result->idMarkdown = $post->getIdMarkdown(); $result->idMarkdown = $post->getIdMarkdown();
$result->name = $post->getName(); $result->name = $post->getName();
@ -50,7 +72,22 @@ class PostViewProxy extends AbstractViewProxy
if (!empty($config[self::FETCH_RELATIONS])) if (!empty($config[self::FETCH_RELATIONS]))
$result->relations = $this->fromArray($post->getRelatedPosts()); $result->relations = $this->fromArray($post->getRelatedPosts());
if (!empty($config[self::FETCH_HISTORY]))
{
if ($this->privilegeService->hasPrivilege(\Szurubooru\Privilege::VIEW_HISTORY))
$result->history = $this->snapshotViewProxy->fromArray($this->historyService->getPostHistory($post));
else
$result->history = [];
} }
if (!empty($config[self::FETCH_OWN_SCORE]) and $this->authService->isLoggedIn())
$result->ownScore = $this->postScoreService->getScoreValue($this->authService->getLoggedInUser(), $post);
if (!empty($config[self::FETCH_FAVORITES]))
$result->favorites = $this->userViewProxy->fromArray($this->favoritesService->getFavoriteUsers($post));
return $result; return $result;
} }
} }

View file

@ -26,4 +26,3 @@ class SnapshotViewProxy extends AbstractViewProxy
return $result; return $result;
} }
} }

View file

@ -35,6 +35,23 @@ class HistoryService
return $this->transactionManager->rollback($transactionFunc); return $this->transactionManager->rollback($transactionFunc);
} }
public function getPostHistory(\Szurubooru\Entities\Post $post)
{
$filter = new \Szurubooru\SearchServices\Filters\SnapshotFilter();
$requirement = new \Szurubooru\SearchServices\Requirements\Requirement();
$requirement->setType(\Szurubooru\SearchServices\Filters\SnapshotFilter::REQUIREMENT_PRIMARY_KEY);
$requirement->setValue(new \Szurubooru\SearchServices\Requirements\RequirementSingleValue($post->getId()));
$filter->addRequirement($requirement);
$requirement = new \Szurubooru\SearchServices\Requirements\Requirement();
$requirement->setType(\Szurubooru\SearchServices\Filters\SnapshotFilter::REQUIREMENT_TYPE);
$requirement->setValue(new \Szurubooru\SearchServices\Requirements\RequirementSingleValue(\Szurubooru\Entities\Snapshot::TYPE_POST));
$filter->addRequirement($requirement);
return $this->getFiltered($filter)->getEntities();
}
public function saveSnapshot(\Szurubooru\Entities\Snapshot $snapshot) public function saveSnapshot(\Szurubooru\Entities\Snapshot $snapshot)
{ {
$transactionFunc = function() use ($snapshot) $transactionFunc = function() use ($snapshot)

View file

@ -32,6 +32,14 @@ class PostScoreService
return $this->transactionManager->rollback($transactionFunc); return $this->transactionManager->rollback($transactionFunc);
} }
public function getScoreValue(\Szurubooru\Entities\User $user, \Szurubooru\Entities\Post $post)
{
$score = $this->getScore($user, $post);
if (!$score)
return 0;
return $score->getScore();
}
public function setScore(\Szurubooru\Entities\User $user, \Szurubooru\Entities\Post $post, $scoreValue) public function setScore(\Szurubooru\Entities\User $user, \Szurubooru\Entities\Post $post, $scoreValue)
{ {
if ($scoreValue !== 1 and $scoreValue !== 0 and $scoreValue !== -1) if ($scoreValue !== 1 and $scoreValue !== 0 and $scoreValue !== -1)