src/Controller/AssignmentDatabaseController.php line 99

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Common\API\APICommon;
  4. use App\Common\SqlSrvConnector;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  9. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. /**
  13.  * Class OAIController
  14.  *
  15.  * @package App\Controller
  16.  */
  17. #[Route(path'/assignmentDatabase')]
  18. class AssignmentDatabaseController extends AbstractController
  19. {
  20.     private SqlSrvConnector $connector;
  21.     public function __construct()
  22.     {
  23.         $this->connector = new SqlSrvConnector();
  24.     }
  25.     /**
  26.      * JSON list of assignments media meeting query request
  27.      *
  28.      *
  29.      */
  30.     #[Route(path'/')]
  31.     public function downloadFile(): JsonResponse
  32.     {
  33.         $responseData = [];
  34.         // Open DB
  35.         $this->connector->makeConnection();
  36.         // Get all objects query
  37.         $fullQuery "
  38.             SELECT adExhibition.AusID AS ExhibitionID, adExhibition.ExhibitionName AS ExhibitionName, adMultimedia.MulDstindexL, adMultimedia.MulID AS MultimediaID, adMultimedia.Multimedia,
  39.             adMultimedia.RefID
  40.             FROM adExhibition
  41.             JOIN adMultimedia ON adExhibition.AusID = adMultimedia.RefID
  42.             WHERE adMultimedia.MulDstindexL = '40'
  43.               AND adExhibition.ExhibitionType = 'Assignment Database'";
  44.         // Add limiter since MSSQL doesn't have LIMIT and OFFSET
  45.         $limitedQuery "WITH Results_CTE AS ( {$fullQuery} ) SELECT * FROM Results_CTE WHERE RowNum >= %d AND RowNum < %d;";
  46.         // Initial query
  47.         $query sqlsrv_query(
  48.             $this->connector->getConnection(),
  49.             $fullQuery
  50.         );
  51.         // Loop through result set
  52.         while ($row sqlsrv_fetch_array($querySQLSRV_FETCH_ASSOC)) {
  53.             $multimedia explode('.'$row['Multimedia']);
  54.             $responseData[] = [
  55.                 "ExhibitionID" => $row['ExhibitionID'],
  56.                 "MultimediaID" => $row['MultimediaID'],
  57.                 "RefID" => $row['RefID'],
  58.                 "ExhibitionName" => $row['ExhibitionName'],
  59.                 "multimedia" => $this->generateUrl(
  60.                     'ad_media',
  61.                     [
  62.                         'ExhibitionID' => $row['ExhibitionID'],
  63.                         'MultimediaID' => $row['MultimediaID'],
  64.                         'RefID' => $row['RefID'],
  65.                         'ext' => end($multimedia),
  66.                     ],
  67.                     UrlGeneratorInterface::ABSOLUTE_URL
  68.                 ),
  69.             ];
  70.         }
  71.         // Clear memory
  72.         sqlsrv_free_stmt($query);
  73.         gc_collect_cycles();
  74.         $this->connector->closeConnection();
  75.         //Return JSON
  76.         return new JsonResponse($responseData);
  77.     }
  78.     /**
  79.      * Get multimedia asset.
  80.      *
  81.      *
  82.      * @param $ExhibitionID
  83.      * @param $MultimediaID
  84.      * @param $RefID
  85.      */
  86.     #[Route(path'/asset/{ExhibitionID}/{MultimediaID}/{RefID}.{ext}'name'ad_media'requirements: [
  87.         'ExhibitionID' => '\d+',
  88.         'MultimediaID' => '\d+',
  89.         'RefID' => '\d+',
  90.         'ext' => '.+',
  91.     ])]
  92.     public function objectAsset($ExhibitionID$MultimediaID$RefID): BinaryFileResponse
  93.     {
  94.         // Open DB
  95.         $this->connector->makeConnection();
  96.         // Get media item
  97.         $stringQuery "
  98.             SELECT adExhibition.AusID, adMultimedia.MulDstindexL, adMultimedia.MulID, adMultimedia.Multimedia, adMultimedia.RefID
  99.             FROM adExhibition
  100.             JOIN adMultimedia ON adExhibition.AusID = adMultimedia.RefID
  101.             WHERE adMultimedia.MulDstindexL = '40'
  102.               AND adExhibition.ExhibitionType = 'Assignment Database'
  103.               AND adExhibition.AusID = {$ExhibitionID}
  104.               AND adMultimedia.MulID = {$MultimediaID}
  105.               AND adMultimedia.RefID = {$RefID};";
  106.         // Initial query
  107.         $query sqlsrv_query(
  108.             $this->connector->getConnection(),
  109.             $stringQuery
  110.         );
  111.         $mediaRow sqlsrv_fetch_array($querySQLSRV_FETCH_ASSOC);
  112.         if (!$mediaRow) {
  113.             // Asset not found. Kill process.
  114.             throw new NotFoundHttpException('Object not found.');
  115.         }
  116.         // Clear memory
  117.         sqlsrv_free_stmt($query);
  118.         gc_collect_cycles();
  119.         // Close connection
  120.         $this->connector->closeConnection();
  121.         // Adjust path
  122.         $remoteAsset APICommon::convertAssetPath($mediaRow['Multimedia']);
  123.         if (!file_exists($remoteAsset) || filesize($remoteAsset) <= 0) {
  124.             // Asset not found. Kill process.
  125.             throw new NotFoundHttpException('Asset not found.');
  126.         }
  127.         // Get last modified time.
  128.         $lastModified filemtime($remoteAsset);
  129.         // Getting headers sent by the client.
  130.         $headers getallheaders();
  131.         // Checking if the client is validating its cache and if it is current.
  132.         if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $lastModified)) {
  133.             // Client's cache IS current, so we just respond '304 Not Modified'.
  134.             header("Last-Modified: " gmdate('D, d M Y H:i:s'$lastModified) . " GMT"true304);
  135.             exit;
  136.         }
  137.         $array explode("/"$remoteAsset);
  138.         $pdfFilename end($array);
  139.         $response = new BinaryFileResponse($remoteAsset);
  140.         $response->setContentDisposition(
  141.             ResponseHeaderBag::DISPOSITION_INLINE,
  142.             $pdfFilename
  143.         );
  144.         $response->headers->add(["Last-Modified" => gmdate('D, d M Y H:i:s'$lastModified) . " GMT"]);
  145.         return $response;
  146.     }
  147. }