<?php
namespace App\Controller;
use App\Entity\UserOffer;
use App\Service\Mailer;
use App\Service\OfferEntityService;
use App\Service\StripeService;
use Bluesquare\StorageBundle\Storage;
use Bluesquare\ValidatorBundle\Validator;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class OfferController extends AbstractController
{
/**
* @Route("/offres-emploi", name="offer.index", methods={"GET"})
*/
public function index(Request $request, OfferEntityService $offerEntityService, StripeService $stripeService)
{
if ($request->isXmlHttpRequest()) {
$search = $request->query->get('search');
$offers = $offerEntityService->searchFromPublished($search);
return $this->render('offer/search-offer.html.twig', [
'offers' => $offers,
]);
}
$subscriptionStatus = $stripeService->getSubscriptionStatus($this->getUser());
return $this->render('offer/index.html.twig', [
'offers' => $offerEntityService->published(),
'userSubscriptionsStatus' => $subscriptionStatus,
]);
}
/**
* @Route("/offres-emploi/{id}", name="offer.view", methods={"GET", "POST"})
*/
public function view(OfferEntityService $offerEntityService, EntityManagerInterface $manager, $id, Validator $validator, Storage $storage, Mailer $mailer)
{
$offer = $offerEntityService->get($id);
if (!$offer) {
throw $this->createNotFoundException();
}
$visibility = false;
if ($validator->post() && $this->getUser()) {
$validator->required('message');
if ($validator->hasFile('resume')) {
$resume = $validator->getFile('resume');
$mime = $resume->getClientMimeType();
if (!\in_array($mime, ['image/png', 'image/jpeg', 'image/jpg', 'application/pdf'], true)) {
$validator->error('resume', 'Format invalide (.png, .jpg. jpeg, .pdf autorisés)');
}
}
if ($validator->hasFile('letter')) {
$letter = $validator->getFile('letter');
$mime = $letter->getClientMimeType();
if (!\in_array($mime, ['image/png', 'image/jpeg', 'image/jpg', 'application/pdf'], true)) {
$validator->error('letter', 'Format invalide (.doc, .pdf, .txt autorisés)');
}
}
if ($validator->check()) {
if (!$manager->getRepository(UserOffer::class)->findOneBy(['user' => $this->getUser(), 'offer' => $offer])) {
$userOffer = new UserOffer();
$userOffer->setUser($this->getUser());
$userOffer->setOffer($offer);
$userOffer->setAppliedAt(new \DateTime());
$files = [];
if ($validator->hasFile('resume')) {
$files[] = $resume;
if ($resume instanceof UploadedFile) {
$userOffer->setResumeFilename($resume->getClientOriginalName());
$userOffer->setResumeType($resume->getMimeType());
$storage->store($userOffer, 'resume_file', $resume->getRealPath());
}
}
if ($validator->hasFile('letter')) {
$files[] = $letter;
}
if (!empty($offer->getContactEmail())) {
$vars = [
'offer' => $offer,
'user' => $this->getUser(),
'message' => nl2br(htmlspecialchars($validator->get('message'))),
];
$mailer->send('appliance', $offer->getContactEmail(), $vars, ['%offer%' => $offer->getName()], [], $files);
}
$manager->persist($userOffer);
$manager->flush();
}
} else {
$validator->keep();
}
}
if ($this->getUser()) {
if ($manager->getRepository(UserOffer::class)->findOneBy(['user' => $this->getUser(), 'offer' => $offer])) {
$visibility = true;
}
}
return $this->render('offer/offer.html.twig', [
'offer' => $offerEntityService->format($offer),
'candidated' => $visibility,
'validator' => $validator,
]);
}
}