FavoriteManager.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. /*
  3. * This file is part of Packagist.
  4. *
  5. * (c) Jordi Boggiano <j.boggiano@seld.be>
  6. * Nils Adermann <naderman@naderman.de>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Packagist\WebBundle\Model;
  12. use FOS\UserBundle\Model\UserInterface;
  13. use Packagist\WebBundle\Entity\Package;
  14. use Packagist\WebBundle\Entity\PackageRepository;
  15. use Packagist\WebBundle\Entity\UserRepository;
  16. use Predis\Client;
  17. /**
  18. * @author Jordi Boggiano <j.boggiano@seld.be>
  19. */
  20. class FavoriteManager
  21. {
  22. protected $redis;
  23. protected $packageRepo;
  24. protected $userRepo;
  25. public function __construct(Client $redis, PackageRepository $packageRepo, UserRepository $userRepo)
  26. {
  27. $this->redis = $redis;
  28. $this->packageRepo = $packageRepo;
  29. $this->userRepo = $userRepo;
  30. }
  31. public function markFavorite(UserInterface $user, Package $package)
  32. {
  33. if (!$this->isMarked($user, $package)) {
  34. $this->redis->zadd('pkg:'.$package->getId().':fav', time(), $user->getId());
  35. $this->redis->zadd('usr:'.$user->getId().':fav', time(), $package->getId());
  36. }
  37. }
  38. public function removeFavorite(UserInterface $user, Package $package)
  39. {
  40. $this->redis->zrem('pkg:'.$package->getId().':fav', $user->getId());
  41. $this->redis->zrem('usr:'.$user->getId().':fav', $package->getId());
  42. }
  43. public function getFavorites(UserInterface $user, $limit = 0, $offset = 0)
  44. {
  45. $favoriteIds = $this->redis->zrevrange('usr:'.$user->getId().':fav', $offset, $offset + $limit - 1);
  46. return $this->packageRepo->findById($favoriteIds);
  47. }
  48. public function getFavoriteCount(UserInterface $user)
  49. {
  50. return $this->redis->zcard('usr:'.$user->getId().':fav');
  51. }
  52. public function getFavers(Package $package, $offset = 0, $limit = 100)
  53. {
  54. $faverIds = $this->redis->zrevrange('pkg:'.$package->getId().':fav', $offset, $offset + $limit - 1);
  55. return $this->userRepo->findById($faverIds);
  56. }
  57. public function getFaverCount(Package $package)
  58. {
  59. return $this->redis->zcard('pkg:'.$package->getId().':fav') + $package->getGitHubStars();
  60. }
  61. public function getFaverCounts(array $packageIds)
  62. {
  63. $res = array();
  64. // TODO should be done with scripting when available
  65. foreach ($packageIds as $id) {
  66. if (ctype_digit((string) $id)) {
  67. $res[$id] = $this->redis->zcard('pkg:'.$id.':fav');
  68. }
  69. }
  70. $rows = $this->packageRepo->getGitHubStars($packageIds);
  71. foreach ($rows as $row) {
  72. $res[$row['id']] += $row['gitHubStars'];
  73. }
  74. return $res;
  75. }
  76. public function isMarked(UserInterface $user, Package $package)
  77. {
  78. return null !== $this->redis->zrank('usr:'.$user->getId().':fav', $package->getId());
  79. }
  80. }