<?php
namespace App\Controller;
use App\Common\API\APICommon;
use App\Common\SqlSrvConnector;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Class OAIController
*
* @package App\Controller
*/
#[Route(path: '/assignmentDatabase')]
class AssignmentDatabaseController extends AbstractController
{
private SqlSrvConnector $connector;
public function __construct()
{
$this->connector = new SqlSrvConnector();
}
/**
* JSON list of assignments media meeting query request
*
*
*/
#[Route(path: '/')]
public function downloadFile(): JsonResponse
{
$responseData = [];
// Open DB
$this->connector->makeConnection();
// Get all objects query
$fullQuery = "
SELECT adExhibition.AusID AS ExhibitionID, adExhibition.ExhibitionName AS ExhibitionName, adMultimedia.MulDstindexL, adMultimedia.MulID AS MultimediaID, adMultimedia.Multimedia,
adMultimedia.RefID
FROM adExhibition
JOIN adMultimedia ON adExhibition.AusID = adMultimedia.RefID
WHERE adMultimedia.MulDstindexL = '40'
AND adExhibition.ExhibitionType = 'Assignment Database'";
// Add limiter since MSSQL doesn't have LIMIT and OFFSET
$limitedQuery = "WITH Results_CTE AS ( {$fullQuery} ) SELECT * FROM Results_CTE WHERE RowNum >= %d AND RowNum < %d;";
// Initial query
$query = sqlsrv_query(
$this->connector->getConnection(),
$fullQuery
);
// Loop through result set
while ($row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC)) {
$multimedia = explode('.', $row['Multimedia']);
$responseData[] = [
"ExhibitionID" => $row['ExhibitionID'],
"MultimediaID" => $row['MultimediaID'],
"RefID" => $row['RefID'],
"ExhibitionName" => $row['ExhibitionName'],
"multimedia" => $this->generateUrl(
'ad_media',
[
'ExhibitionID' => $row['ExhibitionID'],
'MultimediaID' => $row['MultimediaID'],
'RefID' => $row['RefID'],
'ext' => end($multimedia),
],
UrlGeneratorInterface::ABSOLUTE_URL
),
];
}
// Clear memory
sqlsrv_free_stmt($query);
gc_collect_cycles();
$this->connector->closeConnection();
//Return JSON
return new JsonResponse($responseData);
}
/**
* Get multimedia asset.
*
*
* @param $ExhibitionID
* @param $MultimediaID
* @param $RefID
*/
#[Route(path: '/asset/{ExhibitionID}/{MultimediaID}/{RefID}.{ext}', name: 'ad_media', requirements: [
'ExhibitionID' => '\d+',
'MultimediaID' => '\d+',
'RefID' => '\d+',
'ext' => '.+',
])]
public function objectAsset($ExhibitionID, $MultimediaID, $RefID): BinaryFileResponse
{
// Open DB
$this->connector->makeConnection();
// Get media item
$stringQuery = "
SELECT adExhibition.AusID, adMultimedia.MulDstindexL, adMultimedia.MulID, adMultimedia.Multimedia, adMultimedia.RefID
FROM adExhibition
JOIN adMultimedia ON adExhibition.AusID = adMultimedia.RefID
WHERE adMultimedia.MulDstindexL = '40'
AND adExhibition.ExhibitionType = 'Assignment Database'
AND adExhibition.AusID = {$ExhibitionID}
AND adMultimedia.MulID = {$MultimediaID}
AND adMultimedia.RefID = {$RefID};";
// Initial query
$query = sqlsrv_query(
$this->connector->getConnection(),
$stringQuery
);
$mediaRow = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC);
if (!$mediaRow) {
// Asset not found. Kill process.
throw new NotFoundHttpException('Object not found.');
}
// Clear memory
sqlsrv_free_stmt($query);
gc_collect_cycles();
// Close connection
$this->connector->closeConnection();
// Adjust path
$remoteAsset = APICommon::convertAssetPath($mediaRow['Multimedia']);
if (!file_exists($remoteAsset) || filesize($remoteAsset) <= 0) {
// Asset not found. Kill process.
throw new NotFoundHttpException('Asset not found.');
}
// Get last modified time.
$lastModified = filemtime($remoteAsset);
// Getting headers sent by the client.
$headers = getallheaders();
// Checking if the client is validating its cache and if it is current.
if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $lastModified)) {
// Client's cache IS current, so we just respond '304 Not Modified'.
header("Last-Modified: " . gmdate('D, d M Y H:i:s', $lastModified) . " GMT", true, 304);
exit;
}
$array = explode("/", $remoteAsset);
$pdfFilename = end($array);
$response = new BinaryFileResponse($remoteAsset);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
$pdfFilename
);
$response->headers->add(["Last-Modified" => gmdate('D, d M Y H:i:s', $lastModified) . " GMT"]);
return $response;
}
}