Fixed comment updating after voting on it

It reported bad score until user has refreshed the page.
This commit is contained in:
Marcin Kurczewski 2014-11-10 15:54:08 +01:00
parent 6f801f2628
commit 818a8a9054
9 changed files with 65 additions and 36 deletions

View file

@ -210,8 +210,8 @@ App.Presenters.PostCommentListPresenter = function(
function score(comment, scoreValue) { function score(comment, scoreValue) {
promise.wait(api.post('/comments/' + comment.id + '/score', {score: scoreValue})) promise.wait(api.post('/comments/' + comment.id + '/score', {score: scoreValue}))
.then(function(response) { .then(function(response) {
comment.score = response.json.score; comment.score = parseInt(response.json.score);
comment.ownScore = parseInt(response.json.score); comment.ownScore = parseInt(response.json.ownScore);
updateComment(comment); updateComment(comment);
}).fail(showGenericError); }).fail(showGenericError);
} }

View file

@ -71,15 +71,19 @@ final class ScoreController extends AbstractController
$this->privilegeService->assertLoggedIn(); $this->privilegeService->assertLoggedIn();
$score = intval($this->inputReader->score); $score = intval($this->inputReader->score);
$user = $this->authService->getLoggedInUser(); $user = $this->authService->getLoggedInUser();
$result = $this->scoreService->setScore($user, $entity, $score); $result = $this->scoreService->setUserScore($user, $entity, $score);
return ['score' => $result->getScore()]; return [
'score' => $this->scoreService->getScoreValue($entity),
'ownScore' => $result->getScore(),
];
} }
private function getScore(Entity $entity) private function getScore(Entity $entity)
{ {
$this->privilegeService->assertLoggedIn();
$user = $this->authService->getLoggedInUser(); $user = $this->authService->getLoggedInUser();
$result = $this->scoreService->getScore($user, $entity); return [
return ['score' => $result ? $result->getScore() : 0]; 'score' => $this->scoreService->getScoreValue($entity),
'ownScore' => $this->scoreService->getUserScoreValue($user, $entity),
];
} }
} }

View file

@ -35,7 +35,7 @@ class CommentViewProxy extends AbstractViewProxy
$result->score = $comment->getScore(); $result->score = $comment->getScore();
if (!empty($config[self::FETCH_OWN_SCORE]) and $this->authService->isLoggedIn()) if (!empty($config[self::FETCH_OWN_SCORE]) and $this->authService->isLoggedIn())
$result->ownScore = $this->scoreService->getScoreValue($this->authService->getLoggedInUser(), $comment); $result->ownScore = $this->scoreService->getUserScoreValue($this->authService->getLoggedInUser(), $comment);
} }
return $result; return $result;
} }

View file

@ -108,7 +108,7 @@ class PostViewProxy extends AbstractViewProxy
} }
if (!empty($config[self::FETCH_OWN_SCORE]) and $this->authService->isLoggedIn()) if (!empty($config[self::FETCH_OWN_SCORE]) and $this->authService->isLoggedIn())
$result->ownScore = $this->scoreService->getScoreValue($this->authService->getLoggedInUser(), $post); $result->ownScore = $this->scoreService->getUserScoreValue($this->authService->getLoggedInUser(), $post);
if (!empty($config[self::FETCH_FAVORITES])) if (!empty($config[self::FETCH_FAVORITES]))
$result->favorites = $this->userViewProxy->fromArray($this->favoritesService->getFavoriteUsers($post)); $result->favorites = $this->userViewProxy->fromArray($this->favoritesService->getFavoriteUsers($post));

View file

@ -25,25 +25,27 @@ class ScoreDao extends AbstractDao implements ICrudDao
$this->timeService = $timeService; $this->timeService = $timeService;
} }
public function getScore(User $user, Entity $entity) public function getScoreValue(Entity $entity)
{ {
$query = $this->pdo->from($this->tableName)->where('userId', $user->getId()); $query = $this->getBaseQuery($entity);
$query->select(null);
$query->select('SUM(score) AS score');
return iterator_to_array($query)[0]['score'];
}
if ($entity instanceof Post) public function getUserScore(User $user, Entity $entity)
$query->where('postId', $entity->getId()); {
elseif ($entity instanceof Comment) $query = $this->getBaseQuery($entity);
$query->where('commentId', $entity->getId()); $query->where('userId', $user->getId());
else
throw new \InvalidArgumentException();
$arrayEntities = iterator_to_array($query); $arrayEntities = iterator_to_array($query);
$entities = $this->arrayToEntities($arrayEntities); $entities = $this->arrayToEntities($arrayEntities);
return array_shift($entities); return array_shift($entities);
} }
public function setScore(User $user, Entity $entity, $scoreValue) public function setUserScore(User $user, Entity $entity, $scoreValue)
{ {
$score = $this->getScore($user, $entity); $score = $this->getUserScore($user, $entity);
if (!$score) if (!$score)
{ {
$score = new Score(); $score = new Score();
@ -61,4 +63,18 @@ class ScoreDao extends AbstractDao implements ICrudDao
$this->save($score); $this->save($score);
return $score; return $score;
} }
private function getBaseQuery($entity)
{
$query = $this->pdo->from($this->tableName);
if ($entity instanceof Post)
$query->where('postId', $entity->getId());
elseif ($entity instanceof Comment)
$query->where('commentId', $entity->getId());
else
throw new \InvalidArgumentException();
return $query;
}
} }

