<?php
namespace App\Controller;
use App\Repository\StoreRepository;
use App\Service\ShopifyService;
use App\Service\CalculateService;
use Doctrine\ORM\NonUniqueResultException;
use Exception;
use Maknz\Slack\Client;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Class HookController
* @Route("hook")
*/
class HookController extends AbstractController
{
/**
* @Route("/calculate", name="hook_calculate")
*/
public function calculate(Request $request, LoggerInterface $shopifyLogger, CalculateService $calculateService, StoreRepository $storeRepository)
{
$shopifyDomain = $request->headers->get('X-Shopify-Shop-Domain');
$sender = $request->headers->get('X-Sender');
$shopifyLogger->debug('Checkout-Shipping Calculate :: $ourVar', [
'domain' => $shopifyDomain,
'our_var' => $request->getContent()
]);
$store = $storeRepository->findOneByDomain($shopifyDomain);
$shipment_request = json_decode($request->getContent());
if ( $sender ) {
$this->sendSlack('Sender: ' . $sender);
}
if ( is_object($store) && is_object($shipment_request) ) {
$this->sendSlack('Domain: ' . $shopifyDomain);
$this->sendSlack('İstek İçerik: ');
$this->sendSlack($request->getContent());
try {
$shipment_rates = $calculateService->calculateShipment($shipment_request, $store);
$this->sendSlack('İstek içerik: ');
$this->sendSlack($request->getContent());
$this->sendSlack('Fiyatlar: ');
$this->sendSlack(json_encode($shipment_rates));
return new JsonResponse($shipment_rates['rates']);
} catch (NonUniqueResultException $e) {
$this->sendSlack('#E >= ' . $request->getContent() );
$this->sendSlack($e->getMessage());
$this->sendSlack($shipment_request);
}
} else if ( ! is_object($store) ) {
$this->sendSlack('Domain Bulunamadı!');
} else {
$this->sendSlack('Domain: ' . $shopifyDomain);
$this->sendSlack('İstek İçerik Hata: ');
$this->sendSlack($request->getContent());
}
$this->sendSlack('İstek içerik: ');
$this->sendSlack($request->getContent());
return new JsonResponse([
'error' => 'Here I am!'
]);
}
/**
* @Route("/", methods={"GET"})
*/
public function index(Request $request, StoreRepository $storeRepository)
{
$webHooks = ['empty'];
$shopifyDomain = $request->headers->get('X-Shopify-Shop-Domain');
$store = $storeRepository->findOneByDomain($shopifyDomain);
if ( $store ) {
$shopifyService = new ShopifyService($store);
try {
$webHooks = $shopifyService->getWebHooks();
} catch (ApiException|CurlException $e) {
}
}
return new JsonResponse($webHooks);
}
/**
* @Route("/create", methods={"GET"})
*/
public function createHook(Request $request, StoreRepository $storeRepository)
{
$shopifyDomain = $request->headers->get('X-Shopify-Shop-Domain');
$store = $storeRepository->findOneByDomain($shopifyDomain);
$hooks = [
[
"topic" => "checkouts/update",
"address" => 'https://parcelapp.rakitaapps.com' . $this->generateUrl('hook_calculate', [], UrlGeneratorInterface::ABSOLUTE_PATH),
"api_version" => '2023-01'
]
];
if ( $store ) {
$shopifyService = new ShopifyService($store);
foreach ( $hooks as $hook ) {
$shopifyService->checkWebHook($hook['topic'], $hook['address']);
$this->sendSlack("Info: Webhooks created, please check from shopify panel.");
}
}
return new JsonResponse([]);
}
/**
* @Route("/delete", methods={"GET"})
*/
public function deleteHook(Request $request, StoreRepository $storeRepository)
{
$shopifyDomain = $request->headers->get('X-Shopify-Shop-Domain');
$id = (int) $request->get('id');
$store = $storeRepository->findOneByDomain($shopifyDomain);
$result = [
'status' => false
];
if ( $store && $id ) {
$shopifyService = new ShopifyService($store);
$result = $shopifyService->deleteWebHook($id);
return new JsonResponse($result);
}
}
private function sendSlack($message)
{
$client = new Client('https://hooks.slack.com/services/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', [
'username' => 'computer',
'channel' => '#cargo_request_log',
'link_names' => true
]);
try {
$client->send($message);
} catch (Exception $e) {
}
}
}