From 2fa34b077104dded360868079a594618c36cb8ae Mon Sep 17 00:00:00 2001
From: Ninassi Benjamin <benjamin.ninassi@inria.fr>
Date: Thu, 22 Nov 2018 14:58:09 +0100
Subject: [PATCH] Adding meeting times and people management

---
 app/config/security.yml                       |  25 +-
 .../Command/ImportPeopleCommand.php           |   4 +-
 .../Controller/MeetingController.php          | 329 +++++++++++++++++-
 .../Controller/PeopleController.php           | 305 ++++++++++++++--
 src/ClassCodeBundle/Entity/Meeting.php        | 116 +++---
 src/ClassCodeBundle/Entity/People.php         |  25 +-
 .../Resources/translations/messages.fr.yml    |  12 +
 .../views/People/queryUsers.json.twig         |   2 +
 .../Resources/views/simpleResult.json.twig    |   1 +
 9 files changed, 722 insertions(+), 97 deletions(-)
 create mode 100644 src/ClassCodeBundle/Resources/views/People/queryUsers.json.twig
 create mode 100644 src/ClassCodeBundle/Resources/views/simpleResult.json.twig

diff --git a/app/config/security.yml b/app/config/security.yml
index 653c1d1..d010e83 100644
--- a/app/config/security.yml
+++ b/app/config/security.yml
@@ -3,16 +3,21 @@
 security:
     encoders:
         PixeesBundle\Entity\People:
-            algorithm: plaintext       
+            algorithm: plaintext      
+        Symfony\Component\Security\Core\User\User: plaintext 
             
     # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
     providers:
-       pixees_provider:
-           entity:
-               class: PixeesBundle:People
-               property: username
+        in_memory:
+            memory: 
+                users:
+                  pixees: { password: 'Cl455c0d3U53r', roles: 'ROLE_ADMIN' }
+        pixees_provider:
+            entity:
+                class: PixeesBundle:People
+                property: username
                 # if you're using multiple entity managers
-               manager_name: pixees
+                manager_name: pixees
 
     firewalls:
         # disables authentication for assets and the profiler, adapt it according to your needs
@@ -23,8 +28,10 @@ security:
         main:
             anonymous: ~
             pattern:    ^/
-            http_basic: ~
-            provider: pixees_provider           
+            provider: pixees_provider      
+            http_basic: 
+                realm: 'API'
+                provider: in_memory                 
             stateless: true    
             guard:
                 authenticators:
@@ -36,3 +43,5 @@ security:
 
             # https://symfony.com/doc/current/security/form_login_setup.html
             #form_login: ~
+    role_hierarchy:
+        ROLE_ADMIN: [ROLE_USER]
\ No newline at end of file
diff --git a/src/ClassCodeBundle/Command/ImportPeopleCommand.php b/src/ClassCodeBundle/Command/ImportPeopleCommand.php
index c9b566e..b1236b4 100644
--- a/src/ClassCodeBundle/Command/ImportPeopleCommand.php
+++ b/src/ClassCodeBundle/Command/ImportPeopleCommand.php
@@ -53,7 +53,7 @@ class ImportPeopleCommand extends ContainerAwareCommand
     $log_msg .= "Import People ... \n";
     $old_time = time();      
 
-    $rawSql = "SELECT p.id,p.user_login,p.user_nicename,p.user_email,g.street,g.city, g.state, g.zipcode,g.country_long, g.formatted_address, g.lat, g.long FROM wp_users p left join wppl_friends_locator g on g.member_id = p.id ;";
+    $rawSql = "SELECT p.id,p.user_login,p.display_name,p.user_email,g.street,g.city, g.state, g.zipcode,g.country_long, g.formatted_address, g.lat, g.long FROM wp_users p left join wppl_friends_locator g on g.member_id = p.id ;";
     $stmt = $emp->getConnection()->prepare($rawSql);
     $stmt->execute();
     $people_in_wp = $stmt->fetchAll();
@@ -72,7 +72,7 @@ class ImportPeopleCommand extends ContainerAwareCommand
       }      
       $people->setUserId($p['id']);
       $people->setUsername($p['user_login']);
-      $people->setDisplayname($p['user_nicename']);
+      $people->setDisplayname($p['display_name']);
       $people->setEmail($p['user_email']);
       
       //recuperation des donnnées de profil budypress
diff --git a/src/ClassCodeBundle/Controller/MeetingController.php b/src/ClassCodeBundle/Controller/MeetingController.php
index 8e89455..7a5fa06 100644
--- a/src/ClassCodeBundle/Controller/MeetingController.php
+++ b/src/ClassCodeBundle/Controller/MeetingController.php
@@ -8,6 +8,8 @@ use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpFoundation\Response;
 use ClassCodeBundle\Entity\Meeting;
+use ClassCodeBundle\Entity\People;
+
 
 
 class MeetingController extends Controller
