<?php
namespace App\Controller;
use App\Entity\JobOffer;
use App\Repository\JobOfferRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use FOS\RestBundle\Controller\Annotations as Rest;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
use Symfony\Component\Serializer\Exception\NotEncodableValueException;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class JobOfferController extends AbstractController
{
/**
* @Rest\Get("/api/jobs", name="_get_jobs")
* @param JobOfferRepository $jobOfferRepository
* @param NormalizerInterface $normalizer
* @return Response
* @throws ExceptionInterface
*/
public function getJobsOffer(JobOfferRepository $jobOfferRepository, NormalizerInterface $normalizer): Response
{
$jobOfferNormalize = $normalizer->normalize($jobOfferRepository->findAll(), 'json', ['groups' => 'post:read']);
return $this->json([
'jobs' => $jobOfferNormalize,
]);
}
/**
* @Rest\Get("/api/jobs/home", name="_get_jobs_home")
* @param JobOfferRepository $jobOfferRepository
* @param NormalizerInterface $normalizer
* @return Response
* @throws ExceptionInterface
*/
public function getJobsOfferHome(JobOfferRepository $jobOfferRepository, NormalizerInterface $normalizer): Response
{
$jobOfferNormalize = $normalizer->normalize($jobOfferRepository->findJobsOfferHome(), 'json', ['groups' => 'post:read:home']);
return $this->json([
'jobs' => $jobOfferNormalize,
]);
}
/**
* @Rest\Post("/api/jobs/new", name="_post_jobs_new")
* @IsGranted("ROLE_USER")
* @param Request $request
* @param EntityManagerInterface $manager
* @param ValidatorInterface $validator
* @return JsonResponse
*/
public function postJobsNew(Request $request, EntityManagerInterface $manager, ValidatorInterface $validator): JsonResponse
{
try {
$data = json_decode($request->getContent(), true);
$job = (new JobOffer())
->setActivated(true)
->setCreatedBy($this->getUser())
->setDateCreation(new DateTime())
->setTitle($data['title'] ?? '')
->setDescription($data['description'] ?? '')
->setContract($data['contract'] ?? '')
->setMission($data['mission'] ?? '')
->setKnowledge($data['knowledge'] ?? '')
->setModalities($data['modalities'] ?? '');
$errors = $validator->validate($job);
if (count($errors) > 0) {
return $this->json([
$errors
], 400);
}
$manager->persist($job);
$manager->flush();
return $this->json([
'message' => 'The new Job offer has been successfully created.'
]);
} catch (NotEncodableValueException $e) {
return $this->json([
'message' => $e->getMessage()
], 400);
}
}
/**
* @Rest\Put("/api/jobs/{id}/edition", name="_post_jobs_edition")
* @IsGranted("ROLE_USER")
* @param JobOffer $jobOffer
* @param Request $request
* @param EntityManagerInterface $manager
* @param ValidatorInterface $validator
* @return JsonResponse
*/
public function postJobsEdition(JobOffer $jobOffer, Request $request, EntityManagerInterface $manager, ValidatorInterface $validator): JsonResponse
{
try {
$data = json_decode($request->getContent(), true);
$jobOffer
->setTitle($data['title'] ?? $jobOffer->getTitle())
->setDescription($data['description'] ?? $jobOffer->getDescription())
->setContract($data['contract'] ?? $jobOffer->getContract())
->setMission($data['mission'] ?? $jobOffer->getMission())
->setKnowledge($data['knowledge'] ?? $jobOffer->getKnowledge())
->setModalities($data['modalities'] ?? $jobOffer->getModalities())
->setDateEdition(new DateTime());
$errors = $validator->validate($jobOffer);
if (count($errors) > 0) {
return $this->json([
$errors
], 400);
}
$manager->persist($jobOffer);
$manager->flush();
return $this->json([
'message' => 'The focused Job offer has been successfully edited.'
]);
} catch (NotEncodableValueException $e) {
return $this->json([
'message' => $e->getMessage()
], 400);
}
}
/**
* @Rest\Put("/api/jobs/{id}/activated", name="_post_jobs_activated")
* @IsGranted("ROLE_USER")
* @param JobOffer $jobOffer
* @param Request $request
* @param EntityManagerInterface $manager
* @param ValidatorInterface $validator
* @return JsonResponse
*/
public function postJobsActivated(JobOffer $jobOffer, Request $request, EntityManagerInterface $manager, ValidatorInterface $validator): JsonResponse
{
try {
$jobOffer
->setActivated(!$jobOffer->getActivated());
$errors = $validator->validate($jobOffer);
if (count($errors) > 0) {
return $this->json([
$errors
], 400);
}
$manager->persist($jobOffer);
$manager->flush();
return $this->json([
'message' => 'The focused Job offer is now activated.'
]);
} catch (NotEncodableValueException $e) {
return $this->json([
'message' => $e->getMessage()
], 400);
}
}
/**
* @Rest\Put("/api/jobs/{id}/delete", name="_put_job_delete")
* @IsGranted("ROLE_USER")
* @param JobOffer $jobOffer
* @param EntityManagerInterface $manager
* @return JsonResponse
*/
public function deleteFocusJob(JobOffer $jobOffer, EntityManagerInterface $manager): JsonResponse
{
try {
$manager->remove($jobOffer);
$manager->flush();
return $this->json([
'message' => 'The Offer Job has been deleted.'
]);
} catch (NotEncodableValueException $e) {
return $this->json([
'message' => $e->getMessage()
], 400);
}
}
}