<?php
namespace App\Controller\API;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\{Request, JsonResponse};
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\EntityManagerInterface;
use App\Utils\Pagination\Pagination;
use App\Entity\{ReleaseDescription, Release};
use App\Auth\TokenAuth;
class ReleaseInfoController extends AbstractController
{
public function __construct(
private TokenAuth $tokenAuth,
private EntityManagerInterface $em
) {
}
#[Route('/check_release_description', name: 'release_info.check_release_description')]
public function isReleaseDescription(Request $request): JsonResponse
{
$locale = $request->query->get('locale', 'ru');
if (!$version = $request->query->get('version')) {
throw $this->createNotFoundException('No version provided');
}
if (!$project = $this->tokenAuth->getCustomerByToken()->getProject()) {
throw $this->createNotFoundException('Unknown project');
}
if (!$customerRelease = $this->em->getRepository(Release::class)->getReleaseByVersion($project, $version)) {
throw $this->createNotFoundException('Unknown release');
}
$isDescription = false;
foreach ($customerRelease->getDescriptions() as $description) {
if ($description->getLocale() == $locale && !is_null($description->getText())) {
$isDescription = true;
break;
}
}
$result = [
'version' => $customerRelease->getVersion(),
'isDescription' => $isDescription
];
return new JsonResponse($result);
}
#[Route('/release_info', name: 'release_info.get')]
public function getReleaseInfo(Request $request): JsonResponse
{
$locale = $request->query->get('locale', 'ru');
$version = $request->query->get('version');
if (!$project = $this->tokenAuth->getCustomerByToken()->getProject()) {
throw $this->createNotFoundException('Unknown project');
}
$paginator = Pagination::create($request);
$repository = $this->em->getRepository(Release::class);
$versionObject = $version ? $repository->getReleaseByVersion($project, $version) : null;
$versionObject = $versionObject ?? $repository->getLastReleaseByProject($project);
$query = $repository
->createQueryBuilder('r')
->innerJoin(ReleaseDescription::class, 'rd', Join::WITH, 'r.id = rd.release AND rd.locale = :locale')
->where('r.project = :projectId AND r.id <= :id AND rd.text IS NOT NULL')
->setParameter('locale', $locale)
->setParameter('projectId', $project->getId())
->setParameter('id', $versionObject->getId())
->orderBy('r.id', 'DESC');
$releases = $paginator->paginate($query);
$result = [
'items' => $this->transformReleaseInfoList($releases, $locale),
'pagination' => $paginator
];
return new JsonResponse($result);
}
private function transformReleaseInfoList(array $releases, string $locale): array
{
$result = [];
$locale = $locale ?? 'ru';
foreach ($releases as $release) {
$descriptionLocale = '';
foreach ($release->getDescriptions() as $description) {
if ($description->getLocale() == $locale) {
$descriptionLocale = $description->getText() ?? '';
}
}
$result[] = [
'title' => $release->getVersion(),
'description' => $descriptionLocale,
'date' => $release->getCreated()
];
}
return $result;
}
}