@@ -18,8 +20,7 @@ class MeetingController extends Controller
   public function indexAction(Request $request)
   {
     if($this->get('security.authorization_checker')->isGranted('ROLE_USER')){
-      $em = $this->getDoctrine()->getManager();  
-
+      $em = $this->getDoctrine()->getManager();       
       $meetings =  $em->getRepository('ClassCodeBundle:Meeting')->findAll(); 
       $meetingsWithGeoloc =  $em->getRepository('ClassCodeBundle:Meeting')->findAllWithGeoLoc(); 
       return $this->render('@ClassCode/Meeting/list.html.twig', array(
@@ -56,6 +57,7 @@ class MeetingController extends Controller
      
       $tmp_array['id'] = $m->getId();
       $tmp_array['ownerId'] = $tmp_owner->getUserId();
+      $tmp_array['ownerDisplayName'] = $tmp_owner->getCommonDisplayname();
       $date = \DateTime::createFromFormat('d/m/Y', $m->getDate());
       $tmp_array['date'] = $m->getDate();
       $tmp_array["past"] = !($date != '' && $date > $today);
@@ -105,14 +107,18 @@ class MeetingController extends Controller
         $tmp_owner = $m->getOwner();
         $tmp_facilitator = $tmp_owner->getFacilitator();
         $tmp_subsribers_array = array();
+        $tmp_subsribersmails_string = $tmp_owner->getEmail();
         foreach ($m->getSubscribers() as $subscriber) {
           if($subscriber->getFacilitator()){
             $tmp_facilitator = true;
           }
           $tmp_subsribers_array[]=$subscriber->getUserId();
+          $tmp_subsribersmails_string .= ";".$subscriber->getEmail();
         }
         $tmp_array['id'] = $m->getId();
         $tmp_array['ownerId'] = $tmp_owner->getUserId();
+        $tmp_array['ownerDisplayName'] = $tmp_owner->getCommonDisplayname();
+        $tmp_array['ownerEmail'] = $tmp_owner->getEmail();
         $date = \DateTime::createFromFormat('d/m/Y', $m->getDate());
         $tmp_array['date'] = $m->getDate();
         $tmp_array["past"] = !($date != '' && $date > $today);
@@ -136,6 +142,7 @@ class MeetingController extends Controller
         $tmp_array['location'] = $tmp_location_array;
         $tmp_array['facilitateur'] = $tmp_facilitator;
         $tmp_array['subscribers'] = $tmp_subsribers_array;
+        $tmp_array['subscribersMails'] = $tmp_subsribersmails_string;
       
         $meeting=$tmp_array;
       }
@@ -144,4 +151,322 @@ class MeetingController extends Controller
       'meeting' => $meeting,
     ));
   }
