Add login and logout. #617

This commit is contained in:
Korina Cordero 2021-08-18 06:57:32 +00:00
parent 446065880c
commit 722ec653c5

View file

@ -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.<session 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)