]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/CoreBundle/Twig/WallabagExtension.php
Add a real configuration for CS-Fixer
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Twig / WallabagExtension.php
CommitLineData
72fcaf8a
NL
1<?php
2
3namespace Wallabag\CoreBundle\Twig;
4
8315130a 5use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
f808b016 6use Symfony\Component\Translation\TranslatorInterface;
8315130a 7use Wallabag\CoreBundle\Repository\EntryRepository;
429d86f3 8use Wallabag\CoreBundle\Repository\TagRepository;
8315130a 9
f997ae6a 10class WallabagExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface
72fcaf8a 11{
8315130a 12 private $tokenStorage;
429d86f3
NL
13 private $entryRepository;
14 private $tagRepository;
15 private $lifeTime;
1264029c 16 private $translator;
8315130a 17
1264029c 18 public function __construct(EntryRepository $entryRepository, TagRepository $tagRepository, TokenStorageInterface $tokenStorage, $lifeTime, TranslatorInterface $translator)
8315130a 19 {
429d86f3
NL
20 $this->entryRepository = $entryRepository;
21 $this->tagRepository = $tagRepository;
8315130a 22 $this->tokenStorage = $tokenStorage;
429d86f3 23 $this->lifeTime = $lifeTime;
1264029c 24 $this->translator = $translator;
8315130a
NL
25 }
26
72fcaf8a
NL
27 public function getFilters()
28 {
4094ea47
JB
29 return [
30 new \Twig_SimpleFilter('removeWww', [$this, 'removeWww']),
31 ];
72fcaf8a
NL
32 }
33
59ddb9ae
JB
34 public function getFunctions()
35 {
f808b016 36 return [
59ddb9ae 37 new \Twig_SimpleFunction('count_entries', [$this, 'countEntries']),
429d86f3 38 new \Twig_SimpleFunction('count_tags', [$this, 'countTags']),
1264029c 39 new \Twig_SimpleFunction('display_stats', [$this, 'displayStats']),
f808b016 40 ];
59ddb9ae
JB
41 }
42
72fcaf8a
NL
43 public function removeWww($url)
44 {
cfb28c9d 45 return preg_replace('/^www\./i', '', $url);
72fcaf8a
NL
46 }
47
59ddb9ae 48 /**
234ad944 49 * Return number of entries depending of the type (unread, archive, starred or all).
59ddb9ae 50 *
234ad944 51 * @param string $type Type of entries to count
59ddb9ae
JB
52 *
53 * @return int
54 */
55 public function countEntries($type)
8315130a
NL
56 {
57 $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
58
59 if (null === $user || !is_object($user)) {
5173fd1c 60 return 0;
8315130a
NL
61 }
62
59ddb9ae
JB
63 switch ($type) {
64 case 'starred':
429d86f3 65 $qb = $this->entryRepository->getBuilderForStarredByUser($user->getId());
59ddb9ae 66 break;
59ddb9ae 67 case 'archive':
429d86f3 68 $qb = $this->entryRepository->getBuilderForArchiveByUser($user->getId());
59ddb9ae 69 break;
59ddb9ae 70 case 'unread':
429d86f3 71 $qb = $this->entryRepository->getBuilderForUnreadByUser($user->getId());
59ddb9ae 72 break;
59ddb9ae 73 case 'all':
429d86f3 74 $qb = $this->entryRepository->getBuilderForAllByUser($user->getId());
59ddb9ae 75 break;
59ddb9ae
JB
76 default:
77 throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type));
78 }
79
80 // THANKS to PostgreSQL we CAN'T make a DEAD SIMPLE count(e.id)
81 // ERROR: column "e0_.id" must appear in the GROUP BY clause or be used in an aggregate function
82 $query = $qb
83 ->select('e.id')
84 ->groupBy('e.id')
85 ->getQuery();
86
faa86e06
JB
87 $query->useQueryCache(true);
88 $query->useResultCache(true);
89 $query->setResultCacheLifetime($this->lifeTime);
59ddb9ae 90
faa86e06 91 return count($query->getArrayResult());
8315130a
NL
92 }
93
429d86f3
NL
94 /**
95 * Return number of tags.
96 *
97 * @return int
98 */
99 public function countTags()
100 {
101 $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
102
103 if (null === $user || !is_object($user)) {
5173fd1c 104 return 0;
429d86f3
NL
105 }
106
28987583 107 return $this->tagRepository->countAllTags($user->getId());
429d86f3
NL
108 }
109
1264029c
JB
110 /**
111 * Display a single line about reading stats.
112 *
113 * @return string
114 */
115 public function displayStats()
116 {
117 $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
118
119 if (null === $user || !is_object($user)) {
120 return 0;
121 }
122
123 $query = $this->entryRepository->getBuilderForArchiveByUser($user->getId())
124 ->select('e.id')
125 ->groupBy('e.id')
126 ->getQuery();
127
128 $query->useQueryCache(true);
129 $query->useResultCache(true);
130 $query->setResultCacheLifetime($this->lifeTime);
131
132 $nbArchives = count($query->getArrayResult());
133
134 $interval = $user->getCreatedAt()->diff(new \DateTime('now'));
135 $nbDays = (int) $interval->format('%a') ?: 1;
136
576d285d 137 // force setlocale for date translation
f808b016 138 setlocale(LC_TIME, strtolower($user->getConfig()->getLanguage()) . '_' . strtoupper(strtolower($user->getConfig()->getLanguage())));
576d285d 139
1264029c 140 return $this->translator->trans('footer.stats', [
576d285d 141 '%user_creation%' => strftime('%e %B %Y', $user->getCreatedAt()->getTimestamp()),
1264029c
JB
142 '%nb_archives%' => $nbArchives,
143 '%per_day%' => round($nbArchives / $nbDays, 2),
144 ]);
145 }
146
72fcaf8a
NL
147 public function getName()
148 {
149 return 'wallabag_extension';
150 }
151}