+
+ /**
+   * @Route("/registermeeting", name="meeting_register")
+   */
+  public function registermeetingAction(Request $request)
+  {
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')&&($request->getMethod() == 'POST')){
+      $em = $this->getDoctrine()->getManager();
+      $token = $this->get('security.token_storage')->getToken() ; 
+      $user = $token->getUser();
+      $meetingId = ltrim(rtrim($request->request->get("meetingId")));
+      $unregister = false;
+      $unregister = ltrim(rtrim($request->request->get("unregister")));       
+      $redirectUrl = ltrim(rtrim($request->request->get("redirect")));
+      $errorMessage = "";
+      $successMessage = "";
+      if(isset($meetingId)&&($meetingId != '')){ 
+        $m =  $em->getRepository('ClassCodeBundle:Meeting')->findOneBy(array('id' =>$meetingId));
+        if($m){
+          $p = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$user->getId()));
+          if($p){
+            if($unregister){
+              $m->removeSubscriber($p);
+              $em->persist($m);
+              $em->flush();  
+              $successMessage = $this->get('translator')->trans('success.subscriberRemoved');
+            }else{
+              $m->addSubscriber($p);
+              $em->persist($m);
+              $em->flush();  
+              $successMessage = $this->get('translator')->trans('success.subscriberAdded');
+            }
+          }else{
+            $errorMessage = $this->get('translator')->trans('error.peoplenotfound');
+          }
+        }else{
+          $errorMessage = $this->get('translator')->trans('error.meetingnotfound');
+        }        
+      }else{
+        $errorMessage = $this->get('translator')->trans('error.missingparameter'); 
+      }
+      if(isset($redirectUrl)&&($redirectUrl != '')){
+        return $this->redirect($redirectUrl);
+      }else{
+        if($errorMessage != ''){
+          $this ->get('session')->getFlashBag()->add('error', $errorMessage);  
+        }else{
+          if($successMessage != ''){
+            $this ->get('session')->getFlashBag()->add('success', $successMessage);
+          }
+        }
+        $meetings =  $em->getRepository('ClassCodeBundle:Meeting')->findAll(); 
+        $meetingsWithGeoloc =  $em->getRepository('ClassCodeBundle:Meeting')->findAllWithGeoLoc(); 
+        return $this->render('@ClassCode/Meeting/list.html.twig', array(
+        'meetings' => $meetings,
+        'meetingsWithGeoloc' => $meetingsWithGeoloc,
+        ));        
+      }
+    }else{
+      return  $this->render('@ClassCode/error_auth.html.twig'); 
+    }       
+  }
+
+  /**
+   * @Route("/editmeeting", name="meeting_edit")
+   */
+  public function editmeetingAction(Request $request)
+  {
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')&&($request->getMethod() == 'POST')){
+      $em = $this->getDoctrine()->getManager();
+      $token = $this->get('security.token_storage')->getToken() ; 
+      $user = $token->getUser();
+      $userName = $user->getUserName();
+      $redirectUrl = ltrim(rtrim($request->request->get("redirect")));
+      $meetingId = ltrim(rtrim($request->request->get("meetingId")));
+      $meetingDate = ltrim(rtrim($request->request->get("meeting_date")));
+      $meetingTime = ltrim(rtrim($request->request->get("meeting_time")));
+      $meetingStructure = ltrim(rtrim($request->request->get("structure")));
+      $meetingStreet = ltrim(rtrim($request->request->get("meeting_street")));
+      $meetingCity = ltrim(rtrim($request->request->get("meeting_city")));
+      $meetingCountry = ltrim(rtrim($request->request->get("meeting_country")));
+      $meetingCapacity = ltrim(rtrim($request->request->get("capacity")));
+      $meetingHangout = ltrim(rtrim($request->request->get("meeting_hangout")));
+      $meetingMore = ltrim(rtrim($request->request->get("meeting_more")));
+      $meetingLat = ltrim(rtrim($request->request->get("meeting_lat"))); 
+      $meetingLng = ltrim(rtrim($request->request->get("meeting_lng"))); 
+      $meetingFormattedAddress = ltrim(rtrim($request->request->get("meeting_formatted_address")));  
+      $meetingState = ltrim(rtrim($request->request->get("meeting_state"))); 
+      $meetingZipCode = ltrim(rtrim($request->request->get("meeting_zipcode")));  
+      $meetingSubject = ltrim(rtrim($request->request->get("meeting_module")));
+      $meetingPrecisions = ltrim(rtrim($request->request->get("meeting_precisions")));   
+      $actionDuplicate = ltrim(rtrim($request->request->get("duplicate")));
+      if($actionDuplicate == 'true'){
+        return $this->redirectToRoute('meeting_duplicate', array('request' => $request), 307);
+      }  
+      $actionDelete = ltrim(rtrim($request->request->get("delete")));                        
+      if($actionDelete == 'true'){
+        return $this->redirectToRoute('meeting_delete', array('request' => $request), 307);
+      }
+      $action = ''; 
+      $p = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$user->getId()));
+      if($p){           
+        if(isset($meetingId)&&($meetingId != '')){ // edit 
+          $entity_meeting =  $em->getRepository('ClassCodeBundle:Meeting')->findOneBy(array('id' =>$meetingId));
+          if(!$entity_meeting){
+            $errorMessage = $this->get('translator')->trans('error.meetingnotfound');
+          }else{
+            if(($entity_meeting->getOwner()->getUserId() != $user->getId())&&(!$this->get('security.authorization_checker')->isGranted('ROLE_ADMIN'))){
+              return  $this->render('@ClassCode/error_auth.html.twig'); 
+            }
+            $action = 'update' ;
+          }        
+        }else{ // create
+          $action = 'create' ;
+          $entity_meeting = new Meeting();
+          $entity_meeting->setOwner($p); 
+        }    
+        $entity_meeting->setDate($meetingDate);
+        $entity_meeting->setTime($meetingTime);
+        $entity_meeting->setStructure($meetingStructure);
+        $entity_meeting->setStreet($meetingStreet);
+        $entity_meeting->setCity($meetingCity);
+        $entity_meeting->setState($meetingState);
+        $entity_meeting->setZipcode($meetingZipCode);
+        $entity_meeting->setCountry($meetingCountry);
+        $entity_meeting->setFormattedAddress($meetingFormattedAddress);
+        $entity_meeting->setLatitude($meetingLat);
+        $entity_meeting->setLongitude($meetingLng);
+        $entity_meeting->setCapacity($meetingCapacity);
+        $entity_meeting->setHangoutLink($meetingHangout);
+        $entity_meeting->setMore($meetingMore);
+        $entity_meeting->setSubject($meetingSubject);
+        $entity_meeting->setPrecisions($meetingPrecisions);
+        $entity_meeting->setUpdatedAt(new \DateTime());
+        $entity_meeting->setUpdatedBy($userName);
+        $em->persist($entity_meeting);
+        $em->flush();
+        if($action == 'create'){
+          $successMessage = $this->get('translator')->trans('success.meetingCreated');
+        }elseif($action == 'update'){
+          $successMessage = $this->get('translator')->trans('success.meetingEdited');  
+        }
+        
+      }else{
+        $errorMessage = $this->get('translator')->trans('error.peoplenotfound');
+      }
+      
+      if(isset($redirectUrl)&&($redirectUrl != '')){
+        if(strstr($redirectUrl,"?")){
+          $redirectUrl = $redirectUrl."&";
+        }else{
+          $redirectUrl = $redirectUrl."?";
+        }
+        $redirectUrl = $redirectUrl."meetingId=".$entity_meeting->getId()."&action=".$action;
+        return $this->redirect($redirectUrl);
+      }else{
+        if($errorMessage != ''){
+          $this ->get('session')->getFlashBag()->add('error', $errorMessage);  
+        }else{
+          if($successMessage != ''){
+            $this ->get('session')->getFlashBag()->add('success', $successMessage);
+          }
+        }
+        $meetings =  $em->getRepository('ClassCodeBundle:Meeting')->findAll(); 
+        $meetingsWithGeoloc =  $em->getRepository('ClassCodeBundle:Meeting')->findAllWithGeoLoc(); 
+        return $this->render('@ClassCode/Meeting/list.html.twig', array(
+        'meetings' => $meetings,
+        'meetingsWithGeoloc' => $meetingsWithGeoloc,
+        ));        
+      }
+    }else{
+      return  $this->render('@ClassCode/error_auth.html.twig'); 
+    }       
+  }
+  
+  /**
+   * @Route("/duplicatemeeting", name="meeting_duplicate")
+   */
+  public function duplicatemeetingAction(Request $request)
+  {
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')&&($request->getMethod() == 'POST')){
+      $em = $this->getDoctrine()->getManager();
+      $token = $this->get('security.token_storage')->getToken() ; 
+      $user = $token->getUser();
+      $userName = $user->getUserName();
+      $redirectUrl = ltrim(rtrim($request->request->get("redirect")));
+      $meetingId = ltrim(rtrim($request->request->get("meetingId")));
+                        
+      $action = 'duplicate'; 
+      $p = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$user->getId()));
+      if($p){           
+        if(isset($meetingId)&&($meetingId != '')){ // edit 
+          $entity_meeting =  $em->getRepository('ClassCodeBundle:Meeting')->findOneBy(array('id' =>$meetingId));
+          if(!$entity_meeting){
+            $errorMessage = $this->get('translator')->trans('error.meetingnotfound');
+          }else{
+            $duplicate_meeting = new Meeting();
+            $duplicate_meeting->setOwner($p); 
+            $duplicate_meeting->setDate($entity_meeting->getDate());
+            $duplicate_meeting->setTime($entity_meeting->getTime());
+            $duplicate_meeting->setStructure($entity_meeting->getStructure());
+            $duplicate_meeting->setStreet($entity_meeting->getStreet());
+            $duplicate_meeting->setCity($entity_meeting->getCity());
+            $duplicate_meeting->setState($entity_meeting->getState());
+            $duplicate_meeting->setZipcode($entity_meeting->getZipcode());
+            $duplicate_meeting->setCountry($entity_meeting->getCountry());
+            $duplicate_meeting->setFormattedAddress($entity_meeting->getFormattedAddress());
+            $duplicate_meeting->setLatitude($entity_meeting->getLatitude());
+            $duplicate_meeting->setLongitude($entity_meeting->getLongitude());
+            $duplicate_meeting->setCapacity($entity_meeting->getCapacity());
+            $duplicate_meeting->setHangoutLink($entity_meeting->getHangoutLink());
+            $duplicate_meeting->setMore($entity_meeting->getMore());
+            $duplicate_meeting->setSubject($entity_meeting->getSubject());
+            $duplicate_meeting->setPrecisions($entity_meeting->getPrecisions());
+            $duplicate_meeting->setUpdatedAt(new \DateTime());
+            $duplicate_meeting->setUpdatedBy($userName);
+            $em->persist($duplicate_meeting);
+            $em->flush();
+            $successMessage = $this->get('translator')->trans('success.meetingDuplicated');  
+          }        
+        }else{ // meeting doesn't exist
+          $errorMessage = $this->get('translator')->trans('error.meetingnotfound');
+        }    
+      }else{
+        $errorMessage = $this->get('translator')->trans('error.peoplenotfound');
+      }
+      
+      if(isset($redirectUrl)&&($redirectUrl != '')){
+        if(strstr($redirectUrl,"?")){
+          $redirectUrl = $redirectUrl."&";
+        }else{
+          $redirectUrl = $redirectUrl."?";
+        }
+        $redirectUrl = $redirectUrl."meetingId=".$duplicate_meeting->getId()."&action=".$action;
+        return $this->redirect($redirectUrl);
+      }else{
+        if($errorMessage != ''){
+          $this ->get('session')->getFlashBag()->add('error', $errorMessage);  
+        }else{
+          if($successMessage != ''){
+            $this ->get('session')->getFlashBag()->add('success', $successMessage);
+          }
+        }
+        $meetings =  $em->getRepository('ClassCodeBundle:Meeting')->findAll(); 
+        $meetingsWithGeoloc =  $em->getRepository('ClassCodeBundle:Meeting')->findAllWithGeoLoc(); 
+        return $this->render('@ClassCode/Meeting/list.html.twig', array(
+        'meetings' => $meetings,
+        'meetingsWithGeoloc' => $meetingsWithGeoloc,
+        ));        
+      }
+    }else{
+      return  $this->render('@ClassCode/error_auth.html.twig'); 
+    }       
+  }
+
+  /**
+   * @Route("/deletemeeting", name="meeting_delete")
+   */
+  public function deletemeetingAction(Request $request)
+  {
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')&&($request->getMethod() == 'POST')){
+      $em = $this->getDoctrine()->getManager();
+      $token = $this->get('security.token_storage')->getToken() ; 
+      $user = $token->getUser();
+      $userName = $user->getUserName();
+      $redirectUrl = ltrim(rtrim($request->request->get("redirect")));
+      $meetingId = ltrim(rtrim($request->request->get("meetingId")));
+      $action = 'delete'; 
+      
+      $p = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$user->getId()));
+      if($p){           
+        if(isset($meetingId)&&($meetingId != '')){ // delete 
+          $entity_meeting =  $em->getRepository('ClassCodeBundle:Meeting')->findOneBy(array('id' =>$meetingId));
+          if(!$entity_meeting){
+            $errorMessage = $this->get('translator')->trans('error.meetingnotfound');
+          }else{
+            if(($entity_meeting->getOwner()->getUserId() != $user->getId())&&(!$this->get('security.authorization_checker')->isGranted('ROLE_ADMIN'))){
+              return  $this->render('@ClassCode/error_auth.html.twig'); 
+            }else{
+              $em->remove($entity_meeting);
+              $em->flush();  
+              $successMessage = $this->get('translator')->trans('success.meetingDeleted');     
+            }
+          }        
+        }else{
+          $errorMessage = $this->get('translator')->trans('error.meetingnotfound');
+        }
+      }else{
+        $errorMessage = $this->get('translator')->trans('error.peoplenotfound');
+      }
+      
+      if(isset($redirectUrl)&&($redirectUrl != '')){
+        if(strstr($redirectUrl,"?")){
+          $redirectUrl = $redirectUrl."&";
+        }else{
+          $redirectUrl = $redirectUrl."?";
+        }
+        $redirectUrl = $redirectUrl."action=".$action;
+        return $this->redirect($redirectUrl);
+      }else{
+        if($errorMessage != ''){
+          $this ->get('session')->getFlashBag()->add('error', $errorMessage);  
+        }else{
+          if($successMessage != ''){
+            $this ->get('session')->getFlashBag()->add('success', $successMessage);
+          }
+        }
+        $meetings =  $em->getRepository('ClassCodeBundle:Meeting')->findAll(); 
+        $meetingsWithGeoloc =  $em->getRepository('ClassCodeBundle:Meeting')->findAllWithGeoLoc(); 
+        return $this->render('@ClassCode/Meeting/list.html.twig', array(
+        'meetings' => $meetings,
+        'meetingsWithGeoloc' => $meetingsWithGeoloc,
+        ));        
+      }
+    }else{
+      return  $this->render('@ClassCode/error_auth.html.twig'); 
+    }       
+  }
 }
