<?php
namespace App\Controller;
use App\Entity\Annonces;
use App\Entity\Images;
use App\Entity\NotesAnnonces;
use App\Form\AnnoncesType;
use App\Repository\UserRepository;
use App\Repository\AnnoncesRepository;
use App\Repository\NotesAnnoncesRepository;
use App\Repository\CategoriesRepository;
use App\Repository\ImagesRepository;
use App\Repository\AlertesRepository; // Import AlertesRepository
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Datetime;
use Kreait\Firebase\Messaging;
use Kreait\Firebase\Messaging\CloudMessage;
use Kreait\Firebase\Factory;
function sendNotif($to, $notif, Messaging $messaging){
$fields = array('registration_ids' => $to, 'notification'=> $notif);
$message = CloudMessage::new()
->withNotification(
$notif
);
$response = $messaging->sendMulticast($message, $to);
}
/**
* @Route("admin/annonces")
*/
class AnnoncesController extends AbstractController
{
private $messaging;
private $factory;
public function __construct(){
$this->factory = (new Factory)->withServiceAccount('../config/firebase/serviceAccountKey.json');
$this->messaging = $this->factory->createMessaging();
}
/**
* @Route("/", name="app_annonces_index", methods={"GET"})
*/
public function index(AnnoncesRepository $annoncesRepository, AlertesRepository $alertesRepository, CategoriesRepository $categoriesRepository): Response
{
$user = $this->getUser();
$alertes = $alertesRepository->findBy(['User' => $user]);
$categories = $categoriesRepository->findAll();
return $this->render('annonces/index.html.twig', [
'annonces' => $annoncesRepository->findAll(),
'alertes' => $alertes,
'categories' => $categories
]);
}
/**
* @Route("/new", name="app_annonces_new", methods={"GET", "POST"})
*/
public function new(Request $request, AnnoncesRepository $annoncesRepository, UserRepository $userRepository, ImagesRepository $imagesRepository, CategoriesRepository $categoriesRepository, AlertesRepository $alertesRepository): Response
{
$credit = 1;
$annonce = new Annonces();
$form = $this->createForm(AnnoncesType::class, $annonce);
$form->handleRequest($request);
$em = $this->getDoctrine()->getManager();
if ($form->isSubmitted() && $form->isValid()) {
$cat = $categoriesRepository->findOneById($request->request->get('categories'));
$annonce->setCategories($cat);
if ($request->request->get('pro')) {
$annonce->setVisiblePro(1);
}
$annonce->setNbVues(0);
$dDebut = $request->request->get('date').' '.$request->request->get('heureDebut');
$dFin = $request->request->get('date').' '.$request->request->get('heureFin');
$annonce->setDateDebut(new \DateTime($dDebut));
$annonce->setDateFin(new \DateTime($dFin));
$annonce->setUser($this->getUser());
$annonce->setVilles($this->getUser()->getVilles());
if ($request->request->get('booster')) {
$annonce->setBooster(1);
$credit += 4;
}
$file = $form->get('image')->getData();
if ($file) {
$path = '/';
$fileName = uniqid() . '-' . $file->getClientOriginalName();
$file->move(
$this->getParameter('annonces_directory') . $path,
$fileName
);
}
$user = $userRepository->findOneById($this->getUser()->getId());
$newCredit = $user->getCredits() - $credit;
if ($user->getCredits() >= $credit) {
$annoncesRepository->add($annonce, true); // Persist and flush the Annonce entity first
if ($file) {
$image = new Images();
$image->setLien($fileName);
$image->setAnnonces($annonce);
$imagesRepository->add($image, true);
}
$user->setCredits($newCredit);
$userRepository->add($user, true);
// Envoi de notification, etc.
return $this->redirectToRoute('mesAnnonces', ['type' => 'encours'], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('app_annonces_new', ['erreur' => 'credit'], Response::HTTP_SEE_OTHER);
}
}
$user = $this->getUser();
$alertes = $alertesRepository->findBy(['User' => $user]);
$categories = $categoriesRepository->findAll();
return $this->renderForm('annonces/new.html.twig', [
'annonce' => $annonce,
'form' => $form,
'categories' => $categories,
'alertes' => $alertes,
'type' => 'new'
]);
}
/**
* @Route("/{id}", name="app_annonces_show", methods={"GET"})
*/
public function show(Annonces $annonce, AlertesRepository $alertesRepository, CategoriesRepository $categoriesRepository): Response
{
$user = $this->getUser();
$alertes = $alertesRepository->findBy(['User' => $user]);
$categories = $categoriesRepository->findAll();
return $this->render('annonces/show.html.twig', [
'annonce' => $annonce,
'alertes' => $alertes,
'categories' => $categories
]);
}
/**
* @Route("/{id}/edit", name="app_annonces_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, Annonces $annonce, UserRepository $userRepository, AnnoncesRepository $annoncesRepository, ImagesRepository $imagesRepository, CategoriesRepository $categoriesRepository, AlertesRepository $alertesRepository): Response
{
$oldBooster = $annonce->isBooster();
$form = $this->createForm(AnnoncesType::class, $annonce);
$form->handleRequest($request);
$credit = 0;
if ($form->isSubmitted() && $form->isValid()) {
$cat = $categoriesRepository->findOneById($request->request->get('categories'));
$annonce->setCategories($cat);
if ($request->request->has('pro')) {
$annonce->setVisiblePro(1);
}
$annonce->setNbVues(0);
$dDebut = $request->request->get('date') . ' ' . $request->request->get('heureDebut');
$dFin = $request->request->get('date') . ' ' . $request->request->get('heureFin');
$annonce->setDateDebut(new \DateTime($dDebut));
$annonce->setDateFin(new \DateTime($dFin));
if ($request->request->has('booster')) {
$annonce->setBooster(1);
if ($oldBooster == 0) {
$credit += 4;
}
}
$fileName = '';
$file = $form->get('image')->getData();
if ($file) {
$fileName = uniqid() . '-' . $file->getClientOriginalName();
$file->move(
$this->getParameter('annonces_directory'),
$fileName
);
$image = new Images();
$image->setLien($fileName);
$image->setAnnonces($annonce);
$imagesRepository->add($image, true);
}
$user = $userRepository->findOneById($this->getUser());
$newCredit = $user->getCredits() - $credit;
if ($user->getCredits() >= $credit) {
$annoncesRepository->add($annonce, true);
if (!empty($fileName)) {
$image = new Images();
$image->setLien($fileName);
$image->setAnnonces($annonce);
$imagesRepository->add($image, true);
}
$user->setCredits($newCredit);
$userRepository->add($user, true);
return $this->redirectToRoute('mesAnnonces', ['type' => 'encours'], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('app_annonces_edit', ['id' => $annonce->getId(), 'erreur' => 'credit'], Response::HTTP_SEE_OTHER);
}
}
$user = $this->getUser();
$alertes = $alertesRepository->findBy(['User' => $user]);
$categories = $categoriesRepository->findAll();
return $this->renderForm('annonces/edit.html.twig', [
'annonce' => $annonce,
'form' => $form,
'categories' => $categories,
'alertes' => $alertes,
'type' => 'edit'
]);
}
/**
* @Route("/{id}/delete", name="app_annonces_delete", methods={"POST"})
*/
public function delete(Request $request, Annonces $annonce = null, ImagesRepository $imagesRepository, AnnoncesRepository $annoncesRepository, NotesAnnoncesRepository $notesAnnoncesRepository): Response
{
if (!$annonce) {
throw $this->createNotFoundException('Annonce non trouvée');
}
if ($this->isCsrfTokenValid('delete'.$annonce->getId(), $request->request->get('_token'))) {
$notes = $notesAnnoncesRepository->findBy(['Annonces' => $annonce->getId()]);
foreach ($notes as $res) {
$notesAnnoncesRepository->remove($res, true);
}
$images = $imagesRepository->findBy(['Annonces' => $annonce->getId()]);
foreach ($images as $res) {
$imagesRepository->remove($res, true);
}
$annoncesRepository->remove($annonce, true);
}
$type = $request->request->get('form')['type'] ?? null;
if ($type === 'mesAnnonces') {
return $this->redirectToRoute('mesAnnonces', ['type' => 'encours'], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('mesAnnonces', ['type' => 'encours'], Response::HTTP_SEE_OTHER);
}
}
/**
* @Route("/update-rating", name="update_rating", methods={"POST"})
*/
public function updateRating(Request $request, AnnoncesRepository $annoncesRepository, UserRepository $userRepository, EntityManagerInterface $entityManager): Response
{
$note = $request->request->get('note');
$annonceId = $request->request->get('annonceId');
$annonce = $annoncesRepository->find($annonceId);
$user = $this->getUser();
if (!$annonce || !$user) {
return new Response('Annonce ou utilisateur non trouvé', Response::HTTP_NOT_FOUND);
}
$notesAnnonce = new NotesAnnonces();
$notesAnnonce->setDate(new \DateTime());
$notesAnnonce->setAnnonces($annonce);
$notesAnnonce->setUser($user);
$notesAnnonce->setNote($note);
$entityManager->persist($notesAnnonce);
$entityManager->flush();
return new Response('Note de l\'annonce mise à jour avec succès', Response::HTTP_OK);
}
/**
* @Route("/{id}/republish", name="app_annonces_republish", methods={"GET", "POST"})
*/
public function republish(Request $request, Annonces $annonce, AnnoncesRepository $annoncesRepository, CategoriesRepository $categoriesRepository, ImagesRepository $imagesRepository, AlertesRepository $alertesRepository): Response
{
$newAnnonce = new Annonces();
$newAnnonce->setTitre($annonce->getTitre());
$newAnnonce->setDescription($annonce->getDescription());
$newAnnonce->setQuantite($annonce->getQuantite());
$newAnnonce->setPrix($annonce->getPrix());
$newAnnonce->setPourcentRemise($annonce->getPourcentRemise());
$newAnnonce->setVisiblePro($annonce->isVisiblePro());
$newAnnonce->setCategories($annonce->getCategories());
$newAnnonce->setUser($this->getUser());
$newAnnonce->setNbVues(0);
$form = $this->createForm(AnnoncesType::class, $newAnnonce);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$cat = $categoriesRepository->findOneById($request->request->get('categories'));
$newAnnonce->setCategories($cat);
$newAnnonce->setNbVues(0);
$dDebut = $request->request->get('date').' '.$request->request->get('heureDebut');
$dFin = $request->request->get('date').' '.$request->request->get('heureFin');
$newAnnonce->setDateDebut(new \DateTime($dDebut));
$newAnnonce->setDateFin(new \DateTime($dFin));
$newAnnonce->setUser($this->getUser());
$newAnnonce->setVilles($this->getUser()->getVilles());
if ($request->request->get('booster')) {
$newAnnonce->setBooster(1);
}
// Persist the new Annonce first
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($newAnnonce);
$entityManager->flush();
// Handle the image upload
$file = $form->get('image')->getData();
if ($file) {
$fileName = uniqid() . '-' . $file->getClientOriginalName();
$file->move(
$this->getParameter('annonces_directory'),
$fileName
);
$image = new Images();
$image->setLien($fileName);
$image->setAnnonces($newAnnonce);
$imagesRepository->add($image, true);
}
return $this->redirectToRoute('mesAnnonces', ['type' => 'encours'], Response::HTTP_SEE_OTHER);
}
$user = $this->getUser();
$alertes = $alertesRepository->findBy(['User' => $user]);
$categories = $categoriesRepository->findAll();
return $this->render('annonces/republish.html.twig', [
'annonce' => $newAnnonce,
'form' => $form->createView(),
'categories' => $categories,
'alertes' => $alertes,
]);
}
}