Create rider api session entity. Add register for new rider controller. #617

This commit is contained in:
Korina Cordero 2021-08-18 06:28:19 +00:00
parent 55c8c393b2
commit 446065880c
2 changed files with 336 additions and 0 deletions

View file

@ -0,0 +1,202 @@
<?php
namespace App\Controller\CAPI;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\Query;
use Doctrine\ORM\EntityManagerInterface;
use Catalyst\APIBundle\Controller\APIController;
use Catalyst\APIBundle\Response\APIResponse;
use App\Entity\Rider;
use App\Entity\JOEvent;
use App\Entity\Promo;
use App\Entity\Battery;
use App\Entity\BatteryModel;
use App\Entity\BatterySize;
use App\Entity\RiderAPISession;
use App\Service\RedisClientProvider;
use App\Service\RiderCache;
use App\Service\MQTTClient;
use App\Service\WarrantyHandler;
use App\Service\JobOrderHandlerInterface;
use App\Service\InvoiceGeneratorInterface;
use App\Service\RisingTideGateway;
use App\Service\RiderTracker;
// third party API for rider
class RiderController extends APIController
{
public function register(Request $req, EntityManagerInterface $em, RedisClientProvider $redis)
{
// confirm parameters
$required_params = [
'phone_number',
'device_push_id'
];
$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
$rider_api_user = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]);
if ($rider_api_user != null)
return new APIResponse(false, 'User already registered');
// retry until we get a unique id
while (true)
{
try
{
// instantiate session
$sess = new RiderAPISession();
$sess->setPhoneNumber($req->request->get('phone_number'))
->setDevicePushID($req->request->get('device_push_id'))
->setCapiUserId($capi_user_id);
// reopen in case we get an exception
if (!$em->isOpen())
{
$em = $em->create(
$em->getConnection(),
$em->getConfiguration()
);
}
// save
$em->persist($sess);
$em->flush();
// create redis entry for the session
$redis_client = $redis->getRedisClient();
$redis_key = 'rider.id.' . $sess->getID();
error_log('redis_key: ' . $redis_key);
$redis_client->set($redis_key, '');
}
catch (DBALException $e)
{
error_log($e->getMessage());
// delay one second and try again
sleep(1);
continue;
}
break;
}
// return data
$data = [
'session_id' => $sess->getID()
];
return new APIResponse(true, 'Rider API user created.', $data);
}
public function login(Request $req)
{
}
public function logout(Request $req)
{
}
public function getJobOrder(Request $req)
{
}
public function acceptJobOrder(Request $req)
{
}
public function cancelJobOrder(Request $req)
{
}
public function arrive(Request $req)
{
}
public function hubArrive(Request $req)
{
}
public function payment(Request $req)
{
}
public function available(Request $req)
{
}
public function getPromos(Request $req)
{
}
public function getBatteries(Request $req)
{
}
public function changeService(Request $req)
{
}
public function hubDepart(Request $req)
{
}
public function preHubArrive(Request $req)
{
}
public function preHubDepart(Request $req)
{
}
public function startJobOrder(Request $req)
{
}
public function postHubArrive(Request $req)
{
}
public function postHubDepart(Request $req)
{
}
protected function checkMissingParameters(Request $req, $params = [])
{
$missing = [];
// check if parameters are there
foreach ($params as $param)
{
if ($req->getMethod() == 'GET')
{
$check = $req->query->get($param);
if ($check == null)
$missing[] = $param;
}
else if ($req->getMethod() == 'POST')
{
$check = $req->request->get($param);
if ($check == null)
$missing[] = $param;
}
else
return $params;
}
return $missing;
}
}

View file

@ -0,0 +1,134 @@
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use DateTime;
/**
* @ORM\Entity
* @ORM\Table(name="rider_api_session")
*/
class RiderAPISession
{
// unique id
/**
* @ORM\Id
* @ORM\Column(type="string", length=13)
*/
protected $id;
// device id or push id used by device
/**
* @ORM\Column(type="string", length=50)
*/
protected $device_push_id;
// link to customer
/**
* @ORM\ManyToOne(targetEntity="Rider", inversedBy="api_sessions")
* @ORM\JoinColumn(name="rider_id", referencedColumnName="id", nullable=true)
*/
protected $rider;
// phone number
/**
* @ORM\Column(type="string", length=12, nullable=true)
*/
protected $phone_number;
// is this device active
/**
* @ORM\Column(type="boolean")
*/
protected $is_active;
// capi user id loosely associated to mobile user
/**
* @ORM\Column(type="integer", nullable=true)
*/
protected $capi_user_id;
public function __construct()
{
// default date generated to now
$this->id = $this->generateKeyID();
$this->rider = null;
$this->is_active = true;
$this->capi_user_id = 0;
}
public function generateKeyID()
{
// use uniqid for now, since primary key dupes will trigger exceptions
return uniqid();
}
public function getID()
{
return $this->id;
}
public function setDevicePushID($id)
{
$this->device_push_id = $id;
return $this;
}
public function getDevicePushID()
{
return $this->device_push_id;
}
public function setRider(Rider $rider = null)
{
$this->rider = $rider;
return $this;
}
public function getRider()
{
return $this->rider;
}
public function setPhoneNumber($num)
{
$this->phone_number = $num;
return $this;
}
public function getPhoneNumber()
{
return $this->phone_number;
}
public function setActive($flag = true)
{
$this->is_active = $flag;
return $this;
}
public function isActive()
{
return $this->is_active;
}
public function hasRider()
{
if ($this->rider == null)
return false;
return true;
}
public function setCapiUserId($capi_user_id)
{
$this->capi_user_id = $capi_user_id;
}
public function getCapiUserId()
{
return $this->capi_user_id;
}
}