src/Controller/Feed/PublicActivityFeedController.php line 138

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Feed;
  3. use App\Entity\ActivityFeed;
  4. use App\Entity\BlogEntry;
  5. use App\Entity\Content;
  6. use App\Entity\Member;
  7. use App\Service\ActivityFeedService;
  8. use App\StructSerializer\Main\StructGroup;
  9. use App\StructSerializer\Main\StructOptions;
  10. use App\StructSerializer\Main\StructSerializer;
  11. use Nelmio\ApiDocBundle\Annotation\Model;
  12. use Swagger\Annotations as SWG;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. /**
  19.  * @Route("/api/public/feeds/activity")
  20.  */
  21. class PublicActivityFeedController extends AbstractController
  22. {
  23.     protected ActivityFeedService $service;
  24.     protected StructSerializer $structSerializer;
  25.     public function __construct(ActivityFeedService $serviceStructSerializer $structSerializer)
  26.     {
  27.         $this->service $service;
  28.         $this->structSerializer $structSerializer;
  29.     }
  30.     /**
  31.      * @SWG\Get(tags={"ActivityFeed"},
  32.      *
  33.      *    @SWG\Response(response=200, description="Get a list of activities for a given member (timeline of the member)",
  34.      *
  35.      *     @SWG\Schema(ref=@Model(type=App\Entity\ActivityFeed::class, groups={"timelineindex", "contentlist", "previewphotolist", "membermediaurl"}))),
  36.      *
  37.      *    @SWG\Parameter(name="member", in="path", type="integer", required=true, description="ID of the member in question"),
  38.      *    @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
  39.      *    @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=10, description="Number of items per page for pagination")
  40.      * )
  41.      *
  42.      * @Route("/timeline/{member}/{page}", requirements={"member": "\d+", "page": "\d+"}, methods={"GET"})
  43.      *
  44.      * @throws \Exception
  45.      */
  46.     public function memberProfileTimeline(Request $requestMember $memberint $page): JsonResponse
  47.     {
  48.         $limit $request->query->getInt('limit'10);
  49.         $paginator $this->service->getTimelineFeedForMember($member$page$limit);
  50.         $options StructOptions::create();
  51.         $options->setGroupFor(ActivityFeed::class, StructGroup::INFOSTREAM);
  52.         $options->setGroupFor(BlogEntry::class, StructGroup::INFOSTREAM);
  53.         $options->skipProperty(Content::class, 'comments');
  54.         $options->skipProperty(Content::class, 'categories');
  55.         $options->skipProperty(Member::class, 'member_online');
  56.         return new JsonResponse([
  57.             'data' => $this->structSerializer->multipleToArray($options$paginator),
  58.             'total' => $paginator->count(),
  59.         ]);
  60.     }
  61.     /**
  62.      * @SWG\Get(tags={"ActivityFeed"},
  63.      *
  64.      *    @SWG\Response(response=200, description="Get a list of ~180 public visible activities")
  65.      * )
  66.      *
  67.      * @Route("/infostream/public", methods={"GET"})
  68.      *
  69.      * @throws \Exception
  70.      */
  71.     public function infostreamPublic(Request $request): JsonResponse
  72.     {
  73.         $data $this->structSerializer->multipleToArray(StructOptions::createInfostreamOptions(), $this->service->getPublicInfostreamActivities());
  74.         return new JsonResponse(['count' => count($data), 'data' => $data]);
  75.     }
  76.     /**
  77.      * @SWG\Get(tags={"ActivityFeed"},
  78.      *
  79.      *    @SWG\Response(response=200, description="Get a list of public visible activities"),
  80.      *
  81.      *    @SWG\Parameter(name="member_activity_ids", in="query", type="string", required=true, description="MemberIds to get ActivityFeed for with min_activity_id")
  82.      * )
  83.      *
  84.      * @Route("/infostream/members", methods={"GET|POST"})
  85.      *
  86.      * @throws \Exception
  87.      */
  88.     public function infostreamMembers(Request $request): JsonResponse
  89.     {
  90.         $inputValues $request->query->get('member_activity_ids''');
  91.         if (empty($inputValues)) {
  92.             $inputValues $request->request->get('member_activity_ids''');
  93.         }
  94.         if ('' === $inputValues) {
  95.             return new JsonResponse(['count' => [], 'data' => []]);
  96.         }
  97.         $inputValues explode(','$inputValues);
  98.         $memberActivityIds = [];
  99.         foreach ($inputValues as $value) {
  100.             $value explode('-'$value);
  101.             $memberActivityIds[$value[0]] = $value[1];
  102.         }
  103.         $memberActivities $this->service->getMemberInfostreamActivities($memberActivityIds);
  104.         $count 0;
  105.         foreach ($memberActivities as $memberId => $activities) {
  106.             $memberActivities[$memberId] = $this->structSerializer->multipleToArray(StructOptions::createInfostreamOptions(), $activities);
  107.             $count += count($activities);
  108.         }
  109.         return new JsonResponse(['count' => $count'data' => $memberActivities]);
  110.     }
  111.     /**
  112.      * @SWG\Get(tags={"ActivityFeed"},
  113.      *
  114.      *    @SWG\Response(response=200, description="Get a list of public visible activities over all amateurs"),
  115.      *
  116.      *    @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
  117.      *    @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=10, description="Number of items per page for pagination")
  118.      * )
  119.      *
  120.      * @Route("/infostream/global/{page}", requirements={"page": "\d+"}, methods={"GET"})
  121.      *
  122.      * @throws \Exception
  123.      */
  124.     public function globalActivityStream(int $pageRequest $request): JsonResponse
  125.     {
  126.         $limit $request->query->getInt('limit'20);
  127.         $result $this->service->getGlobalTimelineFeedData($page$limit);
  128.         return new JsonResponse([
  129.             'data' => $result['data'],
  130.             'total' => $result['total'],
  131.         ]);
  132.     }
  133. }