<?php
namespace App\Controller\Api\V1\Profile\Message;
use App\Entity\Profile\Helper\Article;
use App\Entity\Profile\Helper\Helper;
use App\Entity\Profile\Message\Message;
use App\Entity\Profile\Profile;
use App\Entity\Profile\ProfileRBAC;
use App\Entity\User\User;
use App\Enums\Constants;
use App\Helpers\PaginationHelper;
use App\Repository\Profile\Helper\ArticleRepository;
use App\Repository\Profile\Helper\HelperRepository;
use App\Repository\Profile\Message\MessageRepository;
use App\Responders\CollectionResponder;
use App\Service\RequestDataExtractorService;
use Doctrine\Common\Collections\ArrayCollection;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Swagger\Annotations as SWG;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class GetAll
{
/**
* @var PaginationHelper
*/
private $paginationHelper;
/**
* @var RequestDataExtractorService
*/
private $requestDataExtractorService;
/** @var MessageRepository */
private $messageRepository;
/**
* GetAllUnderProfile constructor.
*
* @param PaginationHelper $paginationHelper
* @param RequestDataExtractorService $requestDataExtractorService
* @param MessageRepository $messageRepository
*/
public function __construct(
PaginationHelper $paginationHelper,
RequestDataExtractorService $requestDataExtractorService,
MessageRepository $messageRepository
)
{
$this->paginationHelper = $paginationHelper;
$this->requestDataExtractorService = $requestDataExtractorService;
$this->messageRepository = $messageRepository;
}
/**
* @Route(path="/v1/profile/{id}/message", methods={"GET"})
*
* @SWG\Get(
* tags={"Profile Message"},
* description="Get all profile Messages under some profile"
* )
*
* @SWG\Parameter(
* name="limit",
* in="query",
* type="integer",
* default="5",
* description="Enter the number of result items to show on a page",
* required=true
* ),
*
* @SWG\Parameter(
* name="page",
* in="query",
* type="integer",
* default="1",
* description="Enter the number of result page to show",
* required=true
* ),
*
* @SWG\Parameter(
* name="search_term",
* in="query",
* type="string",
* description="Search term"
* ),
*
*
* @SWG\Response(
* response=200,
* description="Profile Messages list"
* )
*
*
*
* @param Profile $profile
* @param Request $request
* @param CollectionResponder $collectionResponder
* @return JsonResponse
*///@IsGranted("PROFILE_ACCESS", subject="profile")
public function __invoke(Profile $profile, Request $request, CollectionResponder $collectionResponder)
{
$searchTerm = $this->requestDataExtractorService->extractQueryParameter('search_term');
$filteredCollection = [];
$messages = $this->messageRepository->findBy(['profile' => $profile], ['createdAt' => 'DESC']);
$idToGetMessage = (is_null($profile->getParent())) ? $profile->getId() : $profile->getParent()->getId();
$serviceMessages = $this->messageRepository->findBy(['profile' => $idToGetMessage], ['createdAt' => 'DESC']);
foreach($serviceMessages as $message) {
if(!in_array($message, $messages)) {
$messages[] = $message;
}
}
if (! $searchTerm) {
$filteredCollection = $messages;
}else{
/** @var Message $message */
foreach ($messages as $message) {
if (stripos($message->getContent(), $searchTerm) !== false) {
if(!in_array($message, $filteredCollection)){
$filteredCollection[] = $message;
}
}
}
}
$paginatedCollection = $this->paginationHelper->buildPaginatedResult($filteredCollection);
return $collectionResponder($paginatedCollection, ['message:show']);
}
}