diff --git a/src/ClassCodeBundle/Controller/PeopleController.php b/src/ClassCodeBundle/Controller/PeopleController.php
index e929588..35cdec2 100644
--- a/src/ClassCodeBundle/Controller/PeopleController.php
+++ b/src/ClassCodeBundle/Controller/PeopleController.php
@@ -30,35 +30,37 @@ class PeopleController extends Controller
       return  $this->render('@ClassCode/error_auth.html.twig');
     } 
   }
+  
    /**
    * @Route("/queryuserloc.{_format}", name="queryuserloc",defaults={"_format"="json"},requirements={"_format"="json"}))
    */
   public function queryUserLocAction(Request $request)
   {    
-    $userLat = 0;
-    $userLng = 0;
-    $userStreet = "";
-    $userZipCode = "";
-    $userCity = "";
-    $userState = "";
-    $userCountry = "";
-    $userFormattedAddress = "";    
-    $userId = ltrim(rtrim($request->query->get("userId")));   
-    if(isset($userId)&&($userId != '')){
-     $em = $this->getDoctrine()->getManager();  
-     $user = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$userId));
-     if($user){
-       $userLat = $user->getLatitude();
-       $userLng = $user->getLongitude();         
-       $userStreet = $user->getStreet();
-       $userZipCode = $user->getZipcode();
-       $userCity = $user->getCity();
-       $userState = $user->getState();
-       $userCountry = $user->getCountry();
-       $userFormattedAddress = $user->getFormattedAddress();
-     }
-    }
-    return $this->render('@ClassCode/People/queryUserLoc.json.twig', array(
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')){
+      $userLat = 0;
+      $userLng = 0;
+      $userStreet = "";
+      $userZipCode = "";
+      $userCity = "";
+      $userState = "";
+      $userCountry = "";
+      $userFormattedAddress = "";    
+      $userId = ltrim(rtrim($request->query->get("userId")));   
+      if(isset($userId)&&($userId != '')){
+       $em = $this->getDoctrine()->getManager();  
+       $user = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$userId));
+       if($user){
+         $userLat = $user->getLatitude();
+         $userLng = $user->getLongitude();         
+         $userStreet = $user->getStreet();
+         $userZipCode = $user->getZipcode();
+         $userCity = $user->getCity();
+         $userState = $user->getState();
+         $userCountry = $user->getCountry();
+         $userFormattedAddress = $user->getFormattedAddress();
+       }
+      }
+      return $this->render('@ClassCode/People/queryUserLoc.json.twig', array(
        'userlat' => $userLat,
        'userlng' => $userLng,
        'userStreet' => $userStreet,
@@ -68,6 +70,259 @@ class PeopleController extends Controller
        'userState' => $userState,
        'userFormattedAddress' => $userFormattedAddress
       ));  
