<?php
namespace App\Controller\Api;
use App\Entity\Discussion;
use App\Entity\DiscussionMessage;
use App\Repository\DiscussionClassMessageRepository;
use App\Repository\DiscussionClassRepository;
use App\Repository\DiscussionMessageRepository;
use App\Repository\NotificationsRepository;
use App\Repository\SchoolYearRepository;
use App\Repository\StudentYearRepository;
use App\Repository\SubjectRepository;
use App\Repository\TheClassRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update;
use Symfony\Component\Routing\Annotation\Route;
use OpenApi\Annotations as OA;
use App\Repository\DiscussionRepository;
use App\Entity\Notifications;
use App\Repository\DiscussionMessagesCountRepository;
use App\Repository\UserYearRepository;
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
use App\Service\PushNotificationService;
use GuzzleHttp\Psr7\Response as Psr7Response;
class DiscussionController extends AbstractController
{
/**
* @throws NonUniqueResultException
* @throws NoResultException
*/
#[Route('/api/discussion', name: 'api_discussion_index')]
public function index(
StudentYearRepository $studentYearRepository,
SchoolYearRepository $schoolYearRepository,
SerializerInterface $serializer,
DiscussionMessageRepository $discussionMessageRepository,
DiscussionRepository $discussionRepository,
SubjectRepository $subjectRepository,
DiscussionClassRepository $discussionClassRepository,
DiscussionClassMessageRepository $discussionClassMessageRepository,
NotificationsRepository $notificationsRepository,
EntityManagerInterface $entityManager,
TheClassRepository $theClassRepository,
DiscussionMessagesCountRepository $discussionMessagesCountRepository
):Response
{
if (!$this->getUser()){
return new JsonResponse(
$serializer->serialize(['message'=>"une erreur s'est produite! redemarez l'application et réessayez"],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
$school = $this->getUser()->getSchool();
$discussion = $discussionRepository->findByDiscussion($this->getUser(),$school/*,(int)$from*/);
$chatWhit = [];
foreach ($discussion as $value){
$unread = $discussionMessageRepository->findBy(['discussion'=>$value,'messageFor'=>$this->getUser(),'isRead'=>false],[]);
$unreadCount = count($unread);
//dd($unreadCount);
//dd($unreadCount);
$messageDiscussion = $discussionMessageRepository->findBy(['discussion'=>$value],[]);
$messageCount = count($messageDiscussion);
if( $messageCount > 0){
$lastMessage = $messageDiscussion[$messageCount-1];
}else{
$lastMessage = '';
}
//dd($lastMessage);
if ($value->getUserA() !== $this->getUser()){
if($messageCount > 0){
if(!empty($lastMessage->getMessage())){
$lastMessageValue = $lastMessage->getMessage();
}else{
$lastMessageValue = "fichier ou image";
}
if(empty($lastMessage->getMessage()) && empty($lastMessage->getFileName())){
$lastMessageValue = ' ';
}
$user = [
'discussionId'=>$value->getId(),
'updatedAt'=>$value->getUpdatedAt(),
'time_of_last_message'=>$value->getUpdatedAt(),
'unread_message_count'=>$unreadCount,
'last_message'=>$lastMessageValue,
'last_message_is_read'=>$lastMessage->isIsRead(),
'user' => $value->getUserA(),
'userType' => $value->getUserB()->getUserType(),
];
$chatWhit[]=$user;
}
}elseif($value->getUserB() !== $this->getUser()){
if($messageCount > 0){
if(!empty($lastMessage->getMessage())){
$lastMessageValue = $lastMessage->getMessage();
}else{
$lastMessageValue = "fichier ou image";
}
$user = [
'discussionId'=>$value->getId(),
'updatedAt'=>$value->getUpdatedAt(),
'time_of_last_message'=>$value->getUpdatedAt(),
'unread_message_count'=>$unreadCount,
'last_message'=>$lastMessageValue,
'last_message_is_read'=>$lastMessage->isIsRead(),
'user' => $value->getUserB(),
'userType' => $value->getUserB()->getUserType(),
];
$chatWhit[]=$user;
}
}
}
//discussion group
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
if ($this->getUser()->getUserType() == 'parent'){
$parentStudent = $studentYearRepository->findParentStudents($this->getUser(),$this->getUser()->getSchool());
$studentsParentsClasses = [];
foreach ($parentStudent as $value){
$studentsParentsClasses[]= $value->getClasse();
}
$classesDiscussions = $discussionClassRepository->findDiscussionClass($studentsParentsClasses);
$groups = [];
if ($this->getUser()->getUserType() == 'parent'){
foreach ($classesDiscussions as $value){
$NotificationVerify = $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
if (empty($NotificationVerify)){
$addNotification = new Notifications();
$addNotification->setUser($this->getUser());
$addNotification->setYear($year);
$entityManager->persist($addNotification);
$entityManager->flush();
}
$messageCount = $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
// $messageLastCount = $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
//dd($messageCount);
$messageGroupCount = count($messageCount);
//dd($messageGroupCount);
if( $messageGroupCount > 0){
$lastMessage = $messageCount[$messageGroupCount-1]->getMessage();
}else{
$lastMessage = '';
}
//$unreadMessage = count($messageCount) - $messageLastCount->getMessageGroupLastConnexionCount();
$messageCount = $discussionMessagesCountRepository->findOneBy(['user'=>$this->getUser(),'Discussion'=>$value],[]);
if(!$messageCount){
//dd('here');
$addDiscussionMessageCount = new \App\Entity\DiscussionMessagesCount();
$addDiscussionMessageCount->setUser($this->getUser());
$addDiscussionMessageCount->setDiscussion($value);
$addDiscussionMessageCount->setMessageCount(0);
$entityManager->persist($addDiscussionMessageCount);
$entityManager->flush();
$messageCount = $addDiscussionMessageCount;
}
$lasMessageCount = $messageCount->getMessageCount();
$newMessageCount = $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
$totalNewMessageCount = count($newMessageCount);
$unreadMessageCount = $totalNewMessageCount - $lasMessageCount;
$content=[
'group'=>$value,
'updatedAt'=>$value->getUpdatedAt(),
'unreadMessage'=>$unreadMessageCount,
'last_message' => $lastMessage
];
$groups[]=$content;
}
}
//dd($groups);
}elseif ($this->getUser()->getUserType()=="prof"){
$user = $this->getUser();
$subject = $subjectRepository->findBy(['prof'=>$user,'school'=>$user->getSchool()]);
$classes = [];
foreach ($subject as $value){
if (!in_array($value->getClasse(), $classes, true)){
$classes[] = $value->getClasse();
}
}
$classesDiscussions = $discussionClassRepository->findDiscussionClass($classes);
//dd($classesDiscussions);
$groups = [];
foreach ($classesDiscussions as $value){
$NotificationVerify = $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
if (empty($NotificationVerify)){
$addNotification = new Notifications();
$addNotification->setUser($this->getUser());
$addNotification->setYear($year);
$entityManager->persist($addNotification);
$entityManager->flush();
}
//dd($NotificationVerify);
$messageCount = $discussionMessagesCountRepository->findOneBy(['user'=>$this->getUser(),'Discussion'=>$value],[]);
if(!$messageCount){
//dd('here');
$addDiscussionMessageCount = new \App\Entity\DiscussionMessagesCount();
$addDiscussionMessageCount->setUser($this->getUser());
$addDiscussionMessageCount->setDiscussion($value);
$addDiscussionMessageCount->setMessageCount(0);
$entityManager->persist($addDiscussionMessageCount);
$entityManager->flush();
$messageCount = $addDiscussionMessageCount;
}
$lasMessageCount = $messageCount->getMessageCount();
$newMessageCount = $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
$totalNewMessageCount = count($newMessageCount);
$unreadMessageCount = $totalNewMessageCount - $lasMessageCount;
$content=[
'group'=>$value,
'updatedAt'=>$value->getUpdatedAt(),
'unreadMessage'=>$unreadMessageCount
];
$groups[]=$content;
}
}elseif ($this->getUser()->getUserType()=="admin"){
$classes = $theClassRepository->findBy(['school'=>$school]);
$classesDiscussions = $discussionClassRepository->findDiscussionClass($classes);
//dd($classesDiscussions);
$groups = [];
foreach ($classesDiscussions as $value){
/*
$NotificationVerify = $notificationsRepository->findOneBy(['user'=>$this->getUser(),'year'=>$year],[]);
if (empty($NotificationVerify)){
$addNotification = new Notifications();
$addNotification->setUser($this->getUser());
$addNotification->setYear($year);
$entityManager->persist($addNotification);
$entityManager->flush();
}
*/
$messageCount = $discussionMessagesCountRepository->findOneBy(['user'=>$this->getUser(),'Discussion'=>$value],[]);
if(!$messageCount){
//dd('here');
$addDiscussionMessageCount = new \App\Entity\DiscussionMessagesCount();
$addDiscussionMessageCount->setUser($this->getUser());
$addDiscussionMessageCount->setDiscussion($value);
$addDiscussionMessageCount->setMessageCount(0);
$entityManager->persist($addDiscussionMessageCount);
$entityManager->flush();
$messageCount = $addDiscussionMessageCount;
}
$lasMessageCount = $messageCount->getMessageCount();
$newMessageCount = $discussionClassMessageRepository->findBy(['discussion'=>$value],[]);
$totalNewMessageCount = count($newMessageCount);
$unreadMessageCount = $totalNewMessageCount - $lasMessageCount;
$content=[
'group'=>$value,
'updatedAt'=>$value->getUpdatedAt(),
'unreadMessage'=>$unreadMessageCount
];
$groups[]=$content;
}
}
$data = [
'discussions'=>$chatWhit,
'groups'=>$groups
];
$context = SerializationContext::create()->setGroups(["getDiscussion"]);
$jsonPost = $serializer->serialize($data,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* discussion message hub subscribe
* @OA\Tag(name="Discussion")
*/
#[Route(path: '/api/discussion/{id}/message/user/mercure/hub', name: 'api_discussion_message_user_subscribe_mercure_hub', methods: ['GET'])]
public function getUserSubscribeLateMercureHub($id,SerializerInterface $serializer, Environment $twig, UserRepository $userRepository):JsonResponse
{
//https://flex.com/discussion/message/page/hub/'.$discussionEntity->getId()
$mercureHubSubscribeUrl = "https://flex.com/discussion/message/page/hub/".$id;
try {
$result = $twig->render('mercure/client_hub_url.html.twig', [
'url' => $mercureHubSubscribeUrl
]);
} catch (LoaderError|RuntimeError|SyntaxError $e) {
}
return new JsonResponse($serializer->serialize([ 'mercure_client_hub_url'=>$result], 'json'),Response::HTTP_OK,['accept'=>'application/json'],true);
}
#[Route(path: 'api/discussion/new/whit/{id}/getId', name: 'api_discussion_Verify_get_id', methods: ['POST','GET'] )]
public function discussionGetId(
SchoolYearRepository $schoolYearRepository,
UserRepository $userRepository,
DiscussionRepository $discussionRepository,
$id,
EntityManagerInterface $entityManager
):JsonResponse
{
$year = $schoolYearRepository->findOneBy(['active'=>true]);
$user = $this->getUser();
$discussionWhit = $userRepository->find($id);
$discussionExist = $discussionRepository->findOneBy(['userA'=>$user,'userB'=>$discussionWhit]);
$discussionExist2 = $discussionRepository->findOneBy(['userA'=>$discussionWhit,'userB'=>$user]);
if ($discussionExist === null && $discussionExist2 === null){
$discussion = new Discussion();
$discussion->setUserA($user);
$discussion->setUserB($discussionWhit);
$discussion->setSchool($this->getUser()->getSchool());
$discussion->setYear($year);
$entityManager->persist($discussion);
$entityManager->flush();
$discussionEntity = $discussion;
}else{
if ($discussionExist === null){
$discussionEntity = $discussionExist2;
}elseif ( $discussionExist2 === null){
$discussionEntity = $discussionExist;
}
}
return new JsonResponse(['discussionId'=>$discussionEntity->getId()]);
}
/**
* @throws RuntimeError
* @throws SyntaxError
* @throws LoaderError
*/
#[Route(path: 'api/discussion/new/whit/{id}/', name: 'api_discussion_new_', methods: ['POST','GET'] )]
public function discussionWith(
DiscussionMessageRepository $discussionMessageRepository,
HubInterface $hub,
SchoolYearRepository $schoolYearRepository,
SerializerInterface $serializer,
$id,
DiscussionRepository $discussionRepository,
UserRepository $userRepository,
EntityManagerInterface $entityManager,
NotificationsRepository $notificationsRepository,
Request $request,
Environment $twig,
PaginatorInterface $paginator,
PushNotificationService $notification
): Response
{
if (!$this->getUser()){
return new JsonResponse(null);
}
$year = $schoolYearRepository->findOneBy(['active'=>true]);
$user = $this->getUser();
$discussionWhit = $userRepository->find($id);
$discussionExist = $discussionRepository->findOneBy(['userA'=>$user,'userB'=>$discussionWhit]);
$discussionExist2 = $discussionRepository->findOneBy(['userA'=>$discussionWhit,'userB'=>$user]);
if ($discussionExist === null && $discussionExist2 === null){
$discussion = new Discussion();
$discussion->setUserA($user);
$discussion->setUserB($discussionWhit);
$discussion->setSchool($this->getUser()->getSchool());
$discussion->setYear($year);
$entityManager->persist($discussion);
$entityManager->flush();
$discussionEntity = $discussion;
}else{
if ($discussionExist === null){
$discussionEntity = $discussionExist2;
}elseif ( $discussionExist2 === null){
$discussionEntity = $discussionExist;
}
}
$msgFor = $userRepository->find($id);
if ($request->isMethod('POST')){
$data = $request->request->all();
$discussionMessage = new DiscussionMessage();
$discussionMessage->setMessageBy($user);
$discussionMessage->setMessageFor($msgFor);
$discussionMessage->setIsRead(false);
$discussionMessage->setMessage((string)$data['message']);
$discussionMessage->setDiscussion($discussionEntity);
if ($data['reply_for_message']!== null && $data['reply_for_message'] !== ''){
$msgId = (int) $data['reply_for_message'];
if ($msgId){
$rpMessage = $discussionMessageRepository->find($msgId);
$discussionMessage->setReplyToMessage($rpMessage);
}
}
$file = $request->files->get('file');
if ($file !== null) {
$mimeType = $file->getMimeType();
//return new JsonResponse(['resu' => $mimeType]);
$authorizedMimeTypes = [
'application/pdf',
'image/png',
'image/jpeg',
'audio/x-caf', // mieux écrit
'audio/caf',
'application/octet-stream',
"video/3gpp",
"image" // cas spécial traité plus bas
];
if (in_array($mimeType, $authorizedMimeTypes, true)) {
$originalExtension = pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION);
// Cas spécial pour "application/octet-stream"
if ($mimeType === 'application/octet-stream' OR $mimeType === "video/3gpp") {
// On convertit le fichier en mp3
// 1️ Créer un chemin temporaire
$tempDir = sys_get_temp_dir();
$originalPath = $file->getPathname();
$mp3FileName = md5(uniqid('', true)) . '.mp3';
$mp3Path = $tempDir . DIRECTORY_SEPARATOR . $mp3FileName;
// Utiliser ffmpeg pour convertir en mp3
$command = "ffmpeg -i " . escapeshellarg($originalPath) . " -codec:a libmp3lame -qscale:a 2 " . escapeshellarg($mp3Path);
exec($command, $output, $returnVar);
if ($returnVar !== 0) {
return new JsonResponse(
$serializer->serialize(['status' => '500', 'error' => 'Erreur de conversion audio'], 'json'),
Response::HTTP_INTERNAL_SERVER_ERROR,
[],
true
);
}
// Déplacer le fichier mp3 final
$finalName = md5(uniqid('', true)) . '.mp3';
$destinationPath = $this->getParameter('app.discussion.file.dir') . '/' . $finalName;
rename($mp3Path, $destinationPath);
$discussionMessage->setFileName($finalName);
} else {
// Cas normal : pas besoin de conversion
$fileName = md5(uniqid('', true)) . '.' . $originalExtension;
$file->move($this->getParameter('app.discussion.file.dir'), $fileName);
$discussionMessage->setFileName($fileName);
}
} else {
return new JsonResponse(
$serializer->serialize(['status' => '400'], 'json'),
Response::HTTP_OK,
[],
true
);
}
}
if (($file === null) && ($data['message'] === '')){
return new JsonResponse(
$serializer->serialize([ 'message'=>'file and message is empty, add file and message or one value'],'json'),
Response::HTTP_BAD_REQUEST,[],
true
);
}
$entityManager->persist($discussionMessage);
$entityManager->flush();
$discussionEntity->setCreatedAt(new \DateTime());
$entityManager->flush();
// $messageFind = $discussionMessageRepository->find($discussionMessage->getId());
//if ($discussionMessage->getMessageBy() != $this->getUser()){
$messageContent = [];
$messageItem = [];
$messageItem["_id"]=$discussionMessage->getId();
$messageItem["text"]= $discussionMessage->getMessage();
if (isset($fileName)) {
$fileNameLower = strtolower($fileName);
if (preg_match('/\.(jpg|jpeg|png|gif|webp)$/', $fileNameLower)){
$messageItem["image"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName";
$fileType = "img";
}elseif(preg_match('/\.pdf$/', $fileNameLower)){
$messageItem["file"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName";
$messageItem["fileName"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName";
$fileType = "pdf";
} elseif(preg_match('/\.mp3$/', $fileNameLower)){
$messageItem["audio"] = $this->getParameter("base.url") . "/uploads/discussion/$fileName";
$fileType = "audio";
}
}
if(isset($finalName)){
$messageItem["audio"] = $this->getParameter("base.url") . "/uploads/discussion/$finalName";
}
$messageItem["createdAt"]= $discussionMessage->getCreatedAt();
if ($discussionMessage->getMessageBy()->getUserType() == 'parent'){
$userType = 'parent';
}elseif ($discussionMessage->getMessageBy()->getUserType() == 'prof'){
$userType = 'enseignent';
}else{
$userType = "membre de l'administration";
}
$userName = $discussionMessage->getMessageBy()->getFullName()." ~ ".$userType;
$messageItem["user"]=[
'_id'=> $discussionMessage->getMessageBy()->getId(),
'name'=> $userName
];
$rp = $discussionMessage->getReplyToMessage();
if($rp !== null){
if($discussionMessage->getReplyToMessage()->getFileName()){
$fName = $discussionMessage->getReplyToMessage()->getFileName();
}else { $fName = null; }
$messageItem["replyForMessage"] = [
"_id" => $discussionMessage->getReplyToMessage()->getId(),
"text" => $discussionMessage->getReplyToMessage()->getMessage(),
"file" => $fName ,
"_user" => [
"_id" => $discussionMessage->getReplyToMessage()->getMessageBy()->getId(),
"_name" => $discussionMessage->getReplyToMessage()->getMessageBy()->getFullName()
]
//"file_type" => $fileType
];
}
$messageContent[]=$messageItem;
$update = new Update(
'https://flex.com/discussion/message/page/hub/'.$discussionEntity->getId(),
//$discussionMessage->getId()
$serializer->serialize($messageContent,'json')
//json_encode($messageContent)
);
$hub->publish($update);
//}
//on envoie la notification apres que Mercure ait envoye le message et que le message n'est pas encore lu
if ($discussionMessage->isIsRead() == false) {
$destinataire = $discussionMessage->getMessageFor();
$lang = $destinataire->getLocalPhoneLang();
$token = $destinataire->getUserToken();
$userId = $destinataire->getId();
$author = $discussionMessage->getMessageBy();
$route = '/drawer/(tabs)/Calls';
if ($author->getUserType() == 'parent') {
$userType = 'parent';
} elseif ($author->getUserType() == 'prof') {
$userType = 'enseignant ~ ' . $discussionMessage->getDiscussion()->getClasse()->getName();
} else {
$userType = 'admin';
}
$title = $destinataire->getFullName() . ' ~ '. $userType;
$message = $discussionMessage->getMessage();
$notification->sendNotification($token, $title, $message, $route, $userId);
}
if (isset($fileName)){
$fileName = $fileName;
}else{
$fileName = null;
}
return new JsonResponse(
$serializer->serialize(
[
'name'=>$title,
'createdAt'=> $discussionMessage->getCreatedAt(),
'_file'=> $fileName ,
'message'=>'message has been added',
'status'=>200
],
'json'),
Response::HTTP_OK,[],
true
);
}
$message = $discussionMessageRepository->findByMessageFrom($discussionEntity);
$messageIsReadUpdate = $discussionMessageRepository->findBy(['discussion'=>$discussionEntity,'isRead'=>false,'messageFor'=>$this->getUser()]);
foreach ($messageIsReadUpdate as $__value){
$__value->setIsRead(true);
}
$entityManager->flush();
$allMessageCount = count($message);
$messageContent = [];
foreach ($message as $value){
$messageItem = [];
$messageItem["_id"]=$value->getId();
$messageItem["text"]= $value->getMessage();
$messageItem["_file"]= $value->getFileName();
$messageItem["createdAt"]= $value->getCreatedAt();
if ($value->getMessageBy()->getUserType() == 'parent'){
$userType = 'parent';
}elseif ($value->getMessageBy()->getUserType() == 'prof'){
$userType = 'enseignent';
}else{
$userType = "membre de l'administration";
}
$userName = $value->getMessageBy()->getFullName()." ~ ".$userType;
$messageItem["user"]=[
'_id'=> $value->getMessageBy()->getId(),
'name'=> $userName
];
if($value->getReplyToMessage()){
$messageItem["replyForMessage"]= $value->getReplyToMessage()->getMessage();
}
$rp = $value->getReplyToMessage();
if($rp !== null){
if($value->getReplyToMessage()->getFileName()){
$fName = $value->getReplyToMessage()->getFileName();
}else { $fName = null; }
$messageItem["replyForMessage"] = [
"_id" => $value->getReplyToMessage()->getId(),
"text" => $value->getReplyToMessage()->getMessage(),
"file" => $fName ,
"_user" => [
"_id" => $value->getReplyToMessage()->getMessageBy()->getId(),
"_name" => $value->getReplyToMessage()->getMessageBy()->getFullName()
]
];
}
$messageContent[]=$messageItem;
}
$data = $paginator->paginate($messageContent,
$request->query->getInt('page', 1),1000);
$discussWith = [
"name" => $discussionWhit->getFullName(),
"user_type" => $discussionWhit->getUserType(),
'user_photo' => $discussionWhit->getPicture()
];
$responseContent = [
"message" => $data->getItems(),
"_with"=> $discussWith,
"totalCount" => $data->getTotalItemCount(),
"nbPerPage"=>$data->getItemNumberPerPage(),
"CurrentPage" => $data->getCurrentPageNumber(),
"discussionId"=>$discussionEntity->getId()
];
$jsonPost = $serializer->serialize($responseContent,'json');
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* discussion message delete
* @OA\Tag(name="Discussion")
*/
#[Route(path: 'api/discussion/message/{id}/delete', name: 'api_discussion_message_delete', methods: ['GET'] )]
public function deleteMessage(DiscussionMessage $discussionMessage, EntityManagerInterface $entityManagerInterface, SerializerInterface $serializer):JsonResponse
{
if (!$this->getUser()){
return new JsonResponse(
$serializer->serialize(['message'=>'you must be logged'],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
$entityManagerInterface->remove($discussionMessage);
$entityManagerInterface->flush();
return new JsonResponse(
$serializer->serialize(['message'=>'message deleted'],'json'),
Response::HTTP_OK,['accept'=>'application/json'],
true
);
}
/**
* discussion contact
* @OA\Tag(name="Discussion")
*/
#[Route(path: 'api/parent/discussion/contact/list', name: 'api_discussion_parent_contact_list', methods: ['GET'] )]
public function discussionParentList(
SubjectRepository $subjectRepository,
SchoolYearRepository $schoolYearRepository,
StudentYearRepository $studentYearRepository,
SerializerInterface $serializer
):JsonResponse
{
$user = $this->getUser();
$school = $user->getSchool();
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
$parentStudent = $studentYearRepository->findParentStudents($user, $school);
//$studentsIds = [];
$studentsClass = [];
foreach ($parentStudent as $value){
//$studentsIds[] = $value->getStudent();
$studentsClass[]=$value->getClasse();
}
$contactList = [];
foreach ($studentsClass as $value){
$_subject = $subjectRepository->findBy(['school'=>$school,'classe'=>$value]);
$prof = [];
foreach ($_subject as $val){
$prof[] = [
'prof' => $val->getProf(),
'subject' => $val
];
}
$data=[
'class_name'=>$value->getName(),
'user_infos'=>$prof
];
$contactList[]=$data;
}
$context = SerializationContext::create()->setGroups(["getDiscussion"]);
$jsonPost = $serializer->serialize($contactList,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* discussion prof contact list
* @OA\Tag(name="Discussion")
*/
#[Route(path: '/api/prof/discussion/contact/list', name: 'api_discussion_prof_contact_list', methods: ['GET'] )]
public function profContactList(
SubjectRepository $subjectRepository,
SchoolYearRepository $schoolYearRepository,
StudentYearRepository $studentYearRepository,
SerializerInterface $serializer,
TheClassRepository $theClassRepository,
UserYearRepository $userYearRepository
):JsonResponse
{
$user = $this->getUser();
$subject = $subjectRepository->findBy(['prof'=>$user,'school'=>$user->getSchool()]);
$classes = [];
if ($user->getUserType() === 'admin'){
$classes = $theClassRepository->findBy(['school'=>$user->getSchool()]);
foreach ($classes as $value){
if (!in_array($value, $classes, true)){
$classes[] = $value;
}
}
}elseif ($user->getUserType() === 'prof'){
foreach ($subject as $value){
if (!in_array($value->getClasse(), $classes, true)){
$classes[] = $value->getClasse();
}
}
}
$_users = [];
$users = $userYearRepository->findBy(['year'=>$schoolYearRepository->findOneBy(['active'=>true]),'school'=>$user->getSchool(),'userType'=>'prof'],[]);
$userInfos1 = [];
foreach ($users as $value){
$userDetails1 = [
'userId'=> $value->getUser()->getId(),
'userFullName'=> $value->getUser()->getFullName() ." ~ ".$value->getUser()->getPhone(),
"last_request_ts"=> $value->getUser()->getLastRequestTs(),
'userType'=>'prof',
"phone"=>$value->getUser()->getPhone(),
'userPhoto'=>$value->getUser()->getPicture(),
'student'=>null
];
$userInfos1[] = $userDetails1;
}
$userDetails1 = [
'classeName' => "enseignants",
'userInfos' => $userInfos1
];
$_users[] = $userDetails1;
//dd($users);
$year = $schoolYearRepository->findOneBy(['active'=>true]);
foreach ($classes as $value){
//$className = $value->getName();
$studentsClass = $studentYearRepository->findBy(['classe'=>$value,'school'=>$user->getSchool(),'year'=>$year],[]);
//$userInfos = ['classeName'=>$value->getName()];
$userInfos = [];
foreach ($studentsClass as $val){
if($val && $val->getStudent() && $val->getStudent()->getParent() != null){
$userDetails = [
'userId'=> $val->getStudent()->getParent()?->getId(),
'userFullName'=> $val->getStudent()->getParent()?->getFullName() ." ~ ".$val->getStudent()->getParent()?->getPhone(),
"last_request_ts"=> $val->getStudent()->getParent()?->getLastRequestTs(),
'userType'=>'parent',
'phone'=>$val->getStudent()->getParent()?->getPhone(),
'userPhoto'=>$val->getStudent()->getParent()?->getPicture(),
'student'=>[
'id'=> $val->getStudent()->getId(),
'fullName'=> $val->getStudent()->getFullName(),
]
];
$userInfos[] = $userDetails;
}
}
$userDetails = [
'classeName' => $value->getName(),
'userInfos' => $userInfos
];
$_users[] = $userDetails;
}
$context = SerializationContext::create()->setGroups(["getDiscussion"]);
$jsonPost = $serializer->serialize($_users,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* discussion contact
* @OA\Tag(name="Discussion")
*/
#[Route(path: '/api/discussion/contact', name: 'api_discussion_contact', methods: ['GET'] )]
public function contact(Request $request, PaginatorInterface $paginator,SubjectRepository $subjectRepository, SerializerInterface $serializer, StudentYearRepository $studentYearRepository, SchoolYearRepository $schoolYearRepository):JsonResponse
{
if (!$this->getUser()){
return new JsonResponse(
$serializer->serialize(['message'=>'you must be logged'],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
if ($this->getUser()->getUserType() === (string)'parent'){
$user = $this->getUser();
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
$students = $studentYearRepository->findBy(['year'=>$year]);
$parentStudentsClass = [];
foreach ($students as $value){
if ($value->getStudent()->getParent() === $user){
$parentStudentsClass[]=$value->getClasse();
}
}
$prof = [];
foreach ($parentStudentsClass as $value){
$subject = $subjectRepository->findBy(['classe'=>$value]);
$className = $value->getName();
$userInfos = [];
foreach ($subject as $val){
$subjectName = $val->getName();
$profId = $val->getProf()->getId();
$profName = $val->getProf()->getFirstName(). ' '. $val->getProf()->getLastName();
$profDetails = [
'userId' => $profId,
"last_request_ts"=> $val->getProf()->getLastRequestTs(),
'userFullName' => $profName,
'subject'=>$subjectName,
'userType' => 'teacher',
'student' => null,
];
$userInfos[]=$profDetails;
}
$details = [
'classeName'=>$className,
'userInfos'=>$userInfos,
];
$prof[]=$details;
}
$jsonUser = $serializer->serialize($prof,'json');
return new JsonResponse($jsonUser,Response::HTTP_OK,['accept'=>'application/json'],true);
}
if ($this->getUser()->getUserType() === (string)'prof'){
$user = $this->getUser();
$subject = $subjectRepository->findBy(['prof'=>$user]);
$classe = [];
foreach ($subject as $value){
if (!in_array($value->getClasse(), $classe, true)){
$classe[] = $value->getClasse();
}
}
$year = $schoolYearRepository->findOneBy(['active'=>true]);
$parent = [];
foreach ($classe as $value){
//$className = $value->getName();
$studentsClass = $studentYearRepository->findBy(['classe'=>$value],[]);
//$userInfos = ['classeName'=>$value->getName()];
$userInfos = [];
foreach ($studentsClass as $val){
$userDetails = [
'userId'=> $val->getStudent()->getParent()->getId(),
'userFullName'=> $val->getStudent()->getParent()->getFullName(),
"last_request_ts"=> $val->getStudent()->getParent()->getLastRequestTs(),
'subject'=>null,
'userType'=>'parent',
'student'=>[
'id'=> $val->getStudent()->getId(),
'fullName'=> $val->getStudent()->getFullName(),
]
];
$userInfos[] = $userDetails;
}
$userDetails = [
'classeName' => $value->getName(),
'userInfos' => $userInfos
];
$parent[] = $userDetails;
}
//dd($parent);
$jsonUser = $serializer->serialize($parent,'json');
return new JsonResponse($jsonUser,Response::HTTP_OK,['accept'=>'application/json'],true);
//dd($parent)
//dd($classe);
}
return new JsonResponse(null);
}
/**
* discussion list
* @OA\Tag(name="Discussion")
*/
#[Route(path: 'api/discussion/from/{from}/list', name: 'api_discussion_list', methods: ['GET'] )]
public function discussionList(
$from,
StudentYearRepository $studentYearRepository,
SchoolYearRepository $schoolYearRepository,
SerializerInterface $serializer,
DiscussionMessageRepository $discussionMessageRepository,
DiscussionRepository $discussionRepository,
SubjectRepository $subjectRepository,
PushNotificationService $notification
):JsonResponse
{
if (!$this->getUser()){
return new JsonResponse(
$serializer->serialize(['message'=>'you must be logged'],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
$school = $this->getUser()->getSchool();
$discussion = $discussionRepository->findByDiscussion($this->getUser(),$school/*,(int)$from*/);
$chatWhit = [];
foreach ($discussion as $value){
$unread = $discussionMessageRepository->findBy(['discussion'=>$value,'messageFor'=>$this->getUser(),'isRead'=>false]);
$unreadCount = count($unread);
//dd($unreadCount);
$messageDiscussion = $discussionMessageRepository->findBy(['discussion'=>$value],[]);
//$messageCount = count($messageDiscussion);
//$lastMessage = $messageDiscussion[$messageCount];
//dd($lastMessage);
if ($value->getUserA() !== $this->getUser()){
$user = [
'discussionId'=>$value->getId(),
'time_of_last_message'=>$value->getUpdatedAt(),
'unread_message_count'=>$unreadCount,
'user' => $value->getUserB(),
'userType' => $value->getUserB()->getUserType(),
];
$chatWhit[]=$user;
}elseif($value->getUserB() !== $this->getUser()){
$user = [
'discussionId'=>$value->getId(),
'time_of_last_message'=>$value->getUpdatedAt(),
'unread_message_count'=>$unreadCount,
'user' => $value->getUserB(),
'userType' => $value->getUserB()->getUserType(),
];
$chatWhit[]=$user;
}
}
//dd($chatWhit);
$context = SerializationContext::create()->setGroups(["getDiscussion"]);
$jsonUser = $serializer->serialize($chatWhit,'json',$context);
return new JsonResponse($jsonUser,Response::HTTP_OK,['accept'=>'application/json'],true);
//dd($chatWhit);
}
/**
* discussion new
* @OA\Tag(name="Discussion")
*/
#[Route(path: 'api/discussion/new/whit/{id}/from/{from}/', name: 'api_discussion_new', methods: ['POST','GET'] )]
public function new(
DiscussionMessageRepository $discussionMessageRepository,
HubInterface $hub,
SchoolYearRepository $schoolYearRepository,
SerializerInterface $serializer,
$id,$from,
DiscussionRepository $discussionRepository,
UserRepository $userRepository,
EntityManagerInterface $entityManager,
NotificationsRepository $notificationsRepository,
MessageBusInterface $bus,
PushNotificationService $notification,
Request $request
):JsonResponse{
if (!$this->getUser()){
return new JsonResponse(
$serializer->serialize(['message'=>'you must be logged'],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
$year = $schoolYearRepository->findOneBy(['active'=>true]);
$user = $this->getUser();
$discussionWhit = $userRepository->find($id);
$discussionExist = $discussionRepository->findOneBy(['userA'=>$user,'userB'=>$discussionWhit]);
$discussionExist2 = $discussionRepository->findOneBy(['userA'=>$discussionWhit,'userB'=>$user]);
if ($discussionExist === null && $discussionExist2 === null){
$discussion = new Discussion();
$discussion->setUserA($user);
$discussion->setUserB($discussionWhit);
$discussion->setSchool($this->getUser()->getSchool());
$discussion->setYear($year);
$entityManager->persist($discussion);
$entityManager->flush();
$discussionEntity = $discussion;
}else{
if ($discussionExist === null){
$discussionEntity = $discussionExist2;
}elseif ( $discussionExist2 === null){
$discussionEntity = $discussionExist;
}
}
$msgFor = $userRepository->find($id);
if ($request->isMethod('POST')){
$data = $request->request->all();
$discussionMessage = new DiscussionMessage();
$discussionMessage->setMessageBy($user);
$discussionMessage->setMessageFor($msgFor);
$discussionMessage->setIsRead(false);
$discussionMessage->setMessage((string)$data['message']);
$discussionMessage->setDiscussion($discussionEntity);
if ($data['reply_for_message']!== null && $data['reply_for_message'] !== ''){
$msgId = (int) $data['reply_for_message'];
if ($msgId){
$rpMessage = $discussionMessageRepository->find($msgId);
$discussionMessage->setReplyToMessage($rpMessage);
}
}
$file = $request->files->get('file');
if ($file!==null){
$extensionAuthorize = ["pdf","PDF","PNG",'png','jpg','JPG','JPEG','jpeg','docx','DOCX'];
if (in_array($file->guessExtension(), $extensionAuthorize, true)){
$fileName = md5(uniqid('', true)).'.'.$file->guessExtension();
$file->move($this->getParameter('app.discussion.file.dir'),$fileName);
$discussionMessage->setFileName($fileName);
}else{
return new JsonResponse(
$serializer->serialize(['message'=>'file extension is not supported'],'json'),
Response::HTTP_UNAUTHORIZED,[],
true
);
}
}
if (($file === null) && ($data['message'] === '')){
return new JsonResponse(
$serializer->serialize(['message'=>'file and message is empty, add file and message or one value'],'json'),
Response::HTTP_BAD_REQUEST,[],
true
);
}
$entityManager->persist($discussionMessage);
$entityManager->flush();
$discussionEntity->setCreatedAt(new \DateTime());
$entityManager->flush();
if ($discussionMessage->getReplyToMessage() !== null){
$replyId = $discussionMessage->getReplyToMessage()->getId();
$replyContentArray = [
'id'=>$replyId,
'message_by'=>[
'id'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getId(),
'first_name'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getFirstName(),
'last_name'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getLastName(),
'user_type'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getUserType(),
'last_request_ts'=>$discussionMessage->getReplyToMessage()->getMessageBy()->getLastRequestTs()
],
'message_for'=>[
'id'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getId(),
'first_name'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getFirstName(),
'last_name'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getLastName(),
'user_type'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getUserType(),
'last_request_ts'=>$discussionMessage->getReplyToMessage()->getMessageFor()->getLastRequestTs()
],
'message'=>$discussionMessage->getReplyToMessage()->getMessage(),
'created_at'=>$discussionMessage->getReplyToMessage()->getCreatedAt()
];
}else{
$replyId = 0 ;
$replyContentArray = [];
}
$update = new Update(
'https://armsyschool.com/discussion/message/page/hub/'.$discussionEntity->getId(),
$serializer->serialize(['data'=>[
"id"=>$discussionMessage->getId(),
"message_by"=>[
'id'=>$discussionMessage->getMessageBy()->getId(),
'first_name'=>$discussionMessage->getMessageBy()->getFirstName(),
'last_name'=>$discussionMessage->getMessageBy()->getLastName(),
'user_type'=>$discussionMessage->getMessageBy()->getUserType(),
'last_request_ts'=>$discussionMessage->getMessageBy()->getLastRequestTs()
],
"message_for"=>[
'id'=>$discussionMessage->getMessageFor()->getId(),
'first_name'=>$discussionMessage->getMessageFor()->getFirstName(),
'last_name'=>$discussionMessage->getMessageFor()->getLastName(),
'user_type'=>$discussionMessage->getMessageFor()->getUserType(),
'last_request_ts'=>$discussionMessage->getMessageFor()->getLastRequestTs()
],
"is_read"=>$discussionMessage->isIsRead(),
'message'=>$discussionMessage->getMessage(),
"created_at"=>$discussionMessage->getCreatedAt(),
"reply_to_message"=>$replyContentArray
]],'json')
);
$hub->publish($update);
$update2 = new Update(
'https://armsyschool.com/discussion/list/page/hub/'.$discussionMessage->getMessageFor()->getId(),
$serializer->serialize(['update'=>true],'json')
);
$hub->publish($update2);
$update3 = new Update(
'https://armsyschool.com/discussion/list/page/hub/'.$discussionMessage->getMessageBy()->getId(),
$serializer->serialize(['update'=>true],'json')
);
$hub->publish($update3);
//on envoie la notification apres que Mercure ait envoye le message et que le message n'est pas encore lu
if ($discussionMessage->isIsRead() == false) {
$destinataire = $discussionMessage->getMessageFor();
$lang = $destinataire->getLocalPhoneLang();
$token = $destinataire->getUserToken();
$userId = $destinataire->getId();
$author = $discussionMessage->getMessageBy();
$route = '/drawer/(tabs)/Calls';
if ($author->getUserType() == 'parent') {
$userType = '(parent)';
} elseif ($author->getUserType() == 'prof') {
$userType = '(enseignant ~ ' . $discussionMessage->getDiscussion()->getClasse()->getName() . ')';
} else {
$userType = '(admin)';
}
$title = $destinataire->getFullName() . ' '. $userType;
$message = $discussionMessage->getReplyToMessage() ? $discussionMessage->getReplyToMessage()->getMessage() : $discussionMessage->getMessage();
$notification->sendNotification($token, $title, $message, $route, $userId);
}
return new JsonResponse(
$serializer->serialize(['message'=>'message has been added'],'json'),
Response::HTTP_OK,[],
true
);
}
$message = $discussionMessageRepository->findByMessageFrom($from,$discussionEntity);
$messageIsReadUpdate = $discussionMessageRepository->findBy(['discussion'=>$discussionEntity,'isRead'=>false,'messageFor'=>$this->getUser()]);
foreach ($messageIsReadUpdate as $__value){
$__value->setIsRead(true);
}
$entityManager->flush();
$allMessageCount = count($message);
$getData = [
'total_count' => $allMessageCount, //$chatMessage->getTotalItemCount(),
'me'=>$this->getUser(),
'discussion_id'=>$discussionEntity->getId(),
'data' =>$message /*$chatMessage->getItems()*/,
];
$context = SerializationContext::create()->setGroups(["getDiscussion"]);
$jsonPost = $serializer->serialize($getData, 'json', $context);
return new JsonResponse($jsonPost, Response::HTTP_OK, ['accept' => 'application/json'], true);
//dd($message);
}
/**
* discussion message hub subscribe
* @OA\Tag(name="Discussion")
*/
#[Route(path: '/api/discussion/{id}/message/mercure/hub', name: 'api_discussion_message_subscribe_mercure_hub', methods: ['GET'])]
public function getParentSubscribeLateMercureHub($id,SerializerInterface $serializer, Environment $twig, UserRepository $userRepository):JsonResponse
{
$mercureHubSubscribeUrl = "https://armsyschool.com/discussion/message/page/hub/".$id;
try {
$result = $twig->render('mercure/client_hub_url.html.twig', [
'url' => $mercureHubSubscribeUrl
]);
} catch (LoaderError|RuntimeError|SyntaxError $e) {
}
return new JsonResponse($serializer->serialize([ 'mercure_client_hub_url'=>$result], 'json'),Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* discussion list update hub subscribe
* @OA\Tag(name="Discussion")
*/
#[Route(path: '/api/discussion/list/user/mercure/hub', name: 'api_discussion_list_user_subscribe_mercure_hub', methods: ['GET'])]
public function getDiscussionSubscribeLateMercureHub(SerializerInterface $serializer, Environment $twig, UserRepository $userRepository):JsonResponse
{
$id = $this->getUser()->getId();
$mercureHubSubscribeUrl = "'https://armsyschool.com/discussion/list/page/hub/".$id;
try {
$result = $twig->render('mercure/client_hub_url.html.twig', [
'url' => $mercureHubSubscribeUrl
]);
} catch (LoaderError|RuntimeError|SyntaxError $e) {
}
return new JsonResponse($serializer->serialize([ 'mercure_client_hub_url'=>$result], 'json'),Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* discussion notification
* @OA\Tag(name="Discussion")
*/
#[Route('api/discussion/notifications', name: 'api_discussion_notifications', methods: ['GET'])]
public function notification(DiscussionMessageRepository $discussionMessageRepository,
Request $request,
NotificationsRepository $notificationsRepository,
SerializerInterface $serializer): JsonResponse
{
$data = $discussionMessageRepository->findBy(["messageFor"=>$this->getUser(),"isRead"=>false],['id'=>'DESC']);
if (count($data)>0){
return new JsonResponse(
$serializer->serialize(['title'=>'Messages',"message" =>'vous avez '. count($data)." message(s) non lu(s)" ],'json'),
Response::HTTP_OK,['accept'=>'application/json'],
true
);
}
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
}
/**
* discussion update notification
* @OA\Tag(name="Discussion")
*/
#[Route('api/discussion/notifications/update', name: 'api_discussion_notifications_update', methods: ['GET'])]
public function notificationUpdate(DiscussionMessageRepository $discussionMessageRepository,
Request $request,
NotificationsRepository $notificationsRepository,
SerializerInterface $serializer,
EntityManagerInterface $entityManager
): JsonResponse
{
$data = $discussionMessageRepository->findBy(["messageFor"=>$this->getUser(),"isRead"=>false],['id'=>'DESC']);
if (count($data)>0){
foreach ($data as $value){
$value->setIsRead(1);
}
$entityManager->flush();
}
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
}
/**
* discussion message update content
* @OA\Tag(name="Discussion")
*/
#[Route('api/discussion/{id}/message/update/last/count/{totalItem}', name: 'api_discussion_message_update', methods: ['GET'])]
public function discussionUpdateContent(DiscussionMessageRepository $discussionMessageRepository,
$id,
$totalItem,
Request $request,
EntityManagerInterface $entityManager,
DiscussionRepository $discussionRepository,
NotificationsRepository $notificationsRepository,
SerializerInterface $serializer): JsonResponse
{
$discussion = $discussionRepository->findOneBy(['id'=>$id],[]);
$data = $discussionMessageRepository->findBy(["discussion"=>$discussion],['id'=>'DESC']);
$newCount = count($data);
$prevCount = (int)$totalItem;
$countRapport = $newCount-$prevCount;
if($newCount>$prevCount){
$message = $discussionMessageRepository->findBy(["discussion"=>$discussion],[],$countRapport,$prevCount);
$messageIsReadUpdate = $discussionMessageRepository->findBy(['discussion'=>$discussion,'isRead'=>false,'messageFor'=>$this->getUser()]);
foreach ($messageIsReadUpdate as $__value){
$__value->setIsRead(true);
}
$entityManager->flush();
$getData = [
//'current_page_number' => $chatMessage->getCurrentPageNumber(),
//'number_per_page' => $chatMessage->getItemNumberPerPage(),
'total_count' => $newCount, //$chatMessage->getTotalItemCount(),
//'me'=>$this->getUser(),
'data' =>$message /*$chatMessage->getItems()*/,
];
$context = SerializationContext::create()->setGroups(["getDiscussion"]);
$jsonPost = $serializer->serialize($getData, 'json', $context);
return new JsonResponse($jsonPost, Response::HTTP_OK, ['accept' => 'application/json'], true);
}
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
}
}