<?php
namespace App\EventSubscriber;
use App\Entity\ProviderSibelga;
use App\Entity\ProviderSibelgaWork;
use App\Entity\ProviderSociety;
use App\Entity\ProviderSolar;
use App\Mybase\Services\Base\SBase;
use App\Repository\ProviderSibelgaRepository;
use App\Repository\ProviderSibelgaWorkRepository;
use App\Repository\ProviderSocietyRepository;
use App\Repository\ProviderSolarRepository;
use App\Repository\ThepropertyRepository;
use App\Service\TraitementUrl;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
class ProviderServiceSubscriber implements EventSubscriberInterface
{
/**
* @var ProviderSibelgaRepository
*/
private $providerSibelgaRepository;
/**
* @var SBase
*/
private $base;
/**
* @var ProviderSibelgaWorkRepository
*/
private $providerSibelgaWorkRepository;
/**
* @var ProviderSocietyRepository
*/
private $providerSocietyRepository;
/**
* @var ThePropertyRepository
*/
private $thePropertyRepository;
/**
* @var ProviderSolarRepository
*/
private $providerSolarRepository;
/**
* @var TraitementUrl
*/
private $traitementUrl;
public function __construct(
ProviderSibelgaRepository $providerSibelgaRepository,
SBase $base,
ProviderSibelgaWorkRepository $providerSibelgaWorkRepository,
ProviderSocietyRepository $providerSocietyRepository,
ThepropertyRepository $thePropertyRepository,
ProviderSolarRepository $providerSolarRepository,
TraitementUrl $traitementUrl)
{
$this->providerSibelgaRepository = $providerSibelgaRepository;
$this->base = $base;
$this->providerSibelgaWorkRepository = $providerSibelgaWorkRepository;
$this->providerSocietyRepository = $providerSocietyRepository;
$this->thePropertyRepository = $thePropertyRepository;
$this->providerSolarRepository = $providerSolarRepository;
$this->traitementUrl = $traitementUrl;
}
/**
* @return void
*/
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$object = $request->attributes->get('_api_resource_class');
$data = $request->query;
//List Fournisseur Sibelga
if (
$object === ProviderSibelga::class
&& $request->getMethod() === 'GET'
) {
$datas = $this->providerSibelgaRepository->findByCaracteristic($data->get('task'), $data->get('work'), $data->get('type'));
if ($datas === null) {
$event->setResponse($this->base->jsonResponseNotFound('Aucun service sibelga trouvé'));
return;
}
$datas = $this->base->serialize($datas, 'json', ['groups' => 'sibelga:read']);
$event->setResponse($this->base->jsonResponseOk($datas, 'List des services sibelga'));
}
//List Fournisseur Sibelga Work
if (
$object === ProviderSibelgaWork::class
&& $request->getMethod() === 'GET'
) {
$datas = $this->providerSibelgaWorkRepository->find($data->get('task'));
if (!$datas instanceof \App\Entity\ProviderSibelgaWork) {
$event->setResponse($this->base->jsonResponseNotFound('Aucun service sibelga work trouvé'));
return;
}
$datas = $this->base->serialize($datas, 'json', ['groups' => 'sibelgawork:read']);
$event->setResponse($this->base->jsonResponseOk($datas, 'List des services sibelga work'));
}
//List des societé Fournisseur
if (
$object === ProviderSociety::class
&& $request->getMethod() === 'GET'
) {
$theProperty = $this->thePropertyRepository->find($data->get('theProperty'));
if ($theProperty instanceof \App\Entity\TheProperty) {
$municipality = $theProperty->getMunicipality()->getName();
if ($municipality) {
$datas = $this->providerSocietyRepository->findBy(['municipality' => $municipality]);
if ($datas === null) {
$event->setResponse($this->base->jsonResponseNotFound('Aucun service sibelga work trouvé'));
return;
}
$datas = $this->base->serialize($datas, 'json', ['groups' => 'providersociety:read']);
$event->setResponse($this->base->jsonResponseOk($datas, 'List des societé fournisseur'));
return;
}
}
$event->setResponse($this->base->jsonResponseNotFound('Bien non trouvé'));
}
//Ajout fournisseur solaire
if (
$object === ProviderSolar::class
&& $request->getMethod() === 'POST'
) {
$datas = $this->base->getPostedData($request);
$files = $request->files->get('files') ? $request->files->get('files') : null;
$theProperty = $this->thePropertyRepository->find($datas['theProperty']);
if (!$theProperty instanceof \App\Entity\TheProperty) {
$event->setResponse($this->base->jsonResponseNotFound('Bien non trouvé'));
return;
}
$providerSolar = $this->providerSolarRepository->findBy(['theProperty' => $theProperty]);
if ($providerSolar === []) {
$uploadFiles = $this->base->uploadFile($files, 'provider_solar');
$linkFiles = $this->traitementUrl->getUrlServer().'/uploads/providers/solar/'.$uploadFiles['filename'];
$providerSolar = new ProviderSolar();
$providerSolar->setTheProperty($theProperty)
->setGreatPotential($datas['greatPotential'] ?? null)
->setGoodPotential($datas['goodPotential'] ?? null)
->setFile($uploadFiles['filename'])
->setAnnualProduction($datas['annualProduction'] ?? null)
->setPath($linkFiles);
$this->base->save($providerSolar);
$datas = $this->base->serialize($providerSolar, 'json', ['groups' => 'provider_solar:read']);
$event->setResponse($this->base->jsonResponseOk($datas, 'Fournisseur solaire ajouté avec succees'));
return;
}
$event->setResponse($this->base->jsonResponseNotFound('Fournisseur solaire existe déjà'));
return;
}
}
/**
* @return void
*/
public static function getSubscribedEvents()
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}