-    
+    }else{
+      return  $this->render('@ClassCode/error_auth.html.twig');
+    }
+  }
+
+  /**
+   * @Route("/queryuserswithloc.{_format}", name="queryuserswithloc",defaults={"_format"="json"},requirements={"_format"="json"}))
+   */
+  public function queryUsersWithLocAction(Request $request)
+  {
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')){
+      $em = $this->getDoctrine()->getManager();  
+      $peopleWithGeoloc =  $em->getRepository('ClassCodeBundle:People')->findAllWithGeoLoc(); 
+      $people_array = array(); 
+      foreach ($peopleWithGeoloc as $people) {
+        $tmp_array = array();
+        $tmp_array['userId'] = $people->getUserId();
+        $tmp_array['username'] = $people->getUsername();
+        $tmp_array['displayname'] = $people->getCommonDisplayname();
+        $tmp_array['email'] = $people->getEmail();
+        $tmp_array['avatar'] = $people->getAvatar();
+        $tmp_array['avatarImg'] = $people->getAvatarImg();
+        $tmp_array['firstname'] = $people->getFirstname();
+        $tmp_array['lastname'] = $people->getLastname();
+        $tmp_array['nickname'] = $people->getNickname();
+        $tmp_array['structure'] = $people->getStructure();
+        $tmp_array['context'] = $people->getContext();
+        $tmp_array['profile'] = $people->getProfile();
+        $tmp_array['teaching'] = $people->getTeaching();
+        $tmp_array['facilitator'] = $people->getFacilitator();
+        $tmp_array['computerJob'] = $people->getComputerJob();
+        $tmp_array['learning'] = $people->getLearning();
+        $tmp_array['skills'] = $people->getSkills();
+        $tmp_location_array['street'] = $people->getStreet();  
+        $tmp_location_array['city'] = $people->getCity(); 
+        $tmp_location_array['zipcode'] = $people->getZipcode(); 
+        $tmp_location_array['state'] = $people->getState(); 
+        $tmp_location_array['country'] = $people->getCountry(); 
+        $tmp_location_array['formattedAddress'] = $people->getFormattedAddress(); 
+        $tmp_location_array['lat'] = $people->getLatitude(); 
+        $tmp_location_array['lng'] = $people->getLongitude();  
+        $tmp_array['location'] = $tmp_location_array;          
+        $people_array[]=$tmp_array;
+      }
+      return $this->render('@ClassCode/People/queryUsers.json.twig', array(
+        'people' => $people_array,
+      ));
+    }else{
+      return  $this->render('@ClassCode/error_auth.html.twig');
+    }
+  }
+
+  /**
+   * @Route("/queryuserprofile.{_format}", name="queryuserprofile",defaults={"_format"="json"},requirements={"_format"="json"}))
+   */
+  public function queryUserProfileAction(Request $request)
+  {
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')){
+      $people_array = array();   
+      $userId = ltrim(rtrim($request->query->get("userId")));   
+      if(isset($userId)&&($userId != '')){
+        $em = $this->getDoctrine()->getManager();         
+        $people = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$userId));
+        if($people){
+          $people_array['userId'] = $people->getUserId();
+          $people_array['username'] = $people->getUsername();
+          $people_array['displayname'] = $people->getCommonDisplayname();
+          $people_array['email'] = $people->getEmail();
+          $people_array['avatar'] = $people->getAvatar();
+          $people_array['avatarImg'] = $people->getAvatarImg();
+          $people_array['firstname'] = $people->getFirstname();
+          $people_array['lastname'] = $people->getLastname();
+          $people_array['nickname'] = $people->getNickname();
+          $people_array['structure'] = $people->getStructure();
+          $people_array['context'] = $people->getContext();
+          $people_array['profile'] = $people->getProfile();
+          $people_array['teaching'] = $people->getTeaching();
+          $people_array['facilitator'] = $people->getFacilitator();
+          $people_array['computerJob'] = $people->getComputerJob();
+          $people_array['learning'] = $people->getLearning();
+          $people_array['skills'] = $people->getSkills();
+          $tmp_location_array['street'] = $people->getStreet();  
+          $tmp_location_array['city'] = $people->getCity(); 
+          $tmp_location_array['zipcode'] = $people->getZipcode(); 
+          $tmp_location_array['state'] = $people->getState(); 
+          $tmp_location_array['country'] = $people->getCountry(); 
+          $tmp_location_array['formattedAddress'] = $people->getFormattedAddress(); 
+          $tmp_location_array['lat'] = $people->getLatitude(); 
+          $tmp_location_array['lng'] = $people->getLongitude(); 
+          if(($tmp_location_array['lat']!='0') || ($tmp_location_array['lng']!='0')){ 
+            $people_array['location'] = $tmp_location_array;
+          }
+        }
+       }
+        
+      return $this->render('@ClassCode/People/queryUsers.json.twig', array(
+        'people' => $people_array,
+      ));
+    }else{
+      return  $this->render('@ClassCode/error_auth.html.twig');
+    } 
+  }
+
+ /**
+   * @Route("/editpeople", name="people_edit")
+   */
+  public function editpeopleAction(Request $request)
+  {
+    if($this->get('security.authorization_checker')->isGranted('ROLE_USER')&&($request->getMethod() == 'POST')){
+      $em = $this->getDoctrine()->getManager();
+      $token = $this->get('security.token_storage')->getToken() ; 
+      $user = $token->getUser();
+      $userName = $user->getUserName();
+      $modifiedUserId = ltrim(rtrim($request->request->get("userId")));
+      $modifiedUserLogin = ltrim(rtrim($request->request->get("username")));
+      $errorMessage ="";
+      $action = "";
+      $origin = ltrim(rtrim($request->request->get("origin")));     
+      if(($userName == $modifiedUserLogin) || $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')){
+        if(isset($modifiedUserId)&&($modifiedUserId != '')){ 
+          $people = $em->getRepository('ClassCodeBundle:People')->findOneBy(array('userId' =>$modifiedUserId));
+          if(!$people){
+            $action = 'create' ; 
+            $people = new People();
+            $people->setUserId($currentUserId);
+          }else{
+            $action = "update";
+          }
+          
+          if(null !== $request->request->get("username")){ 
+            $people->setUsername(ltrim(rtrim($request->request->get("username"))));
+          }
+          if(null !== $request->request->get("avatar")){
+            $people->setAvatar(ltrim(rtrim($request->request->get("avatar"))));
+          }
+          if(null !== $request->request->get("avatarImg")){
+            $people->setAvatarImg(ltrim(rtrim($request->request->get("avatarImg"))));
+          }
+          if(null !== $request->request->get("firstname")){
+            $people->setFirstname(ltrim(rtrim($request->request->get("firstname"))));
+          }
+          if(null !== $request->request->get("lastname")){
+            $people->setLastname(ltrim(rtrim($request->request->get("lastname"))));
+          }
+          if(null !== $request->request->get("email")){
+             $people->setEmail(ltrim(rtrim($request->request->get("email"))));
+          }
+          if(null !== $request->request->get("nickname")){
+            $people->setNickname(ltrim(rtrim($request->request->get("nickname"))));
+          }
+          if(null !== $request->request->get("structure")){
+             $people->setStructure(ltrim(rtrim($request->request->get("structure"))));
+          }
+          if(null !== $request->request->get("context")){
+            $people->setContext(ltrim(rtrim($request->request->get("context"))));
+          }
+          if(null !== $request->request->get("street")){
+            $people->setStreet(ltrim(rtrim($request->request->get("street"))));
+          }
+          if(null !== $request->request->get("city")){
+            $people->setCity(ltrim(rtrim($request->request->get("city"))));
+          }
+          if(null !== $request->request->get("country")){
+            $people->setCountry(ltrim(rtrim($request->request->get("country"))));
+          }
+          if(null !== $request->request->get("lat")){
+            $people->setLatitude(ltrim(rtrim($request->request->get("lat"))));
+          }
+          if(null !== $request->request->get("lng")){
+             $people->setLongitude(ltrim(rtrim($request->request->get("lng"))));
+          }
+          if(null !== $request->request->get("formattedAddress")){
+            $people->setFormattedAddress(ltrim(rtrim($request->request->get("formattedAddress"))));
+          }
+          if(null !== $request->request->get("state")){
+            $people->setState(ltrim(rtrim($request->request->get("state"))));
+          }
+          if(null !== $request->request->get("zipcode")){
+            $people->setZipcode(ltrim(rtrim($request->request->get("zipcode"))));
+          }
+          if(null !== $request->request->get("profile")){
+            $people->setProfile(ltrim(rtrim($request->request->get("profile"))));
+          }
+          if(null !== $request->request->get("computerJob")){
+            $people->setComputerJob(ltrim(rtrim($request->request->get("computerJob"))));
+          }
+          if(null !== $request->request->get("teaching")){
+            $people->setTeaching(ltrim(rtrim($request->request->get("teaching"))));
+          }
+          if(null !== $request->request->get("facilitator")){
+            $people->setFacilitator( ltrim(rtrim($request->request->get("facilitator"))));
+          }
+          if(null !== $request->request->get("learning")){
+             $people->setLearning(ltrim(rtrim($request->request->get("learning"))));
+          }
+          if(null !== $request->request->get("skills")){
+            $people->setSkills(ltrim(rtrim($request->request->get("skills"))));
+          } 
+
+          $people->setUpdatedAt(new \DateTime());
+          $people->setUpdatedBy($userName);
+          $em->persist($people);
+          $em->flush();
+          if($action == 'create'){
+            $successMessage = $this->get('translator')->trans('success.peopleCreated');
+          }elseif($action == 'update'){
+            $successMessage = $this->get('translator')->trans('success.peopleEdited');  
+          }
+          
+        }else{
+          $errorMessage = $this->get('translator')->trans('error.peoplenotfound');
+        }
+        
+        if(isset($origin)&&($origin != "")){
+          if($errorMessage != ''){
+            $result =  array('status'=>'error', 'message'=> $errorMessage);
+          }else{
+            $result = array('status'=>'success', 'message'=> $action);
+          }         
+          return $this->render('@ClassCode/simpleResult.json.twig', array(
+           'result' => $result ,            
+          ));
+        }
+        if($errorMessage != ''){
+          $this ->get('session')->getFlashBag()->add('error', $errorMessage);  
+        }else{
+          if($successMessage != ''){
+            $this ->get('session')->getFlashBag()->add('success', $successMessage);
+          }
+          $people =  $em->getRepository('ClassCodeBundle:People')->findAll(); 
+          $peopleWithGeoloc =  $em->getRepository('ClassCodeBundle:People')->findAllWithGeoLoc();          
+          return $this->render('@ClassCode/People/list.html.twig', array(
+            'people' => $people,
+            'peopleWithGeoloc' => $peopleWithGeoloc,
+          ));      
+        }
+      }else{
+        if(isset($origin)&&($origin != "")){
+          return $this->render('@ClassCode/simpleResult.json.twig', array(
+            'result' => array('status'=>'error','message'=> $this->get('translator')->trans('Action non autorisée')),            
+          ));
+        }else{
+          return  $this->render('@ClassCode/error_auth.html.twig');  
+        }  
+      }
+    }else{
+      if(isset($origin)&&($origin != "")){
+        return $this->render('@ClassCode/simpleResult.json.twig', array(
+         'result' => array('status'=>'error','message'=> $this->get('translator')->trans('Action non autorisée')),            
+        ));
+      }else{
+        return  $this->render('@ClassCode/error_auth.html.twig'); 
+      }       
+    }       
   }
 }
