3 namespace Wallabag\FederationBundle\Controller
;
5 use Pagerfanta\Adapter\DoctrineORMAdapter
;
6 use Pagerfanta\Pagerfanta
;
7 use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter
;
8 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route
;
9 use Symfony\Bundle\FrameworkBundle\Controller\Controller
;
10 use Symfony\Component\HttpFoundation\JsonResponse
;
11 use Symfony\Component\HttpFoundation\Request
;
12 use Symfony\Component\HttpFoundation\Response
;
13 use Symfony\Component\Routing\Generator\UrlGeneratorInterface
;
14 use Wallabag\CoreBundle\Entity\Entry
;
15 use Wallabag\FederationBundle\Entity\Account
;
16 use Wallabag\FederationBundle\Federation\CloudId
;
18 class ProfileController
extends Controller
21 * @Route("/profile/@{user}", name="user-profile")
22 * @ParamConverter("user", class="WallabagFederationBundle:Account", options={
23 * "repository_method" = "findOneByUsername"})
25 * @param Request $request
26 * @param Account $user
27 * @return JsonResponse|Response
29 public function getUserProfile(Request
$request, Account
$user)
31 if (in_array('application/ld+json; profile="https://www.w3.org/ns/activitystreams', $request->getAcceptableContentTypes(), true)) {
33 '@context' => 'https://www.w3.org/ns/activitystreams',
35 'id' => CloudId
::getCloudIdFromAccount($user, $this->generateUrl('homepage', [], UrlGeneratorInterface
::ABSOLUTE_URL
))->getDisplayId(),
36 'following' => $this->generateUrl('following', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
37 'followers' => $this->generateUrl('followers', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
38 //'liked' => $this->generateUrl('recommended', ['user' => $user], UrlGeneratorInterface::ABSOLUTE_URL),
39 'inbox' => $this->generateUrl('user-inbox', ['user' => $user], UrlGeneratorInterface
::ABSOLUTE_URL
),
40 'outbox' => $this->generateUrl('user-outbox', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
41 'preferredUsername' => $user->getUser()->getName(),
42 'name' => $user->getUsername(),
43 //'oauthAuthorizationEndpoint' => $this->generateUrl('fos_oauth_server_authorize', [], UrlGeneratorInterface::ABSOLUTE_URL),
44 'oauthTokenEndpoint' => $this->generateUrl('fos_oauth_server_token', [], UrlGeneratorInterface
::ABSOLUTE_URL
),
45 //'publicInbox' => $this->generateUrl('public_inbox', [], UrlGeneratorInterface::ABSOLUTE_URL),
47 return new JsonResponse($data);
50 'WallabagFederationBundle:User:profile.html.twig', [
52 'registration_enabled' => $this->getParameter('wallabag_user.registration_enabled'),
58 * @Route("/profile/@{user}/followings/{page}", name="following", defaults={"page" : 0})
59 * @ParamConverter("user", class="WallabagFederationBundle:Account", options={
60 * "repository_method" = "findOneByUsername"})
62 * @param Request $request
63 * @param Account $user
65 * @return JsonResponse|Response
67 public function getUsersFollowing(Request
$request, Account
$user, $page = 0)
69 $qb = $this->getDoctrine()->getRepository('WallabagFederationBundle:Account')->getBuilderForFollowingsByAccount($user->getId());
71 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
73 $following = new Pagerfanta($pagerAdapter);
74 $totalFollowing = $following->getNbResults();
76 $activityStream = in_array('application/ld+json; profile="https://www.w3.org/ns/activitystreams', $request->getAcceptableContentTypes(), true);
78 if ($page === 0 && $activityStream) {
81 '@context' => 'https://www.w3.org/ns/activitystreams',
82 'summary' => $user->getUsername() . " followings'",
83 'type' => 'Collection',
84 'id' => $this->generateUrl('following', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
85 'totalItems' => $totalFollowing,
87 '@context' => 'https://www.w3.org/ns/activitystreams',
89 'href' => $this->generateUrl('following', ['user' => $user->getUsername(), 'page' => 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
90 'name' => 'First page of ' . $user->getUsername() . ' followings'
93 '@context' => 'https://www.w3.org/ns/activitystreams',
95 'href' => $this->generateUrl('following', ['user' => $user->getUsername(), 'page' => $following->getNbPages()], UrlGeneratorInterface
::ABSOLUTE_URL
),
96 'name' => 'Last page of ' . $user->getUsername() . ' followings'
99 return new JsonResponse($dataPrez);
103 $following->setMaxPerPage(30);
104 $following->setCurrentPage($page);
106 if (!$activityStream) {
107 return $this->render('WallabagFederationBundle:User:followers.html.twig', [
108 'users' => $following,
110 'registration_enabled' => $this->getParameter('wallabag_user.registration_enabled'),
116 foreach ($following->getCurrentPageResults() as $follow) {
117 /** @var Account $follow */
118 /** Items in the page */
120 '@context' => 'https://www.w3.org/ns/activitystreams',
122 'name' => $follow->getUsername(),
123 'id' => CloudId
::getCloudIdFromAccount($follow),
128 'summary' => 'Page ' . $page . ' of ' . $user->getUsername() . ' followers',
129 'partOf' => $this->generateUrl('following', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
130 'type' => 'OrderedCollectionPage',
131 'startIndex' => ($page - 1) * 30,
132 'orderedItems' => $items,
134 '@context' => 'https://www.w3.org/ns/activitystreams',
136 'href' => $this->generateUrl('following', ['user' => $user->getUsername(), 'page' => 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
137 'name' => 'First page of ' . $user->getUsername() . ' followings'
140 '@context' => 'https://www.w3.org/ns/activitystreams',
142 'href' => $this->generateUrl('following', ['user' => $user->getUsername(), 'page' => $following->getNbPages()], UrlGeneratorInterface
::ABSOLUTE_URL
),
143 'name' => 'Last page of ' . $user->getUsername() . ' followings'
150 '@context' => 'https://www.w3.org/ns/activitystreams',
152 'href' => $this->generateUrl('following', ['user' => $user->getUsername(), 'page' => $page - 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
153 'name' => 'Previous page of ' . $user->getUsername() . ' followings'
158 if ($page < $following->getNbPages()) {
160 '@context' => 'https://www.w3.org/ns/activitystreams',
162 'href' => $this->generateUrl('following', ['user' => $user->getUsername(), 'page' => $page +
1], UrlGeneratorInterface
::ABSOLUTE_URL
),
163 'name' => 'Next page of ' . $user->getUsername() . ' followings'
167 return new JsonResponse($data);
171 * @Route("/profile/@{user}/followers/{page}", name="followers", defaults={"page" : 0})
172 * @ParamConverter("user", class="WallabagFederationBundle:Account", options={
173 * "repository_method" = "findOneByUsername"})
175 * @param Request $request
176 * @param Account $user
177 * @return JsonResponse
179 public function getUsersFollowers(Request
$request, Account
$user, $page)
181 $qb = $this->getDoctrine()->getRepository('WallabagFederationBundle:Account')->getBuilderForFollowersByAccount($user->getId());
183 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
185 $followers = new Pagerfanta($pagerAdapter);
186 $totalFollowers = $followers->getNbResults();
188 $activityStream = in_array('application/ld+json; profile="https://www.w3.org/ns/activitystreams', $request->getAcceptableContentTypes(), true);
190 if ($page === 0 && $activityStream) {
193 '@context' => 'https://www.w3.org/ns/activitystreams',
194 'summary' => $user->getUsername() . " followers'",
195 'type' => 'Collection',
196 'id' => $this->generateUrl('followers', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
197 'totalItems' => $totalFollowers,
199 '@context' => 'https://www.w3.org/ns/activitystreams',
201 'href' => $this->generateUrl('followers', ['user' => $user->getUsername(), 'page' => 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
202 'name' => 'First page of ' . $user->getUsername() . ' followers'
205 '@context' => 'https://www.w3.org/ns/activitystreams',
207 'href' => $this->generateUrl('followers', ['user' => $user->getUsername(), 'page' => $followers->getNbPages()], UrlGeneratorInterface
::ABSOLUTE_URL
),
208 'name' => 'Last page of ' . $user->getUsername() . ' followers'
211 return new JsonResponse($dataPrez);
214 $followers->setMaxPerPage(30);
215 if (!$activityStream && $page === 0) {
216 $followers->setCurrentPage(1);
218 $followers->setCurrentPage($page);
221 if (!$activityStream) {
222 return $this->render('WallabagFederationBundle:User:followers.html.twig', [
223 'users' => $followers,
225 'registration_enabled' => $this->getParameter('wallabag_user.registration_enabled'),
231 foreach ($followers->getCurrentPageResults() as $follow) {
232 /** @var Account $follow */
233 /** Items in the page */
235 '@context' => 'https://www.w3.org/ns/activitystreams',
237 'name' => $follow->getUsername(),
238 'id' => CloudId
::getCloudIdFromAccount($follow)->getDisplayId(),
242 'summary' => 'Page ' . $page . ' of ' . $user->getUsername() . ' followers',
243 'partOf' => $this->generateUrl('followers', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
244 'type' => 'OrderedCollectionPage',
245 'startIndex' => ($page - 1) * 30,
246 'orderedItems' => $items,
248 '@context' => 'https://www.w3.org/ns/activitystreams',
250 'href' => $this->generateUrl('followers', ['user' => $user->getUsername(), 'page' => 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
251 'name' => 'First page of ' . $user->getUsername() . ' followers'
254 '@context' => 'https://www.w3.org/ns/activitystreams',
256 'href' => $this->generateUrl('followers', ['user' => $user->getUsername(), 'page' => $followers->getNbPages()], UrlGeneratorInterface
::ABSOLUTE_URL
),
257 'name' => 'Last page of ' . $user->getUsername() . ' followers'
264 '@context' => 'https://www.w3.org/ns/activitystreams',
266 'href' => $this->generateUrl('followers', ['user' => $user->getUsername(), 'page' => $page - 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
267 'name' => 'Previous page of ' . $user->getUsername() . ' followers'
272 if ($page < $followers->getNbPages()) {
274 '@context' => 'https://www.w3.org/ns/activitystreams',
276 'href' => $this->generateUrl('followers', ['user' => $user->getUsername(), 'page' => $page +
1], UrlGeneratorInterface
::ABSOLUTE_URL
),
277 'name' => 'Next page of ' . $user->getUsername() . ' followers'
281 return new JsonResponse($data);
285 * @Route("/profile/@{userToFollow}/follow", name="follow-user")
286 * @ParamConverter("userToFollow", class="WallabagFederationBundle:Account", options={
287 * "repository_method" = "findOneByUsername"})
288 * @param Account $userToFollow
290 public function followAccountAction(Account
$userToFollow)
292 // if we're on our own instance
293 if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
295 /** @var Account $userAccount */
296 $userAccount = $this->getUser()->getAccount();
298 if ($userToFollow === $userAccount) {
299 $this->createAccessDeniedException("You can't follow yourself");
302 $em = $this->getDoctrine()->getManager();
304 $userAccount->addFollowing($userToFollow);
305 $userToFollow->addFollower($userAccount);
307 $em->persist($userAccount);
308 $em->persist($userToFollow);
312 // ask cloud id and redirect to instance
317 * @Route("/profile/@{user}/recommendations", name="user-recommendations", defaults={"page" : 0})
318 * @ParamConverter("user", class="WallabagFederationBundle:Account", options={
319 * "repository_method" = "findOneByUsername"})
321 * @param Request $request
322 * @param Account $user
324 * @return JsonResponse|Response
326 public function getUsersRecommendationsAction(Request
$request, Account
$user, $page = 0)
328 $qb = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry')->getBuilderForRecommendationsByUser($user->getUser()->getId());
330 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
332 $recommendations = new Pagerfanta($pagerAdapter);
333 $totalRecommendations = $recommendations->getNbResults();
335 $activityStream = in_array('application/ld+json; profile="https://www.w3.org/ns/activitystreams', $request->getAcceptableContentTypes(), true);
337 if ($page === 0 && $activityStream) {
339 '@context' => 'https://www.w3.org/ns/activitystreams',
340 'summary' => $user->getUsername() . " recommendations'",
341 'type' => 'Collection',
342 'id' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
343 'totalItems' => $totalRecommendations,
345 '@context' => 'https://www.w3.org/ns/activitystreams',
347 'href' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername(), 'page' => 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
348 'name' => 'First page of ' . $user->getUsername() . ' followers'
351 '@context' => 'https://www.w3.org/ns/activitystreams',
353 'href' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername(), 'page' => $recommendations->getNbPages()], UrlGeneratorInterface
::ABSOLUTE_URL
),
354 'name' => 'Last page of ' . $user->getUsername() . ' followers'
357 return new JsonResponse($dataPrez);
360 $recommendations->setMaxPerPage(30);
361 if (!$activityStream && $page === 0) {
362 $recommendations->setCurrentPage(1);
364 $recommendations->setCurrentPage($page);
367 if (!$activityStream) {
368 return $this->render('WallabagFederationBundle:User:recommendations.html.twig', [
369 'recommendations' => $recommendations,
370 'registration_enabled' => $this->getParameter('wallabag_user.registration_enabled'),
376 foreach ($recommendations->getCurrentPageResults() as $recommendation) {
378 '@context' => 'https://www.w3.org/ns/activitystreams',
380 'name' => $recommendation->getTitle(),
381 'id' => $recommendation->getUrl(),
385 'summary' => 'Page ' . $page . ' of ' . $user->getUsername() . ' recommendations',
386 'partOf' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername()], UrlGeneratorInterface
::ABSOLUTE_URL
),
387 'type' => 'OrderedCollectionPage',
388 'startIndex' => ($page - 1) * 30,
389 'orderedItems' => $items,
391 '@context' => 'https://www.w3.org/ns/activitystreams',
393 'href' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername(), 'page' => 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
394 'name' => 'First page of ' . $user->getUsername() . ' recommendations'
397 '@context' => 'https://www.w3.org/ns/activitystreams',
399 'href' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername(), 'page' => $recommendations->getNbPages()], UrlGeneratorInterface
::ABSOLUTE_URL
),
400 'name' => 'Last page of ' . $user->getUsername() . ' recommendations'
406 '@context' => 'https://www.w3.org/ns/activitystreams',
408 'href' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername(), 'page' => $page - 1], UrlGeneratorInterface
::ABSOLUTE_URL
),
409 'name' => 'Previous page of ' . $user->getUsername() . ' recommendations'
413 if ($page < $recommendations->getNbPages()) {
415 '@context' => 'https://www.w3.org/ns/activitystreams',
417 'href' => $this->generateUrl('user-recommendations', ['user' => $user->getUsername(), 'page' => $page +
1], UrlGeneratorInterface
::ABSOLUTE_URL
),
418 'name' => 'Next page of ' . $user->getUsername() . ' recommendations'
422 return new JsonResponse($data);