View file

@ -49,7 +49,7 @@ class FavoritesService
{ {
$transactionFunc = function() use ($user, $entity) $transactionFunc = function() use ($user, $entity)
{ {
$this->scoreDao->setScore($user, $entity, 1); $this->scoreDao->setUserScore($user, $entity, 1);
return $this->favoritesDao->set($user, $entity); return $this->favoritesDao->set($user, $entity);
}; };

View file

@ -31,24 +31,33 @@ class ScoreService
$this->timeService = $timeService; $this->timeService = $timeService;
} }
public function getScore(User $user, Entity $entity) public function getScoreValue(Entity $entity)
{ {
$transactionFunc = function() use ($user, $entity) $transactionFunc = function() use ($entity)
{ {
return $this->scoreDao->getScore($user, $entity); return $this->scoreDao->getScoreValue($entity);
}; };
return $this->transactionManager->rollback($transactionFunc); return $this->transactionManager->rollback($transactionFunc);
} }
public function getScoreValue(User $user, Entity $entity) public function getUserScore(User $user, Entity $entity)
{ {
$score = $this->getScore($user, $entity); $transactionFunc = function() use ($user, $entity)
{
return $this->scoreDao->getUserScore($user, $entity);
};
return $this->transactionManager->rollback($transactionFunc);
}
public function getUserScoreValue(User $user, Entity $entity)
{
$score = $this->getUserScore($user, $entity);
if (!$score) if (!$score)
return 0; return 0;
return $score->getScore(); return $score->getScore();
} }
public function setScore(User $user, Entity $entity, $scoreValue) public function setUserScore(User $user, Entity $entity, $scoreValue)
{ {
if ($scoreValue !== 1 and $scoreValue !== 0 and $scoreValue !== -1) if ($scoreValue !== 1 and $scoreValue !== 0 and $scoreValue !== -1)
throw new \DomainException('Bad score'); throw new \DomainException('Bad score');
@ -58,7 +67,7 @@ class ScoreService
if (($scoreValue !== 1) and ($entity instanceof Post)) if (($scoreValue !== 1) and ($entity instanceof Post))
$this->favoritesDao->delete($user, $entity); $this->favoritesDao->delete($user, $entity);
return $this->scoreDao->setScore($user, $entity, $scoreValue); return $this->scoreDao->setUserScore($user, $entity, $scoreValue);
}; };
return $this->transactionManager->commit($transactionFunc); return $this->transactionManager->commit($transactionFunc);
} }

View file

@ -71,10 +71,10 @@ final class ScoreDaoTest extends AbstractDatabaseTestCase
$scoreDao->save($score2); $scoreDao->save($score2);
$scoreDao->save($score3); $scoreDao->save($score3);
$this->assertEntitiesEqual($score1, $scoreDao->getScore($user1, $post1)); $this->assertEntitiesEqual($score1, $scoreDao->getUserScore($user1, $post1));
$this->assertEntitiesEqual($score2, $scoreDao->getScore($user2, $post2)); $this->assertEntitiesEqual($score2, $scoreDao->getUserScore($user2, $post2));
$this->assertEntitiesEqual($score3, $scoreDao->getScore($user1, $post2)); $this->assertEntitiesEqual($score3, $scoreDao->getUserScore($user1, $post2));
$this->assertNull($scoreDao->getScore($user2, $post1)); $this->assertNull($scoreDao->getUserScore($user2, $post1));
} }
public function findByPost(Post $post) public function findByPost(Post $post)

View file

@ -36,10 +36,10 @@ final class ScoreServiceTest extends AbstractTestCase
$score->setUserId($user->getId()); $score->setUserId($user->getId());
$score->setPostId($post->getId()); $score->setPostId($post->getId());
$score->setScore(1); $score->setScore(1);
$this->scoreDaoMock->expects($this->once())->method('setScore')->with($user, $post)->willReturn(null); $this->scoreDaoMock->expects($this->once())->method('setUserScore')->with($user, $post)->willReturn(null);
$scoreService = $this->getScoreService(); $scoreService = $this->getScoreService();
$scoreService->setScore($user, $post, 1); $scoreService->setUserScore($user, $post, 1);
} }
public function testSettingInvalid() public function testSettingInvalid()
@ -48,7 +48,7 @@ final class ScoreServiceTest extends AbstractTestCase
$post = new Post(2); $post = new Post(2);
$this->setExpectedException(\Exception::class); $this->setExpectedException(\Exception::class);
$scoreService = $this->getScoreService(); $scoreService = $this->getScoreService();
$scoreService->setScore($user, $post, 2); $scoreService->setUserScore($user, $post, 2);
} }
public function testGetting() public function testGetting()
@ -56,10 +56,10 @@ final class ScoreServiceTest extends AbstractTestCase
$user = new User(); $user = new User();
$post = new Post(); $post = new Post();
$score = new Score(3); $score = new Score(3);
$this->scoreDaoMock->expects($this->once())->method('getScore')->with($user, $post)->willReturn($score); $this->scoreDaoMock->expects($this->once())->method('getUserScore')->with($user, $post)->willReturn($score);
$scoreService = $this->getScoreService(); $scoreService = $this->getScoreService();
$retrievedScore = $scoreService->getScore($user, $post); $retrievedScore = $scoreService->getUserScore($user, $post);
$this->assertEquals($score, $retrievedScore); $this->assertEquals($score, $retrievedScore);
} }