From 722ec653c5a83313ba3a2f6c31512df936351e43 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 06:57:32 +0000 Subject: [PATCH] Add login and logout. #617 --- src/Controller/CAPI/RiderController.php | 143 +++++++++++++++++++++++- 1 file changed, 138 insertions(+), 5 deletions(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index 81b85ee6..2795db45 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -4,8 +4,11 @@ namespace App\Controller\CAPI; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; + use Doctrine\ORM\Query; use Doctrine\ORM\EntityManagerInterface; + use Catalyst\APIBundle\Controller\APIController; use Catalyst\APIBundle\Response\APIResponse; @@ -16,6 +19,7 @@ use App\Entity\Battery; use App\Entity\BatteryModel; use App\Entity\BatterySize; use App\Entity\RiderAPISession; +use App\Entity\User; use App\Service\RedisClientProvider; use App\Service\RiderCache; @@ -47,10 +51,10 @@ class RiderController extends APIController // get capi user to link to rider api user $capi_user_id = $this->getUser()->getID(); - // check if capi user already has a rider api user - $rider_api_user = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); + // check if capi user already has a rider api session + $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - if ($rider_api_user != null) + if ($rapi_session != null) return new APIResponse(false, 'User already registered'); // retry until we get a unique id @@ -102,12 +106,141 @@ class RiderController extends APIController return new APIResponse(true, 'Rider API user created.', $data); } - public function login(Request $req) + public function login(Request $req, EntityManagerInterface $em, EncoderFactoryInterface $ef, + RiderCache $rcache, RiderTracker $rider_tracker, MQTTClient $mclient, + RedisClientProvider $redis) { + $required_params = [ + 'user', + 'pass', + ]; + + $missing = $this->checkMissingParameters($req, $required_params); + if (count($missing) > 0) + { + $params = implode(', ', $missing); + return new APIResponse(false, 'Missing parameter(s): ' . $params); + } + + // get capi user to link to rider api user + $capi_user_id = $this->getUser()->getID(); + + // check if capi user already has a rider api user + $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); + + if ($rapi_session->hasRider()) + return new APIResponse(false, 'Another rider is already logged in. Please logout first.'); + + // look for rider with username + $rider = $em->getRepository(Rider::class)->findOneBy(['username' => $req->request->get('user')]); + if ($rider == null) + return new APIResponse(false, 'Invalid username or password.'); + + // check if rider password is correct + $encoder = $ef->getEncoder(new User()); + if (!$encoder->isPasswordValid($rider->getPassword(), $req->request->get('pass'), '')) + return new APIResponse(false, 'Invalid username or password.'); + + // assign rider to api session + $rapi_session->setRider($rider); + + // set rider to available + $rider->setAvailable(true); + + $rider_id = $rider->getID(); + // cache rider location (default to hub) + // TODO: figure out longitude / latitude default + $rcache->addActiveRider($rider_id, 0, 0); + + // send mqtt event to put rider on map + // get rider coordinates from redis + $coord = $rider_tracker->getRiderLocation($rider->getID()); + + $lng = $coord->getLongitude(); + $lat = $coord->getLatitude();; + $channel = 'rider/' . $rider->getID() . '/availability'; + $payload = [ + 'status' => 'rider_online', + 'longitude' => $lng, + 'latitude' => $lat, + ]; + $mclient->publish($channel, json_encode($payload)); + + // TODO: log rider logging in + + $em->flush(); + + // update redis rider.id. with the rider id + $redis_client = $redis->getRedisClient(); + $redis_key = 'rider.id.' . $rapi_session->getID(); + $rider_id = $rider->getID(); + + $redis_client->set($redis_key, $rider_id); + + $hub = $rider->getHub(); + if ($hub == null) + $hub_data = null; + else + { + $coord = $hub->getCoordinates(); + $hub_data = [ + 'id' => $hub->getID(), + 'name' => $hub->getName(), + 'branch' => $hub->getBranch(), + 'longitude' => $coord->getLongitude(), + 'latitude' => $coord->getLatitude(), + 'contact_nums' => $hub->getContactNumbers(), + ]; + } + + // data + $data = [ + 'hub' => $hub_data, + 'rider_id' => $rider_id, + ]; + + return new APIResponse(true, 'Rider logged in.', $data); } - public function logout(Request $req) + public function logout(Request $req, EntityManagerInterface $em, RiderCache $rcache, MQTTClient $mclient) { + $required_params = []; + $missing = $this->checkMissingParameters($req, $required_params); + if (count($missing) > 0) + { + $params = implode(', ', $missing); + return new APIResponse(false, 'Missing parameter(s): ' . $params); + } + + // get capi user to link to rider api user + $capi_user_id = $this->getUser()->getID(); + + // check if capi user already has a rider api user + $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); + + // make rider unavailable + $rider = $rapi_session->getRider(); + $rider->setAvailable(false); + + // remove from cache + $rcache->removeActiveRider($rider->getID()); + + // remove rider from session + $rapi_session->setRider(null); + + // TODO: log rider logging out + + $em->flush(); + + // send mqtt event to remove rider from map + $channel = 'rider/' . $rider->getID() . '/availability'; + $payload = [ + 'status' => 'rider_offline' + ]; + $mclient->publish($channel, json_encode($payload)); + + $data = []; + return new APIResponse(true, 'Rider logged out', $data); } public function getJobOrder(Request $req)