<?php
namespace App\Controller\Feed;
use App\Entity\ActivityFeed;
use App\Entity\BlogEntry;
use App\Entity\Content;
use App\Entity\Member;
use App\Service\ActivityFeedService;
use App\StructSerializer\Main\StructGroup;
use App\StructSerializer\Main\StructOptions;
use App\StructSerializer\Main\StructSerializer;
use Nelmio\ApiDocBundle\Annotation\Model;
use Swagger\Annotations as SWG;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/api/public/feeds/activity")
*/
class PublicActivityFeedController extends AbstractController
{
protected ActivityFeedService $service;
protected StructSerializer $structSerializer;
public function __construct(ActivityFeedService $service, StructSerializer $structSerializer)
{
$this->service = $service;
$this->structSerializer = $structSerializer;
}
/**
* @SWG\Get(tags={"ActivityFeed"},
*
* @SWG\Response(response=200, description="Get a list of activities for a given member (timeline of the member)",
*
* @SWG\Schema(ref=@Model(type=App\Entity\ActivityFeed::class, groups={"timelineindex", "contentlist", "previewphotolist", "membermediaurl"}))),
*
* @SWG\Parameter(name="member", in="path", type="integer", required=true, description="ID of the member in question"),
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=10, description="Number of items per page for pagination")
* )
*
* @Route("/timeline/{member}/{page}", requirements={"member": "\d+", "page": "\d+"}, methods={"GET"})
*
* @throws \Exception
*/
public function memberProfileTimeline(Request $request, Member $member, int $page): JsonResponse
{
$limit = $request->query->getInt('limit', 10);
$paginator = $this->service->getTimelineFeedForMember($member, $page, $limit);
$options = StructOptions::create();
$options->setGroupFor(ActivityFeed::class, StructGroup::INFOSTREAM);
$options->setGroupFor(BlogEntry::class, StructGroup::INFOSTREAM);
$options->skipProperty(Content::class, 'comments');
$options->skipProperty(Content::class, 'categories');
$options->skipProperty(Member::class, 'member_online');
return new JsonResponse([
'data' => $this->structSerializer->multipleToArray($options, $paginator),
'total' => $paginator->count(),
]);
}
/**
* @SWG\Get(tags={"ActivityFeed"},
*
* @SWG\Response(response=200, description="Get a list of ~180 public visible activities")
* )
*
* @Route("/infostream/public", methods={"GET"})
*
* @throws \Exception
*/
public function infostreamPublic(Request $request): JsonResponse
{
$data = $this->structSerializer->multipleToArray(StructOptions::createInfostreamOptions(), $this->service->getPublicInfostreamActivities());
return new JsonResponse(['count' => count($data), 'data' => $data]);
}
/**
* @SWG\Get(tags={"ActivityFeed"},
*
* @SWG\Response(response=200, description="Get a list of public visible activities"),
*
* @SWG\Parameter(name="member_activity_ids", in="query", type="string", required=true, description="MemberIds to get ActivityFeed for with min_activity_id")
* )
*
* @Route("/infostream/members", methods={"GET|POST"})
*
* @throws \Exception
*/
public function infostreamMembers(Request $request): JsonResponse
{
$inputValues = $request->query->get('member_activity_ids', '');
if (empty($inputValues)) {
$inputValues = $request->request->get('member_activity_ids', '');
}
if ('' === $inputValues) {
return new JsonResponse(['count' => [], 'data' => []]);
}
$inputValues = explode(',', $inputValues);
$memberActivityIds = [];
foreach ($inputValues as $value) {
$value = explode('-', $value);
$memberActivityIds[$value[0]] = $value[1];
}
$memberActivities = $this->service->getMemberInfostreamActivities($memberActivityIds);
$count = 0;
foreach ($memberActivities as $memberId => $activities) {
$memberActivities[$memberId] = $this->structSerializer->multipleToArray(StructOptions::createInfostreamOptions(), $activities);
$count += count($activities);
}
return new JsonResponse(['count' => $count, 'data' => $memberActivities]);
}
/**
* @SWG\Get(tags={"ActivityFeed"},
*
* @SWG\Response(response=200, description="Get a list of public visible activities over all amateurs"),
*
* @SWG\Parameter(name="page", in="path", type="integer", required=true, description="Requested page for pagination"),
* @SWG\Parameter(name="limit", in="query", type="integer", required=false, default=10, description="Number of items per page for pagination")
* )
*
* @Route("/infostream/global/{page}", requirements={"page": "\d+"}, methods={"GET"})
*
* @throws \Exception
*/
public function globalActivityStream(int $page, Request $request): JsonResponse
{
$limit = $request->query->getInt('limit', 20);
$result = $this->service->getGlobalTimelineFeedData($page, $limit);
return new JsonResponse([
'data' => $result['data'],
'total' => $result['total'],
]);
}
}