diff --git a/src/ClassCodeBundle/Entity/Meeting.php b/src/ClassCodeBundle/Entity/Meeting.php
index 65d1bef..589dac7 100644
--- a/src/ClassCodeBundle/Entity/Meeting.php
+++ b/src/ClassCodeBundle/Entity/Meeting.php
@@ -204,6 +204,15 @@ class Meeting
       return $this->id;
     }
     
+    /**
+     * Get people
+     *
+     * @return \ClassCodeBundle\Entity\People 
+     */
+    public function getOwner()
+    {
+      return $this->ownerId;
+    }
     
     /**
      * Set people
@@ -216,17 +225,7 @@ class Meeting
       $this->ownerId = $people;
       return $this;
     }
-    
-    /**
-     * Get people
-     *
-     * @return \ClassCodeBundle\Entity\People 
-     */
-    public function getOwner()
-    {
-      return $this->ownerId;
-    }
-    
+
     /**
      * Get date
      *
@@ -271,6 +270,16 @@ class Meeting
       return $this;
     }
     
+    /**
+     * Get structure
+     *
+     * @return string 
+     */
+    public function getStructure()
+    {
+      return $this->structure;
+    }
+    
     /**
      * Set structure
      *
@@ -282,15 +291,15 @@ class Meeting
       $this->structure = $structure;
       return $this;
     }
-
+    
     /**
-     * Get structure
+     * Get street
      *
      * @return string 
      */
