<?php
namespace App\Controller\Admin\API\Flight;
use App\Entity\FlightAvailabilityRequest;
use App\Service\ApiLogService;
use App\Service\Flight\FlightService;
use App\Service\GenericApiService;
use App\Service\Helpers;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use function PHPUnit\Framework\isEmpty;
class FlightApiController extends AbstractController
{
public function __construct(
private readonly FlightService $flightService,
private readonly GenericApiService $genericApiService,
private readonly Helpers $helpers,
private readonly ApiLogService $apiLogService,
)
{
}
#[Route('/api/flight/autocomplete', name: 'app_api_flight_autocomplete', methods: ['GET'])]
public function autocomplete(Request $request): Response
{
$headers = ['ApiKey' => $request->headers->get('Apikey'),];
$securityResult = $this->genericApiService->checkAuthorization($headers);
$customer = $securityResult['customer'];
// Error
if ($securityResult['error']) {
return $this->json([
'method' => "autocomplete",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
// No Security Error
$keyword = $request->query->get('keyword');
$parameters = [
'keyword' => $keyword
];
$locations = $this->flightService->getAirportsAndCities($parameters);
$response = [
'method' => "autocomplete",
'error' => false,
'ip_address' => $securityResult['ipAddress'],
'customer_id' => ($customer !== null) ? $customer->getId() : 0,
'locations' => $locations,
];
return $this->json($response);
}
#[Route('/api/flight/availability', name: 'app_api_flight_availability')]
public function availability(Request $request): Response
{
$start_time = microtime(true);
$headers = [
'ApiKey' => $request->headers->get('Apikey'),
'sourceId' => $request->headers->get('sourceId', 0)
];
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "availability",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
// No Security Error
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true) ?? [];
$requestError = FlightAvailabilityRequest::checkParameters($parameters);
if ($requestError != "") {
return $this->json(['errorMessage' => $requestError, 'errorCode' => 400]);
}
$searchCode = '';
$flightOffers = [];
try {
$flightSearchRequest = FlightAvailabilityRequest::constructWithParameters($parameters, $customer);
if ($headers['sourceId'] > 0) {
$flightSearchRequest->setSourceId($headers['sourceId']);
}
$id = $this->apiLogService->logApiCall($request, $start_time, '200', 'WAITING', $customer, $user, null);
$arraySearchCode = [
'id' => $id,
];
$searchCode = $this->helpers->encryptSerializedData($arraySearchCode);
$flightOffers = $this->flightService->searchOffers($flightSearchRequest, $user, $searchCode);
$this->apiLogService->setLogDetail($id, '200', implode($flightOffers['messages']) , $start_time);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'availability',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
$response = [
'error' => false,
'message' => '',
'ip_address' => $securityResult['ipAddress'],
'customer' => $securityResult['customerId'],
'searchCode' => $searchCode,
'content' => $flightOffers,
];
return $this->json($response);
}
#[Route('/api/flight/checkrate', name: 'app_api_flight_offer_checkrate')]
public function checkrate(Request $request): Response
{
$start_time = microtime(true);
$headers = ['ApiKey' => $request->headers->get('Apikey')];
$searchCode = $request->headers->get('searchCode');
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "checkrate",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$checkRateOffer = [];
try {
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true);
$sourceId = $request->headers->get('sourceId') ?? $parameters['sourceId'];
$checkRateOffer = $this->flightService->checkRate($parameters, $sourceId, $user, $searchCode);
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $checkRateOffer);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'checkrate',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
$error = $checkRateOffer['error'] ?? false;
$message = $checkRateOffer['providerMessage'] ?? "";
$response = [
'error' => $error,
'message' => $message,
'ip_address' => $securityResult['ipAddress'],
'customer' => $securityResult['customerId'],
'searchCode' => '',
'content' => $checkRateOffer,
];
return $this->json($response);
}
#[Route('/api/flight/getFareRules', name: 'app_api_flight_offer_fareRules')]
public function getFareRules(Request $request): Response
{
$start_time = microtime(true);
$headers = ['ApiKey' => $request->headers->get('Apikey')];
$searchCode = $request->headers->get('searchCode');
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "getFareRules",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$checkRateOffer = [];
try {
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true);
$sourceId = $request->headers->get('sourceId') ?? $parameters['sourceId'];
$checkRateOffer = $this->flightService->fareRules($parameters, $sourceId);
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $checkRateOffer);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'getFareRules',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
$error = $checkRateOffer['error'] ?? false;
$message = $checkRateOffer['providerMessage'] ?? "";
$response = [
'error' => $error,
'message' => $message,
'ip_address' => $securityResult['ipAddress'],
'customer' => $securityResult['customerId'],
'searchCode' => '',
'content' => $checkRateOffer,
];
return $this->json($response);
}
#[Route('/api/flight/createPnr', name: 'app_api_flight_order_create_pnr')]
public function createPnr(Request $request): JsonResponse
{
$start_time = microtime(true);
$headers = ['ApiKey' => $request->headers->get('Apikey')];
$searchCode = $request->headers->get('searchCode') ?? '';
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "createPnr",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$message = "";
$content = [];
try {
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true);
$sourceId = $request->headers->get('sourceId');// $parameters['sourceId'];
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $content);
$content = $this->flightService->createPnr($parameters, $sourceId, $user, $message, $searchCode);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'createPnr',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
$error = (isset($content['error']) && $content['error']) || (count($content) == 0);
return $this->json([
'error' => $error,
'message' => (!empty($message) ? $message : ''),
'ip_address' => $securityResult['ipAddress'],
'customer_id' => $securityResult['customerId'],
'content' => $content,
]);
}
#[Route('/api/flight/orderDetail', name: 'app_api_flight_order_detail')]
public function orderDetail(Request $request): Response
{
$start_time = microtime(true);
$headers = ['ApiKey' => $request->headers->get('Apikey')];
$sourceId = $request->headers->get('sourceId') ?? 1;
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "orderDetails",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$response = [];
try {
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true);
$orderId = $parameters['orderId'];
$response = $this->flightService->getOrderDetail($sourceId, $orderId);
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $response);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'orderDetail',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
return $this->json($response);
}
#[Route('/api/flight/cancel', name: 'app_api_flight_order_cancel')]
public function cancel(Request $request): Response
{
$start_time = microtime(true);
$headers = ['ApiKey' => $request->headers->get('ApiKey')];
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "orderDetails",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$response = [];
try {
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true);
$orderId = $parameters['orderId'];
$sourceId = $request->headers->get('sourceId') ?? null;
$response = $this->flightService->cancelOrder($sourceId, $orderId, $user);
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $response);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'cancel',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
return $this->json($response);
}
#[Route('/api/flight/confirm', name: 'app_api_flight_order_confirm')]
public function orderConfirm(Request $request): Response
{
$start_time = microtime(true);
$sourceId = $request->headers->get('sourceId');
$headers = ['ApiKey' => $request->headers->get('ApiKey')];
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "orderDetails",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$response = [];
try {
$requestJson = $request->getContent();
$data = json_decode($requestJson, true);
$orderId = $data['orderId'];
$confirmDate = $data['confirmDate'];
$response = $this->flightService->orderConfirm($sourceId, $orderId, $confirmDate);
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $response);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'availability',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
return $this->json($response);
}
#[Route('/api/flight/issue', name: 'app_api_flight_order_issuance_tickets')]
public function issuanceTickets(Request $request): Response
{
$start_time = microtime(true);
$sourceId = $request->headers->get('sourceId');
$headers = ['ApiKey' => $request->headers->get('ApiKey')];
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "issue",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$response = [];
try {
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true);
$response = $this->flightService->issueTickets($sourceId, $parameters, $user);
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $response);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'issue',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
return $this->json($response);
}
#[Route('/api/flight/void', name: 'app_api_flight_void_ticket')]
public function voidTicket(Request $request): Response
{
$start_time = microtime(true);
$sourceId = $request->headers->get('sourceId');
$headers = ['ApiKey' => $request->headers->get('ApiKey')];
$securityResult = $this->genericApiService->checkAuthorization($headers);
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "orderDetails",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$response = [];
try {
$requestJson = $request->getContent();
$parameters = json_decode($requestJson, true);
$response = $this->flightService->voidOrder($sourceId, $parameters, $user);
$this->apiLogService->logApiCall($request, $start_time, '200', 'OK', $customer, $user, $response);
} catch (Exception $e) {
$errorResponse = [
'api' => '/api/flight/',
'method' => 'issue',
'content' => null,
'status' => 500,
'error' => true,
'message' => $e->getMessage(),
'executionTime' => microtime(true) - $start_time
];
// Log error with req + err_res
$this->apiLogService->logApiCall($request, $start_time, '500', 'Internal Server Error', $customer, $user, $errorResponse);
}
return $this->json($response);
}
#[Route('/api/flight/GDS', name: 'app_api_flight_gds_list', methods: ['GET'])]
public function gdsList(Request $request): Response
{
$start_time = microtime(true);
$headers = ['ApiKey' => $request->headers->get('Apikey')];
$securityResult = $this->genericApiService->checkAuthorization($headers);
$client = $securityResult['customer'];
// Error
if ($securityResult['error']) {
$this->apiLogService->logApiCall($request, $start_time, '401', 'Authentication Error');
return $this->json([
'method' => "gdsList",
'error' => true,
'message' => $securityResult['message'],
'ip_address' => $securityResult['ipAddress'],
], 400);
}
$customer = $securityResult['customer'];
$user = $securityResult['User'];
$gds_list = $this->flightService->getGDSList($client);
$response = [
'method' => "autocomplete",
'error' => false,
'ip_address' => $securityResult['ipAddress'],
'customer_id' => ($client !== null) ? $client->getId() : 0,
'gdsList' => $gds_list,
];
return $this->json($response);
}
}