src/Controller/API/ReleaseInfoController.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\Controller\API;
  3. use Symfony\Component\Routing\Annotation\Route;
  4. use Symfony\Component\HttpFoundation\{RequestJsonResponse};
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Doctrine\ORM\Query\Expr\Join;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use App\Utils\Pagination\Pagination;
  9. use App\Entity\{ReleaseDescriptionRelease};
  10. use App\Auth\TokenAuth;
  11. class ReleaseInfoController extends AbstractController
  12. {
  13.     public function __construct(
  14.         private TokenAuth $tokenAuth,
  15.         private EntityManagerInterface $em
  16.     ) {
  17.     }
  18.     #[Route('/check_release_description'name'release_info.check_release_description')]
  19.     public function isReleaseDescription(Request $request): JsonResponse
  20.     {
  21.         $locale $request->query->get('locale''ru');
  22.         if (!$version $request->query->get('version')) {
  23.             throw $this->createNotFoundException('No version provided');
  24.         }
  25.         if (!$project $this->tokenAuth->getCustomerByToken()->getProject()) {
  26.             throw $this->createNotFoundException('Unknown project');
  27.         }
  28.         if (!$customerRelease $this->em->getRepository(Release::class)->getReleaseByVersion($project$version)) {
  29.             throw $this->createNotFoundException('Unknown release');
  30.         }
  31.         $isDescription false;
  32.         foreach ($customerRelease->getDescriptions() as $description) {
  33.             if ($description->getLocale() == $locale && !is_null($description->getText())) {
  34.                 $isDescription true;
  35.                 break;
  36.             }
  37.         }
  38.         $result = [
  39.             'version' => $customerRelease->getVersion(),
  40.             'isDescription' => $isDescription
  41.         ];
  42.         return new JsonResponse($result);
  43.     }
  44.     #[Route('/release_info'name'release_info.get')]
  45.     public function getReleaseInfo(Request $request): JsonResponse
  46.     {
  47.         $locale $request->query->get('locale''ru');
  48.         $version $request->query->get('version');
  49.         if (!$project $this->tokenAuth->getCustomerByToken()->getProject()) {
  50.             throw $this->createNotFoundException('Unknown project');
  51.         }
  52.         $paginator Pagination::create($request);
  53.         $repository $this->em->getRepository(Release::class);
  54.         $versionObject $version $repository->getReleaseByVersion($project$version) : null;
  55.         $versionObject $versionObject ?? $repository->getLastReleaseByProject($project);
  56.         $query $repository
  57.             ->createQueryBuilder('r')
  58.             ->innerJoin(ReleaseDescription::class, 'rd'Join::WITH'r.id = rd.release AND rd.locale = :locale')
  59.             ->where('r.project = :projectId AND r.id <= :id AND rd.text IS NOT NULL')
  60.             ->setParameter('locale'$locale)
  61.             ->setParameter('projectId'$project->getId())
  62.             ->setParameter('id'$versionObject->getId())
  63.             ->orderBy('r.id''DESC');
  64.         $releases $paginator->paginate($query);
  65.         $result = [
  66.             'items' => $this->transformReleaseInfoList($releases$locale),
  67.             'pagination' => $paginator
  68.         ];
  69.         return new JsonResponse($result);
  70.     }
  71.     private function transformReleaseInfoList(array $releasesstring $locale): array
  72.     {
  73.         $result = [];
  74.         $locale $locale ?? 'ru';
  75.         foreach ($releases as $release) {
  76.             $descriptionLocale '';
  77.             foreach ($release->getDescriptions() as $description) {
  78.                 if ($description->getLocale() == $locale) {
  79.                     $descriptionLocale $description->getText() ?? '';
  80.                 }
  81.             }
  82.             $result[] = [
  83.                 'title' => $release->getVersion(),
  84.                 'description' => $descriptionLocale,
  85.                 'date' => $release->getCreated()
  86.             ];
  87.         }
  88.         return $result;
  89.     }
  90. }