-    public function getStructure()
+    public function getStreet()
     {
-      return $this->structure;
+      return $this->street;
     }
     
     /**
@@ -305,16 +314,6 @@ class Meeting
       return $this;
     }
 
-    /**
-     * Get street
-     *
-     * @return string 
-     */
-    public function getStreet()
-    {
-      return $this->street;
-    }
-    
     /**
      * Get city
      *
@@ -337,6 +336,16 @@ class Meeting
       return $this;
     }
     
+    /**
+     * Get state
+     *
+     * @return state 
+     */
+    public function getState()
+    {
+      return $this->state;
+    }
+    
     /**
      * Set state
      *
@@ -349,14 +358,14 @@ class Meeting
       return $this;
     }
 
-    /**
-     * Get state
+   /**
+     * Get zipcode
      *
-     * @return state 
+     * @return string 
      */
-    public function getState()
+    public function getZipcode()
     {
-      return $this->state;
+      return $this->zipcode;
     }
     
     /**
@@ -372,13 +381,13 @@ class Meeting
     }
 
     /**
-     * Get zipcode
+     * Get country
      *
      * @return string 
      */
-    public function getZipcode()
+    public function getCountry()
     {
-      return $this->zipcode;
+      return $this->country;
     }
     
     /**
@@ -393,16 +402,16 @@ class Meeting
       return $this;
     }
 
-    /**
-     * Get country
+   /**
+     * Get formattedAddress
      *
      * @return string 
      */
