hesabixCore/src/Controller/StackController.php
2023-02-11 14:28:54 -05:00

310 lines
14 KiB
PHP

<?php
namespace App\Controller;
use App\Entity\StackCat;
use App\Entity\StackContent;
use App\Service\Jdate;
use App\Service\Provider;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\SerializerInterface;
class StackController extends AbstractController
{
#[Route('/api/stack/cats/get', name: 'app_stack_get_cats')]
public function app_stack_get_cats(SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$result = [];
$cats = $entityManager->getRepository(StackCat::class)->findAll();
foreach ($cats as $cat){
$temp = [];
$temp['id'] = $cat->getId();
$temp['name'] = $cat->getName();
$temp['code'] = $cat->getCode();
$result[] = $temp;
}
return $this->json($result);
}
#[Route('/api/stack/insert', name: 'app_stack_content_insert')]
public function app_stack_content_insert(Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$params = [];
if ($content = $request->getContent()) {
$params = json_decode($content, true);
}
if(array_key_exists('title',$params) && array_key_exists('cat',$params) && array_key_exists('body',$params )){
$cat = $entityManager->getRepository(StackCat::class)->find($params['cat']);
$stack = new StackContent();
$stack->setBody($params['body']);
$stack->setCat($cat);
$stack->setTitle($params['title']);
$stack->setDateSubmit(time());
$stack->setViews(0);
$stack->setSubmitter($this->getUser());
$stack->setUrl(str_replace(' ','_',$params['title']));
$entityManager->persist($stack);
$entityManager->flush();
return $this->json([
'error'=> 0,
'message'=> 'ok',
'url'=>$stack->getUrl()
]);
}
return $this->json([
'error'=> 999,
'message'=> 'تمام موارد لازم را وارد کنید.'
]);
}
#[Route('/api/stack/replay/insert', name: 'app_stack_replay_insert')]
public function app_stack_replay_insert(Jdate $jdate,Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$params = [];
if ($content = $request->getContent()) {
$params = json_decode($content, true);
}
if( array_key_exists('upper',$params) && array_key_exists('body',$params )){
$upper = $entityManager->getRepository(StackContent::class)->findOneBy(['url'=>$params['upper']]);
if(!$upper)
throw $this->createNotFoundException();
$stack = new StackContent();
$stack->setUpper($upper);
$stack->setBody($params['body']);
$stack->setCat($upper->getCat());
$stack->setTitle('پاسخ به: ' . $upper->getTitle());
$stack->setDateSubmit(time());
$stack->setViews(0);
$stack->setSubmitter($this->getUser());
$stack->setUrl('0');
$entityManager->persist($stack);
$entityManager->flush();
return $this->json([
'error'=> 0,
'message'=> 'ok',
'url'=>$stack->getUrl(),
'data'=>[
'id'=> $stack->getId(),
'title' => $stack->getTitle(),
'body' => $stack->getBody(),
'submitter' => $stack->getSubmitter()->getFullName(),
'dateSubmit' => $jdate->pastTime($stack->getDateSubmit()),
'cat' => $stack->getCat()->getName(),
'views' => $stack->getViews(),
'url' => $stack->getUrl(),
'submitter_gravatar_hash' => $provider->gravatarHash($stack->getSubmitter()->getEmail())
]
]);
}
return $this->json([
'error'=> 999,
'message'=> 'تمام موارد لازم را وارد کنید.',
]);
}
/**
* @throws \Doctrine\ORM\NonUniqueResultException
* @throws \Doctrine\ORM\NoResultException
*/
#[Route('/api/stack/contents/search', name: 'app_stack_contents_get')]
public function app_stack_contents_get(Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$params = [];
if ($content = $request->getContent()) {
$params = json_decode($content, true);
}
$params = $provider->createSearchParams($request);
$items = $entityManager->getRepository(StackContent::class)->search($params);
$response = [];
foreach ($items as $item){
$temp = [];
$temp['id'] = $item->getId();
$temp['title'] = $item->getTitle();
$temp['body'] = $item->getBody();
$temp['submitter'] = $item->getSubmitter()->getFullName();
$temp['dateSubmit'] = $jdate->pastTime($item->getDateSubmit());
$temp['cat'] = $item->getCat()->getName();
$temp['views'] = $item->getViews();
$temp['url'] = $item->getUrl();
$temp['replaysCount'] = $entityManager->getRepository(StackContent::class)->getCountReplaysOfQuestion($item);
$replays = $entityManager->getRepository(StackContent::class)->getReplaysOfQuestion($item);
$temp['lastReplayPerson'] = '';
$temp['lastReplayDate'] = '';
if(count($replays) != 0){
$temp['lastReplayPerson'] = $replays[0]->getSubmitter()->getFullName();
$temp['lastReplayDate'] = $jdate->pastTime($replays[0]->getDateSubmit());
}
$response[] = $temp;
}
return $this->json($response);
}
#[Route('/api/stack/replays/search/{url}', name: 'app_stack_replays_get')]
public function app_stack_replays_get($url,Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$upper = $entityManager->getRepository(StackContent::class)->findOneBy(['url'=>$url]);
if(!$upper)
throw $this->createNotFoundException();
$items = $entityManager->getRepository(StackContent::class)->findBy(
[
'upper'=>$upper,
]
);
$response = [];
foreach ($items as $item){
$temp = [];
$temp['id'] = $item->getId();
$temp['title'] = $item->getTitle();
$temp['body'] = $item->getBody();
$temp['submitter'] = $item->getSubmitter()->getFullName();
$temp['dateSubmit'] = $jdate->pastTime($item->getDateSubmit());
$temp['cat'] = $item->getCat()->getName();
$temp['views'] = $item->getViews();
$temp['url'] = $item->getUrl();
$temp['submitter_gravatar_hash'] = $provider->gravatarHash($item->getSubmitter()->getEmail());
$response[] = $temp;
}
return $this->json($response);
}
#[Route('/api/stack/content/get/{url}', name: 'app_stack_content_get')]
public function app_stack_content_get($url,Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$item = $entityManager->getRepository(StackContent::class)->findOneBy(['url'=>$url]);
if(!$item)
throw $this->createNotFoundException();
$response = [];
$response['id'] = $item->getId();
$response['title'] = $item->getTitle();
$response['body'] = $item->getBody();
$response['submitter'] = $item->getSubmitter()->getFullName();
$response['dateSubmit'] = $jdate->pastTime($item->getDateSubmit());
$response['cat'] = $item->getCat()->getName();
$response['views'] = $item->getViews();
$response['url'] = $url;
$response['submitter_gravatar_hash'] = $provider->gravatarHash($item->getSubmitter()->getEmail());
return $this->json($response);
}
#[Route('/api/stack/content/getbyid/{id}', name: 'app_stack_content_get_by_id')]
public function app_stack_content_get_by_id($id,Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$item = $entityManager->getRepository(StackContent::class)->find($id);
if(!$item)
throw $this->createNotFoundException();
$response = [];
$response['id'] = $item->getId();
$response['title'] = $item->getTitle();
$response['body'] = $item->getBody();
$response['submitter'] = $item->getSubmitter()->getFullName();
$response['dateSubmit'] = $jdate->pastTime($item->getDateSubmit());
$response['cat'] = $item->getCat()->getName();
$response['views'] = $item->getViews();
$response['url'] = $item->getUrl();
$response['submitter_gravatar_hash'] = $provider->gravatarHash($item->getSubmitter()->getEmail());
return $this->json($response);
}
#[Route('/api/stack/content/increase/view/{url}', name: 'app_stack_content_increase_view')]
public function app_stack_content_increase_view($url,Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$item = $entityManager->getRepository(StackContent::class)->findOneBy(['url'=>$url]);
$item->setViews($item->getViews() + 1);
$entityManager->persist($item);
$entityManager->flush();
return $this->json([
'error' => 0,
'result' => 'ok'
]);
}
#[Route('/api/stack/stat/get', name: 'app_stack_stat_get')]
public function app_stack_stat_get(Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$response = [];
$response['replayCount'] = $entityManager->getRepository(StackContent::class)->getAllReplayCount();
$response['questionCount'] = $entityManager->getRepository(StackContent::class)->getStackCount();;
return $this->json($response);
}
#[Route('/api/stack/content/delete/{url}', name: 'app_stack_content_delete')]
public function app_stack_content_delete($url,Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$content = $entityManager->getRepository(StackContent::class)->findOneBy(['url'=>$url]);
if(!$content)
throw $this->createNotFoundException();
if($content->getSubmitter() === $this->getUser()){
if(! $content->getUpper()){
$items = $entityManager->getRepository(StackContent::class)->findBy([
'upper'=>$content,
]);
foreach ($items as $item){
$entityManager->getRepository(StackContent::class)->remove($item,true);
}
}
$entityManager->getRepository(StackContent::class)->remove($content,true);
return $this->json([
'error' => 0,
'result' => 'ok'
]);
}
throw $this->createAccessDeniedException();
}
#[Route('/api/stack/content/deletebyid/{id}', name: 'app_stack_content_delete_by_id')]
public function app_stack_content_delete_by_id($id,Jdate $jdate, Provider $provider,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$content = $entityManager->getRepository(StackContent::class)->find($id);
if(!$content)
throw $this->createNotFoundException();
if($content->getSubmitter() === $this->getUser()){
if(! $content->getUpper()){
$items = $entityManager->getRepository(StackContent::class)->findBy([
'upper'=>$content,
]);
foreach ($items as $item){
$entityManager->getRepository(StackContent::class)->remove($item,true);
}
}
$entityManager->getRepository(StackContent::class)->remove($content,true);
return $this->json([
'error' => 0,
'result' => 'ok'
]);
}
throw $this->createAccessDeniedException();
}
#[Route('/api/stack/edit/{id}', name: 'app_stack_content_edit')]
public function app_stack_content_edit($id,Request $request,SerializerInterface $serializer, EntityManagerInterface $entityManager): JsonResponse
{
$params = [];
if ($content = $request->getContent()) {
$params = json_decode($content, true);
}
if(array_key_exists('title',$params) && array_key_exists('cat',$params) && array_key_exists('body',$params )){
$stack = $entityManager->getRepository(StackContent::class)->find($id);
if(! $stack)
throw $this->createNotFoundException();
$cat = $entityManager->getRepository(StackCat::class)->find($params['cat']);
$stack->setBody($params['body']);
$stack->setCat($cat);
$stack->setTitle($params['title']);
$entityManager->persist($stack);
$entityManager->flush();
return $this->json([
'error'=> 0,
'message'=> 'ok',
'url'=>$stack->getUrl()
]);
}
return $this->json([
'error'=> 999,
'message'=> 'تمام موارد لازم را وارد کنید.'
]);
}
}