-    public function getCountry()
+    public function getFormattedAddress()
     {
-      return $this->country;
+      return $this->formattedAddress;
     }
-    
+        
     /**
      * Set formattedAddress
      *
@@ -416,14 +425,14 @@ class Meeting
     }
 
     /**
-     * Get formattedAddress
+     * Get latitude
      *
-     * @return string 
+     * @return float 
      */
-    public function getFormattedAddress()
+    public function getLatitude()
     {
-      return $this->formattedAddress;
-    }
+      return $this->latitude;
+    }    
     
     /**
      * Set latitude
@@ -438,15 +447,15 @@ class Meeting
     }
 
     /**
-     * Get latitude
+     * Get longitude
      *
      * @return float 
      */
-    public function getLatitude()
+    public function getLongitude()
     {
-      return $this->latitude;
-    }    
-    
+      return $this->longitude;
+    } 
+      
     /**
      * Set longitude
      *
@@ -459,16 +468,7 @@ class Meeting
       return $this;
     }
 
-    /**
-     * Get longitude
-     *
-     * @return float 
-     */
-    public function getLongitude()
-    {
-      return $this->longitude;
-    } 
-    
+
     /**
      * Get capacity
      *
diff --git a/src/ClassCodeBundle/Entity/People.php b/src/ClassCodeBundle/Entity/People.php
index 4c1c72d..8c55a6e 100644
--- a/src/ClassCodeBundle/Entity/People.php
+++ b/src/ClassCodeBundle/Entity/People.php
@@ -326,12 +326,33 @@ class People
      */
     public function getDisplayname()
     {
-      if($this->displayname){
+      return $this->displayname;      
+    }
+    
+    /**
+     * Get commondisplayname
+     *
+     * @return string 
+     */
+    public function getCommonDisplayname()
+    {
+      if($this->nickname){
+        return $this->nickname;
+      }else if($this->lastname || $this->firstname){         
+        if($this->firstname){
+          $displayname = $this->firstname;
+        }else{
+          $displayname = "";
+        }
+        if($this->lastname){
+          $displayname .= " ".$this->lastname;
+        }
+        return $displayname;
+      }else if($this->displayname){
         return $this->displayname;
       }else{
         return $this->username;
       }
-     
     }
     
     /**
diff --git a/src/ClassCodeBundle/Resources/translations/messages.fr.yml b/src/ClassCodeBundle/Resources/translations/messages.fr.yml
index d45b0cc..fb08672 100644
--- a/src/ClassCodeBundle/Resources/translations/messages.fr.yml
+++ b/src/ClassCodeBundle/Resources/translations/messages.fr.yml
@@ -1,3 +1,4 @@
+"Action non autorisée" : "Action non autorisée"
 "Retour à l'accueil" : "Retour à l'accueil"
 "access_error" : "Vous n'êtes pas autorisé à effectuer cette action !"
 "Se connecter" : "Se connecter"
@@ -107,3 +108,14 @@
 'geoloc.compute': "Calculer la position à partir de l'adresse"
 'GeolocCompute' : "Position trouvée!"
 'GeolocComputeError' : "Adresse introuvable!"
+'success.subscriberRemoved' : "Participant supprimé"
+'success.subscriberAdded' : "Participant ajouté"
+'success.meetingCreated' : "Rencontre créée"
+'success.meetingEdited' : "Rencontre editée"
+'success.meetingDuplicated' : "Rencontre dupliquée"
+'success.meetingDeleted' : "Rencontre supprimée"
+'error.peoplenotfound' : "L'utilisateur n'a pas été trouvé"
+'success.peopleCreated' : "Profile créé"
+'success.peopleEdited' : "Profile edité"
+'error.meetingnotfound' : "La rencontre n'a pas été trouvée"
+'error.missingparameter' : "Un paramètre obligatoire est manquant"
diff --git a/src/ClassCodeBundle/Resources/views/People/queryUsers.json.twig b/src/ClassCodeBundle/Resources/views/People/queryUsers.json.twig
new file mode 100644
index 0000000..0906856
--- /dev/null
+++ b/src/ClassCodeBundle/Resources/views/People/queryUsers.json.twig
@@ -0,0 +1,2 @@
+   {{ people|json_encode()|raw }}
+
diff --git a/src/ClassCodeBundle/Resources/views/simpleResult.json.twig b/src/ClassCodeBundle/Resources/views/simpleResult.json.twig
new file mode 100644
index 0000000..c0aea14
--- /dev/null
+++ b/src/ClassCodeBundle/Resources/views/simpleResult.json.twig
@@ -0,0 +1 @@
+{{ result|json_encode()|raw }}
-- 
GitLab