From 973c56ae85ff3890de84077c0d9be4ab353a09e1 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 11 Aug 2021 10:20:53 +0000 Subject: [PATCH 01/37] Add new API calls. #612 --- config/routes/rider_api.yaml | 31 +++ src/Ramcar/JOEventType.php | 28 ++- .../RiderAPIHandler/ResqRiderAPIHandler.php | 206 +++++++++++++++++- 3 files changed, 254 insertions(+), 11 deletions(-) diff --git a/config/routes/rider_api.yaml b/config/routes/rider_api.yaml index bd38c492..b38cd6ae 100644 --- a/config/routes/rider_api.yaml +++ b/config/routes/rider_api.yaml @@ -64,3 +64,34 @@ rapi_available: path: /rapi/available controller: App\Controller\RAPIController::available methods: [POST] + +rapi_hub_depart: + path: /rapi/hub_depart + controller: App\Controller\RAPIController::hubDepart + methods: [POST] + +rapi_pre_hub_depart: + path: /rapi/pre_hub_depart + controller: App\Controller\RAPIController::preHubDepart + methods: [POST] + +rapi_pre_hub_arrive: + path: /rapi/pre_hub_arrive + controller: App\Controller\RAPIController::preHubArrive + methods: [POST] + +rapi_post_hub_depart: + path: /rapi/post_hub_depart + controller: App\Controller\RAPIController::postHubDepart + methods: [POST] + +rapi_post_hub_arrive: + path: /rapi/post_hub_arrive + controller: App\Controller\RAPIController::postHubArrive + methods: [POST] + +rapi_jo_start: + path: /rapi/start + controller: App\Controller\RAPIController::startJobOrder + methods: [POST] + diff --git a/src/Ramcar/JOEventType.php b/src/Ramcar/JOEventType.php index 3929c24e..e530679d 100644 --- a/src/Ramcar/JOEventType.php +++ b/src/Ramcar/JOEventType.php @@ -4,16 +4,24 @@ namespace App\Ramcar; class JOEventType extends NameValue { - const CREATE = 'create'; - const HUB_ASSIGN = 'hub_assign'; - const RIDER_ASSIGN = 'rider_assign'; - const CANCEL = 'cancel'; - const FULFILL = 'fulfill'; - const OPEN_EDIT = 'open_edit'; - const REQUEUE = 'requeue'; - const RIDER_ACCEPT = 'accept'; - const RIDER_ARRIVE = 'arrive'; - const RIDER_EDIT = 'rider_edit'; + const CREATE = 'create'; + const HUB_ASSIGN = 'hub_assign'; + const RIDER_ASSIGN = 'rider_assign'; + const CANCEL = 'cancel'; + const FULFILL = 'fulfill'; + const OPEN_EDIT = 'open_edit'; + const REQUEUE = 'requeue'; + const RIDER_ACCEPT = 'accept'; + const RIDER_ARRIVE = 'arrive'; + const RIDER_EDIT = 'rider_edit'; + const RIDER_DEPART_HUB = 'rider_depart_hub'; + const RIDER_ARRIVE_HUB_PRE_JO = 'rider_arrive_hub_pre_jo'; + const RIDER_DEPART_HUB_PRE_JO = 'rider_depart_hub_pre_jo'; + const RIDER_START = 'rider_start'; + const RIDER_END = 'rider_end'; + const RIDER_ARRIVE_HUB_POST_JO = 'rider_arrive_hub_post_jo'; + const RIDER_DEPART_HUB_POST_JO = 'rider_depart_hub_post_jo'; + const RIDER_ARRIVE_HUB = 'rider_arrive_hub'; const COLLECTION = [ 'create' => 'Created', diff --git a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php index 10678139..d7cc762d 100644 --- a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php @@ -544,8 +544,20 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setTypeID(JOEventType::FULFILL) ->setJobOrder($jo) ->setRider($rider); - $this->em->persist($event); + $timestamp_event = new JOEvent(); + $timestamp_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_END) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->persist($timestamp_event); + + // NOTE: fix for the rider being assigned to other JO + // while on another JO. + // TODO: comment this out. Rider needs to be set to unavailable + // when rider accepts the JO // tag rider as unavailable $rider->setAvailable(false); @@ -845,6 +857,198 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function hubDepart(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // find job order. + // NOTE: Not using getActiveJobOrder since unsure if it is really being set + $jo_id = $req->request->get('jo_id'); + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'error' => 'No job order found.' + ]; + return $data; + } + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB) + ->setJobOrder($jo) + ->setRider($rider); + + return $data; + } + + public function preHubArrive(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // find job order. + // NOTE: Not using getActiveJobOrder since unsure if it is really being set + $jo_id = $req->request->get('jo_id'); + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'error' => 'No job order found.' + ]; + return $data; + } + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB_PRE_JO) + ->setJobOrder($jo) + ->setRider($rider); + + return $data; + } + + public function preHubDepart(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // find job order. + // NOTE: Not using getActiveJobOrder since unsure if it is really being set + $jo_id = $req->request->get('jo_id'); + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'error' => 'No job order found.' + ]; + return $data; + } + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB_PRE_JO) + ->setJobOrder($jo) + ->setRider($rider); + + return $data; + } + + public function startJobOrder(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // find job order. + // NOTE: Not using getActiveJobOrder since unsure if it is really being set + $jo_id = $req->request->get('jo_id'); + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'error' => 'No job order found.' + ]; + return $data; + } + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_START) + ->setJobOrder($jo) + ->setRider($rider); + + return $data; + } + + public function postHubArrive(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // find job order. + // NOTE: Not using getActiveJobOrder since unsure if it is really being set + $jo_id = $req->request->get('jo_id'); + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'error' => 'No job order found.' + ]; + return $data; + } + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB_POST_JO) + ->setJobOrder($jo) + ->setRider($rider); + + return $data; + } + + public function postHubDepart(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // find job order. + // NOTE: Not using getActiveJobOrder since unsure if it is really being set + $jo_id = $req->request->get('jo_id'); + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'error' => 'No job order found.' + ]; + return $data; + } + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB_POST_JO) + ->setJobOrder($jo) + ->setRider($rider); + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 072a2df5d1b3a94b5e17ff3e4a11e1e7166ca340 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 12 Aug 2021 09:05:21 +0000 Subject: [PATCH 02/37] Fixes found during testing. #612 --- src/Controller/RAPIController.php | 23 +++++++++++++++++++ .../RiderAPIHandler/ResqRiderAPIHandler.php | 19 +++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index 3b8bdab1..40635743 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -300,4 +300,27 @@ class RAPIController extends Controller // response return $res->getReturnResponse(); } + + public function hubDepart(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->hubDepart($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + } diff --git a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php index d7cc762d..c816b6d1 100644 --- a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php @@ -33,6 +33,7 @@ use App\Entity\Promo; use App\Entity\Battery; use App\Entity\BatteryModel; use App\Entity\BatterySize; +use App\Entity\JobOrder; use DateTime; @@ -886,6 +887,9 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setJobOrder($jo) ->setRider($rider); + $this->em->persist($event); + $this->em->flush(); + return $data; } @@ -918,6 +922,9 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setJobOrder($jo) ->setRider($rider); + $this->em->persist($event); + $this->em->flush(); + return $data; } @@ -950,6 +957,9 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setJobOrder($jo) ->setRider($rider); + $this->em->persist($event); + $this->em->flush(); + return $data; } @@ -982,6 +992,9 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setJobOrder($jo) ->setRider($rider); + $this->em->persist($event); + $this->em->flush(); + return $data; } @@ -1014,6 +1027,9 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setJobOrder($jo) ->setRider($rider); + $this->em->persist($event); + $this->em->flush(); + return $data; } @@ -1046,6 +1062,9 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setJobOrder($jo) ->setRider($rider); + $this->em->persist($event); + $this->em->flush(); + return $data; } From d78a5ebf804d7e35d57025e47ffa5fa0b62da81b Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 13 Aug 2021 08:08:59 +0000 Subject: [PATCH 03/37] Add rider current job order field. #612 --- src/Controller/RAPIController.php | 109 +++++++++++++ src/Entity/Rider.php | 21 +++ .../RiderAPIHandler/ResqRiderAPIHandler.php | 146 +++++++----------- 3 files changed, 189 insertions(+), 87 deletions(-) diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index 40635743..a818e9a7 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -323,4 +323,113 @@ class RAPIController extends Controller return $res->getReturnResponse(); } + public function preHubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->preHubArrive($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function preHubDepart(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->preHubDepart($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function postHubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->postHubArrive($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function postHubDepart(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->postHubDepart($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function startJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->startJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } } diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index 502d93bc..8a2ed9ea 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -120,6 +120,15 @@ class Rider */ protected $sessions; + // current job order + // NOTE: for forgotten reasons, we don't set active_job_order. + // but we now need rider's current JO for the time stamp events + /** + * @ORM\OneToOne(targetEntity="JobOrder") + * @ORM\JoinColumn(name="current_jo_id", referencedColumnName="id") + */ + protected $current_job_order; + public function __construct() { $this->job_orders = new ArrayCollection(); @@ -132,6 +141,7 @@ class Rider $this->password = ''; $this->active_job_order = null; + $this->current_job_order = null; } public function getID() @@ -371,4 +381,15 @@ class Rider $map_label = $this->first_name .' ' . $this->last_name; return $map_label; } + + public function setCurrentJobOrder(JobOrder $jo = null) + { + $this->current_job_order = $jo; + return $this; + } + + public function getCurrentJobOrder() + { + return $this->current_job_order; + } } diff --git a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php index c816b6d1..db83076b 100644 --- a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php @@ -409,8 +409,15 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface // TODO: send mqtt event (?) - // add event log $rider = $this->session->getRider(); + + // set rider's current job order + $rider->setCurrentJobOrder($jo); + + // set rider to unavailable + $rider->setAvailable(false); + + // add event log $event = new JOEvent(); $event->setDateHappen(new DateTime()) ->setTypeID(JOEventType::RIDER_ACCEPT) @@ -434,8 +441,11 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface // requeue it, instead of cancelling it $jo->requeue(); - // add event log $rider = $this->session->getRider(); + // set rider's current job order to null + $rider->setCurrentJobOrder(); + + // add event log $event = new JOEvent(); $event->setDateHappen(new DateTime()) ->setTypeID(JOEventType::REQUEUE) @@ -513,10 +523,26 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + $timestamp_event = new JOEvent(); + $timestamp_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($timestamp_event); + // tag rider as available $rider = $this->session->getRider(); $rider->setAvailable(true); + // set rider's current job order to null + $rider->setCurrentJobOrder(); + $this->em->flush(); return $data; @@ -860,24 +886,15 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface public function hubDepart(Request $req) { - $required_params = [ - 'jo_id' - ]; + $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; - // find job order. - // NOTE: Not using getActiveJobOrder since unsure if it is really being set - $jo_id = $req->request->get('jo_id'); - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) - { - $data = [ - 'error' => 'No job order found.' - ]; - return $data; - } + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); // create time stamp event for JO event $rider = $this->session->getRider(); @@ -895,24 +912,15 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface public function preHubArrive(Request $req) { - $required_params = [ - 'jo_id' - ]; + $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; - // find job order. - // NOTE: Not using getActiveJobOrder since unsure if it is really being set - $jo_id = $req->request->get('jo_id'); - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) - { - $data = [ - 'error' => 'No job order found.' - ]; - return $data; - } + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); // create time stamp event for JO event $rider = $this->session->getRider(); @@ -930,25 +938,16 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface public function preHubDepart(Request $req) { - $required_params = [ - 'jo_id' - ]; + $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; - // find job order. - // NOTE: Not using getActiveJobOrder since unsure if it is really being set - $jo_id = $req->request->get('jo_id'); - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) - { - $data = [ - 'error' => 'No job order found.' - ]; - return $data; - } - + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + // create time stamp event for JO event $rider = $this->session->getRider(); $event = new JOEvent(); @@ -965,24 +964,15 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface public function startJobOrder(Request $req) { - $required_params = [ - 'jo_id' - ]; + $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; - // find job order. - // NOTE: Not using getActiveJobOrder since unsure if it is really being set - $jo_id = $req->request->get('jo_id'); - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) - { - $data = [ - 'error' => 'No job order found.' - ]; - return $data; - } + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); // create time stamp event for JO event $rider = $this->session->getRider(); @@ -1000,24 +990,15 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface public function postHubArrive(Request $req) { - $required_params = [ - 'jo_id' - ]; + $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; - // find job order. - // NOTE: Not using getActiveJobOrder since unsure if it is really being set - $jo_id = $req->request->get('jo_id'); - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) - { - $data = [ - 'error' => 'No job order found.' - ]; - return $data; - } + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); // create time stamp event for JO event $rider = $this->session->getRider(); @@ -1035,24 +1016,15 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface public function postHubDepart(Request $req) { - $required_params = [ - 'jo_id' - ]; + $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; - // find job order. - // NOTE: Not using getActiveJobOrder since unsure if it is really being set - $jo_id = $req->request->get('jo_id'); - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) - { - $data = [ - 'error' => 'No job order found.' - ]; - return $data; - } + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); // create time stamp event for JO event $rider = $this->session->getRider(); From 55c8c393b2711f9992193658d715d02d57f3c964 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 03:35:10 +0000 Subject: [PATCH 04/37] Add routes for capi rider. #617 --- config/routes/capi_rider.yaml | 97 +++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 config/routes/capi_rider.yaml diff --git a/config/routes/capi_rider.yaml b/config/routes/capi_rider.yaml new file mode 100644 index 00000000..f862c758 --- /dev/null +++ b/config/routes/capi_rider.yaml @@ -0,0 +1,97 @@ +# rider app api + +capi_rider_register: + path: /capi/rider/register + controller: App\Controller\CAPI\RiderController::register + methods: [POST] + +capi_rider_login: + path: /capi/rider/login + controller: App\Controller\CAPI\RiderController::login + methods: [POST] + +capi_rider_logout: + path: /capi/rider/logout + controller: App\Controller\CAPI\RiderController::logout + methods: [POST] + +capi_rider_jo_get: + path: /capi/rider/joborder + controller: App\Controller\CAPI\RiderController::getJobOrder + methods: [GET] + +capi_rider_jo_accept: + path: /capi/rider/accept + controller: App\Controller\CAPI\RiderController::acceptJobOrder + methods: [POST] + +capi_rider_jo_cancel: + path: /capi/rider/cancel + controller: App\Controller\CAPI\RiderController::cancelJobOrder + methods: [POST] + +capi_rider_arrive: + path: /capi/rider/arrive + controller: App\Controller\CAPI\RiderController::arrive + methods: [POST] + +capi_rider_payment: + path: /capi/rider/payment + controller: App\Controller\CAPI\RiderController::payment + methods: [POST] + +capi_rider_hub_arrive: + path: /capi/rider/hub_arrive + controller: App\Controller\CAPI\RiderController::hubArrive + methods: [POST] + +capi_rider_promos: + path: /capi/rider/promos + controller: App\Controller\CAPI\RiderController::getPromos + methods: [GET] + +capi_rider_batteries: + path: /capi/rider/batteries + controller: App\Controller\CAPI\RiderController::getBatteries + methods: [GET] + +capi_rider_change_service: + path: /capi/rider/service + controller: App\Controller\CAPI\RiderController::changeService + methods: [POST] + +capi_rider_available: + path: /capi/rider/available + controller: App\Controller\CAPI\RiderController::available + methods: [POST] + +capi_rider_hub_depart: + path: /capi/rider/hub_depart + controller: App\Controller\CAPI\RiderController::hubDepart + methods: [POST] + +capi_rider_pre_hub_depart: + path: /capi/rider/pre_hub_depart + controller: App\Controller\CAPI\RiderController::preHubDepart + methods: [POST] + +capi_rider_pre_hub_arrive: + path: /capi/rider/pre_hub_arrive + controller: App\Controller\CAPI\RiderController::preHubArrive + methods: [POST] + +capi_rider_post_hub_depart: + path: /capi/rider/post_hub_depart + controller: App\Controller\CAPI\RiderController::postHubDepart + methods: [POST] + +capi_rider_post_hub_arrive: + path: /capi/rider/post_hub_arrive + controller: App\Controller\CAPI\RiderController::postHubArrive + methods: [POST] + +capi_rider_jo_start: + path: /capi/rider/start + controller: App\Controller\CAPI\RiderController::startJobOrder + methods: [POST] + From 446065880cc031ff84bde4679ed309cfcb63dfae Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 06:28:19 +0000 Subject: [PATCH 05/37] Create rider api session entity. Add register for new rider controller. #617 --- src/Controller/CAPI/RiderController.php | 202 ++++++++++++++++++++++++ src/Entity/RiderAPISession.php | 134 ++++++++++++++++ 2 files changed, 336 insertions(+) create mode 100644 src/Controller/CAPI/RiderController.php create mode 100644 src/Entity/RiderAPISession.php diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php new file mode 100644 index 00000000..81b85ee6 --- /dev/null +++ b/src/Controller/CAPI/RiderController.php @@ -0,0 +1,202 @@ +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; + } +} diff --git a/src/Entity/RiderAPISession.php b/src/Entity/RiderAPISession.php new file mode 100644 index 00000000..98228268 --- /dev/null +++ b/src/Entity/RiderAPISession.php @@ -0,0 +1,134 @@ +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; + } +} + From 722ec653c5a83313ba3a2f6c31512df936351e43 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 06:57:32 +0000 Subject: [PATCH 06/37] 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) From fc7151be88fa828f8aaadb8c6cec2a6c1b25c3d3 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 07:28:58 +0000 Subject: [PATCH 07/37] Add getJobOrder. #617 --- src/Controller/CAPI/RiderController.php | 161 +++++++++++++++++++++--- 1 file changed, 142 insertions(+), 19 deletions(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index 2795db45..5507f8c4 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -243,67 +243,190 @@ class RiderController extends APIController return new APIResponse(true, 'Rider logged out', $data); } - public function getJobOrder(Request $req) + public function getJobOrder(Request $req, EntityManagerInterface $em) + { + // get the job order of the rider assigned to this session + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // do we have a job order? + $jo = $rider->getActiveJobOrder(); + if ($jo == null) + { + $data = [ + 'job_order' => null + ]; + } + else + { + $coord = $jo->getCoordinates(); + $cust = $jo->getCustomer(); + $cv = $jo->getCustomerVehicle(); + $v = $cv->getVehicle(); + $inv = $jo->getInvoice(); + $promo = $inv->getPromo(); + + // invoice items + $inv_items = []; + foreach ($inv->getItems() as $item) + { + $item_batt = $item->getBattery(); + if ($item_batt == null) + $batt_id = null; + else + $batt_id = $item_batt->getID(); + + $inv_items[] = [ + 'id' => $item->getID(), + 'title' => $item->getTitle(), + 'qty' => $item->getQuantity(), + 'price' => $item->getPrice(), + 'batt_id' => $batt_id, + ]; + } + + // promo + if ($promo != null) + { + $promo_data = [ + 'id' => $promo->getID(), + 'name' => $promo->getName(), + 'code' => $promo->getCode(), + 'discount_rate' => $promo->getDiscountRate(), + 'discount_apply' => $promo->getDiscountApply(), + ]; + } + else + { + $promo_data = null; + } + + $trade_in_type = $jo->getTradeInType(); + if (empty($trade_in_type)) + $trade_in_type = 'none'; + + $data = [ + 'job_order' => [ + 'id' => $jo->getID(), + 'service_type' => $jo->getServiceType(), + 'date_schedule' => $jo->getDateSchedule()->format('Ymd H:i:s'), + 'longitude' => $coord->getLongitude(), + 'latitude' => $coord->getLatitude(), + 'status' => $jo->getStatus(), + 'customer' => [ + 'title' => $cust->getTitle(), + 'first_name' => $cust->getFirstName(), + 'last_name' => $cust->getLastName(), + 'phone_mobile' => $this->getParameter('country_code') . $cust->getPhoneMobile(), + ], + 'vehicle' => [ + 'manufacturer' => $v->getManufacturer()->getName(), + 'make' => $v->getMake(), + 'model' => $cv->getModelYear(), + 'plate_number' => $cv->getPlateNumber(), + 'color' => $cv->getColor(), + ], + 'or_num' => $jo->getORNum(), + 'or_name' => $jo->getORName(), + 'delivery_instructions' => $jo->getDeliveryInstructions(), + 'delivery_address' => $jo->getDeliveryAddress(), + 'landmark' => $jo->getLandmark(), + 'invoice' => [ + 'discount' => $inv->getDiscount(), + 'trade_in' => $inv->getTradeIn(), + 'total_price' => $inv->getTotalPrice(), + 'vat' => $inv->getVat(), + 'items' => $inv_items, + ], + 'mode_of_payment' => $jo->getModeOfPayment(), + 'trade_in_type' => $trade_in_type, + 'promo' => $promo_data, + // TODO: load the actual + 'has_warranty_doc' => false, + 'flag_coolant' => $jo->hasCoolant(), + 'has_motolite' => $cv->hasMotoliteBattery(), + ] + ]; + } + + return new APIResponse(true, 'Job order found.', $data); + + } + + public function acceptJobOrder(Request $req, EntityManagerInterface $em) { } - public function acceptJobOrder(Request $req) + public function cancelJobOrder(Request $req, EntityManagerInterface $em) { } - public function cancelJobOrder(Request $req) + public function arrive(Request $req, EntityManagerInterface $em) { } - public function arrive(Request $req) + public function hubArrive(Request $req, EntityManagerInterface $em) { } - public function hubArrive(Request $req) + public function payment(Request $req, EntityManagerInterface $em) { } - public function payment(Request $req) + public function available(Request $req, EntityManagerInterface $em) { } - public function available(Request $req) + public function getPromos(Request $req, EntityManagerInterface $em) { } - public function getPromos(Request $req) + public function getBatteries(Request $req, EntityManagerInterface $em) { } - public function getBatteries(Request $req) + public function changeService(Request $req, EntityManagerInterface $em) { } - public function changeService(Request $req) + public function hubDepart(Request $req, EntityManagerInterface $em) { } - public function hubDepart(Request $req) + public function preHubArrive(Request $req, EntityManagerInterface $em) { } - public function preHubArrive(Request $req) + public function preHubDepart(Request $req, EntityManagerInterface $em) { } - public function preHubDepart(Request $req) + public function startJobOrder(Request $req, EntityManagerInterface $em) { } - public function startJobOrder(Request $req) + public function postHubArrive(Request $req, EntityManagerInterface $em) { } - public function postHubArrive(Request $req) - { - } - - public function postHubDepart(Request $req) + public function postHubDepart(Request $req, EntityManagerInterface $em) { } From b6f840f5d740ecb1da50addc5d411dfbe93f1f32 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 07:54:24 +0000 Subject: [PATCH 08/37] Add acceptJobOrder. #617 --- src/Controller/CAPI/RiderController.php | 86 +++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index 5507f8c4..b66b20c6 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -30,6 +30,17 @@ use App\Service\InvoiceGeneratorInterface; use App\Service\RisingTideGateway; use App\Service\RiderTracker; +use App\Ramcar\ServiceType; +use App\Ramcar\TradeInType; +use App\Ramcar\JOStatus; +use App\Ramcar\JOEventType; +use App\Ramcar\InvoiceStatus; +use App\Ramcar\ModeOfPayment; +use App\Ramcar\InvoiceCriteria; +use App\Ramcar\WarrantySource; + +use DateTime; + // third party API for rider class RiderController extends APIController { @@ -372,6 +383,50 @@ class RiderController extends APIController public function acceptJobOrder(Request $req, EntityManagerInterface $em) { + $required_params = ['jo_id']; + + // 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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + $msg = $this->checkJO($req, $required_params, $jo, $rider); + if (!empty($msg)) + return new APIResponse(false, $msg); + + // TODO: refactor this into a jo handler class, so we don't have to repeat for control center + + // set jo status to in transit + $jo->setStatus(JOStatus::IN_TRANSIT); + + // TODO: send mqtt event (?) + + // set rider's current job order + $rider->setCurrentJobOrder($jo); + + // set rider to unavailable + $rider->setAvailable(false); + + // add event log + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ACCEPT) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + + $em->flush(); + + $data = []; + return new APIResponse(true, 'Job order accepted.', $data); + } public function cancelJobOrder(Request $req, EntityManagerInterface $em) @@ -455,4 +510,35 @@ class RiderController extends APIController return $missing; } + + protected function checkJO(Request $req, $required_params, &$jo = null, $rider) + { + // set jo status to in transit + $msg = ''; + $missing = $this->checkMissingParameters($req, $required_params); + if (count($missing) > 0) + { + $params = implode(', ', $missing); + $msg = 'Missing parameter(s): ' . $params; + return $msg; + } + + // check if we have an active JO + $jo = $rider->getActiveJobOrder(); + if ($jo == null) + { + $msg = 'No active job order.'; + return $msg; + } + + // check if the jo_id sent is the same as our active jo + if ($req->request->get('jo_id') != $jo->getID()) + { + $msg = 'Job order selected is not active job order.'; + return $msg; + } + + return $msg; + } + } From 1554f173a8ee7b6ed09c5914ad2ac46f8330b954 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 08:26:25 +0000 Subject: [PATCH 09/37] Add delivery status to job order. #617 --- src/Controller/APIController.php | 2 + src/Controller/CAPI/RiderController.php | 1 + src/Entity/JobOrder.php | 18 ++++++++ src/Ramcar/DeliveryStatus.php | 41 +++++++++++++++++++ src/Ramcar/JOEventType.php | 8 ++++ .../JobOrderHandler/ResqJobOrderHandler.php | 13 ++++-- 6 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 src/Ramcar/DeliveryStatus.php diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 6d286ead..6c080a6d 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -31,6 +31,7 @@ use App\Ramcar\AutoAssignStatus; use App\Ramcar\WarrantySource; use App\Ramcar\HubCriteria; use App\Ramcar\CustomerSource; +use App\Ramcar\DeliveryStatus; use App\Service\InvoiceGeneratorInterface; use App\Service\RisingTideGateway; @@ -2947,6 +2948,7 @@ class APIController extends Controller implements LoggedController $jo->setRider($assigned_rider); $jo->setStatus(JOStatus::ASSIGNED); $jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED); + $jo->setDeliveryStatus(DeliveryStatus::RIDER_ASSIGN); $assigned_rider->setAvailable(false); diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index b66b20c6..e779bd35 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -373,6 +373,7 @@ class RiderController extends APIController 'has_warranty_doc' => false, 'flag_coolant' => $jo->hasCoolant(), 'has_motolite' => $cv->hasMotoliteBattery(), + 'delivery_status' => $jo->getDeliveryStatus(), ] ]; } diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 9fdc2424..fcbe5ddc 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -359,6 +359,12 @@ class JobOrder */ protected $no_trade_in_reason; + // delivery status of the job order + /** + * @ORM\Column(type="string", length=30, nullable=true) + */ + protected $delivery_status; + public function __construct() { $this->date_create = new DateTime(); @@ -1032,4 +1038,16 @@ class JobOrder { return $this->no_trade_in_reason; } + + public function setDeliveryStatus($delivery_status) + { + $this->delivery_status = $delivery_status; + return $this; + } + + public function getDeliveryStatus() + { + return $this->delivery_status; + } + } diff --git a/src/Ramcar/DeliveryStatus.php b/src/Ramcar/DeliveryStatus.php new file mode 100644 index 00000000..7d464444 --- /dev/null +++ b/src/Ramcar/DeliveryStatus.php @@ -0,0 +1,41 @@ + 'Assigned Rider', + 'requeue' => 'Requeue', + 'accept' => 'Rider Accept', + 'arrive' => 'Rider Arrive', + 'rider_edit' => 'Rider Edit', + 'rider_depart_hub' => 'Rider Depart Hub', + 'rider_arrive_hub_pre_jo' => 'Rider Arrive Hub Pre JO', + 'rider_depart_hub_pre_jo' => 'Rider Depart Hub Pre JO', + 'rider_start' => 'Rider Start', + 'rider_end' => 'Rider End', + 'rider_arrive_hub_post_jo' => 'Rider Arrive Hub Post JO', + 'rider_depart_hub_post_jo' => 'Rider Depart Hub Post JO', + 'rider_arrive_hub' => 'Rider Arrive Hub', + 'cancelled' => 'Cancelled', + 'fulfilled' => 'Fulfilled', + ]; +} + diff --git a/src/Ramcar/JOEventType.php b/src/Ramcar/JOEventType.php index e530679d..3413f660 100644 --- a/src/Ramcar/JOEventType.php +++ b/src/Ramcar/JOEventType.php @@ -34,5 +34,13 @@ class JOEventType extends NameValue 'accept' => 'Rider Accept', 'arrive' => 'Rider Arrive', 'rider_edit' => 'Rider Edit', + 'rider_depart_hub' => 'Rider Depart Hub', + 'rider_arrive_hub_pre_jo' => 'Rider Arrive Hub Pre JO', + 'rider_depart_hub_pre_jo' => 'Rider Depart Hub Pre JO', + 'rider_start' => 'Rider Start', + 'rider_end' => 'Rider End', + 'rider_arrive_hub_post_jo' => 'Rider Arrive Hub Post JO', + 'rider_depart_hub_post_jo' => 'Rider Depart Hub Post JO', + 'rider_arrive_hub' => 'Rider Arrive Hub', ]; } diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 82261c4d..c0aa528b 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -43,6 +43,7 @@ use App\Ramcar\NoTradeInReason; use App\Ramcar\WillingToWaitContent; use App\Ramcar\WarrantySource; use App\Ramcar\HubCriteria; +use App\Ramcar\DeliveryStatus; use App\Service\InvoiceGeneratorInterface; use App\Service\JobOrderHandlerInterface; @@ -932,7 +933,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setLandmark($req->request->get('landmark')) ->setWillWait($req->request->get('flag_willing_to_wait')) ->setReasonNotWait($reason) - ->setNotWaitingNotes($more_reason); + ->setNotWaitingNotes($more_reason) + ->setDeliveryStatus(DeliveryStatus::RIDER_ASSIGN); if ($user != null) { @@ -1028,7 +1030,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setLandmark($req->request->get('landmark')) ->setWillWait($req->request->get('flag_willing_to_wait')) ->setReasonNotWait($reason) - ->setNotWaitingNotes($more_reason); + ->setNotWaitingNotes($more_reason) + ->setDeliveryStatus(DeliveryStatus::FULFILLED); // validate $errors = $this->validator->validate($obj); @@ -1143,7 +1146,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $cancel_reason = $req->request->get('cancel_reason'); error_log($cancel_reason); - $obj->cancel($cancel_reason); + $obj->cancel($cancel_reason) + ->setDeliveryStatus(DeliveryStatus::CANCELLED); // the event $event = new JOEvent(); @@ -1484,7 +1488,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setLandmark($req->request->get('landmark')) ->setWillWait($req->request->get('flag_willing_to_wait')) ->setReasonNotWait($reason) - ->setNotWaitingNotes($more_reason); + ->setNotWaitingNotes($more_reason) + ->setDeliveryStatus(DeliveryStatus::RIDER_ASSIGN); if ($user != null) { From 5ea4ac013b94c323e0c81f424342f6b387453e03 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 08:38:08 +0000 Subject: [PATCH 10/37] Add cancelJobOrder. #617 --- src/Controller/CAPI/RiderController.php | 50 ++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index e779bd35..fb947b74 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -38,6 +38,7 @@ use App\Ramcar\InvoiceStatus; use App\Ramcar\ModeOfPayment; use App\Ramcar\InvoiceCriteria; use App\Ramcar\WarrantySource; +use App\Ramcar\DeliveryStatus; use DateTime; @@ -430,8 +431,55 @@ class RiderController extends APIController } - public function cancelJobOrder(Request $req, EntityManagerInterface $em) + public function cancelJobOrder(Request $req, EntityManagerInterface $em, MQTTClient $mclient) { + $required_params = ['jo_id']; + + // 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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + $msg = $this->checkJO($req, $required_params, $jo, $rider); + if (!empty($msg)) + return new APIResponse(false, $msg); + + // requeue it, instead of cancelling it + $jo->requeue(); + + // set delivery status to requeued + $jo->setDeliveryStatus(DeliveryStatus::REQUEUE); + + // set rider's current job order to null + $rider->setCurrentJobOrder(); + + // add event log + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::REQUEUE) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + + $em->flush(); + + // send mqtt event + // send outlet assign since order should go back to hub and await reassignment to another rider + $payload = [ + 'event' => 'outlet_assign', + 'jo_id' => $jo->getID(), + ]; + $mclient->sendEvent($jo, $payload); + + $data = []; + return new APIResponse(true, 'Job order requeued.', $data); } public function arrive(Request $req, EntityManagerInterface $em) From bcd55901d324acec2ae0c9d1d28cf2f5518b7dff Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 09:03:39 +0000 Subject: [PATCH 11/37] Add arrive and hubDepart. #617 --- src/Controller/CAPI/RiderController.php | 127 ++++++++++++++++++++---- 1 file changed, 110 insertions(+), 17 deletions(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index fb947b74..4e4f3f86 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -408,6 +408,9 @@ class RiderController extends APIController // set jo status to in transit $jo->setStatus(JOStatus::IN_TRANSIT); + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_ACCEPT); + // TODO: send mqtt event (?) // set rider's current job order @@ -482,8 +485,114 @@ class RiderController extends APIController return new APIResponse(true, 'Job order requeued.', $data); } - public function arrive(Request $req, EntityManagerInterface $em) + public function hubDepart(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_DEPART_HUB); + + // create time stamp event for JO event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($event); + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider leave hub.', $data); + } + + public function preHubArrive(Request $req, EntityManagerInterface $em) + { + } + + public function preHubDepart(Request $req, EntityManagerInterface $em) + { + } + + public function startJobOrder(Request $req, EntityManagerInterface $em) + { + } + + public function arrive(Request $req, EntityManagerInterface $em, MQTTClient $mclient) + { + $required_params = ['jo_id']; + + // 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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + $msg = $this->checkJO($req, $required_params, $jo, $rider); + if (!empty($msg)) + return new APIResponse(false, $msg); + + // TODO: refactor this into a jo handler class, so we don't have to repeat for control center + + // set jo status to in progress + $jo->setStatus(JOStatus::IN_PROGRESS); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_ARRIVE); + + // add event log + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + + $em->flush(); + + // send mqtt event + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/assets/images/user.gif'; + if ($rider->getImageFile() != null) + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/' . $rider->getImageFile(); + + $payload = [ + 'event' => 'driver_arrived', + 'jo_id' => $jo->getID(), + 'driver_image' => $image_url, + 'driver_name' => $rider->getFullName(), + 'driver_id' => $rider->getID(), + ]; + $mclient->sendEvent($jo, $payload); + + $data = []; + return new APIResponse(true, 'Rider arrived at customer location.', $data); } public function hubArrive(Request $req, EntityManagerInterface $em) @@ -510,22 +619,6 @@ class RiderController extends APIController { } - public function hubDepart(Request $req, EntityManagerInterface $em) - { - } - - public function preHubArrive(Request $req, EntityManagerInterface $em) - { - } - - public function preHubDepart(Request $req, EntityManagerInterface $em) - { - } - - public function startJobOrder(Request $req, EntityManagerInterface $em) - { - } - public function postHubArrive(Request $req, EntityManagerInterface $em) { } From 7671b79d2e00e4eb6ebfe014379fc3719a1824b4 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 10:10:52 +0000 Subject: [PATCH 12/37] Add preHubArrive and preHubDepart. #617 --- src/Controller/CAPI/RiderController.php | 76 +++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index 4e4f3f86..d5ec5cc9 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -529,10 +529,86 @@ class RiderController extends APIController public function preHubArrive(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_ARRIVE_HUB_PRE_JO); + + // create time stamp event for JO event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB_PRE_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($event); + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider arrive at hub pre jo.', $data); } public function preHubDepart(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_DEPART_HUB_PRE_JO); + + // create time stamp event for JO event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB_PRE_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($event); + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider depart from hub pre jo.', $data); } public function startJobOrder(Request $req, EntityManagerInterface $em) From bbe0a804ad595ebf0e1c099ceab3d3c63f5a922e Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 18 Aug 2021 10:30:55 +0000 Subject: [PATCH 13/37] Add startJobOrder and payment. #617 --- src/Controller/CAPI/RiderController.php | 167 +++++++++++++++++++++++- 1 file changed, 166 insertions(+), 1 deletion(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index d5ec5cc9..db327b3c 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -613,6 +613,45 @@ class RiderController extends APIController public function startJobOrder(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_START); + + // create time stamp event for JO event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_START) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($event); + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider start job order.', $data); + } public function arrive(Request $req, EntityManagerInterface $em, MQTTClient $mclient) @@ -675,8 +714,134 @@ class RiderController extends APIController { } - public function payment(Request $req, EntityManagerInterface $em) + public function payment(Request $req, EntityManagerInterface $em, JobOrderHandlerInterface $jo_handler, + RisingTideGateway $rt, WarrantyHandler $wh, MQTTClient $mclient) { + $required_params = ['jo_id']; + + // 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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + $msg = $this->checkJO($req, $required_params, $jo, $rider); + if (!empty($msg)) + return new APIResponse(false, $msg); + + // set invoice to paid + $jo->getInvoice()->setStatus(InvoiceStatus::PAID); + + /* + // set jo status to fulfilled + $jo->setStatus(JOStatus::FULFILLED); + */ + $jo->fulfill(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_END); + + // add event log + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::FULFILL) + ->setJobOrder($jo) + ->setRider($rider); + + $timestamp_event = new JOEvent(); + $timestamp_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_END) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($event); + $em->persist($timestamp_event); + + // NOTE: fix for the rider being assigned to other JO + // while on another JO. + // TODO: comment this out. Rider needs to be set to unavailable + // when rider accepts the JO + // tag rider as unavailable + $rider->setAvailable(false); + + // save to customer vehicle battery record + $jo_handler->updateVehicleBattery($jo); + + // send SMS to customer + $phone_number = $jo->getCustomer()->getPhoneMobile(); + if (!empty($phone_number)) + { + // TODO: put this in config file or somewhere + $message = "Your Resq job order has been completed."; + $rt->sendSMS($phone_number, 'MOTOLITE', $message); + } + + $em->flush(); + + // create warranty + if($jo_handler->checkIfNewBattery($jo)) + { + $serial = null; + $warranty_class = $jo->getWarrantyClass(); + $first_name = $jo->getCustomer()->getFirstName(); + $last_name = $jo->getCustomer()->getLastName(); + $mobile_number = $jo->getCustomer()->getPhoneMobile(); + + // check if date fulfilled is null + //if ($jo->getDateFulfill() == null) + // $date_purchase = $jo->getDateCreate(); + //else + // $date_purchase = $jo->getDateFulfill(); + + // use date_schedule for warranty expiration computation + $date_purchase = $jo->getDateSchedule(); + + $plate_number = $wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); + + $batt_list = array(); + $invoice = $jo->getInvoice(); + if (!empty($invoice)) + { + // get battery + $invoice_items = $invoice->getItems(); + foreach ($invoice_items as $item) + { + $battery = $item->getBattery(); + if ($battery != null) + { + $batt_list[] = $item->getBattery(); + } + } + } + + // for riders, use rider session id + $user_id = $rapi_session->getID(); + $source = WarrantySource::RAPI; + $wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $user_id, $source, $jo->getCustomer(), $jo->getCustomerVehicle()->getVehicle()); + } + + // send mqtt event (fulfilled) + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/assets/images/user.gif'; + if ($rider->getImageFile() != null) + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/' . $rider->getImageFile(); + + $payload = [ + 'event' => 'fulfilled', + 'jo_id' => $jo->getID(), + 'driver_image' => $image_url, + 'driver_name' => $rider->getFullName(), + 'driver_id' => $rider->getID(), + ]; + $mclient->sendEvent($jo, $payload); + + $data = []; + return new APIResponse(true, 'Job order paid and fulfilled.', $data); } public function available(Request $req, EntityManagerInterface $em) From bbee3c4b96e621f27ea9f275be453ab46875eb22 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 19 Aug 2021 02:40:31 +0000 Subject: [PATCH 14/37] Add available, postHubArrive, postHubDepart. #617 --- src/Controller/CAPI/RiderController.php | 166 ++++++++++++++++++++++-- 1 file changed, 158 insertions(+), 8 deletions(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index db327b3c..1a5a56a1 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -712,6 +712,50 @@ class RiderController extends APIController public function hubArrive(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_ARRIVE_HUB); + + $timestamp_event = new JOEvent(); + $timestamp_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($timestamp_event); + + // tag rider as available + $rider->setAvailable(true); + + // set rider's current job order to null + $rider->setCurrentJobOrder(); + + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider arrive at hub.', $data); } public function payment(Request $req, EntityManagerInterface $em, JobOrderHandlerInterface $jo_handler, @@ -844,8 +888,122 @@ class RiderController extends APIController return new APIResponse(true, 'Job order paid and fulfilled.', $data); } + public function postHubArrive(Request $req, EntityManagerInterface $em) + { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_ARRIVE_HUB_POST_JO); + + // create time stamp event for JO event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB_POST_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($event); + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider arrive hub post jo.', $data); + + } + + public function postHubDepart(Request $req, EntityManagerInterface $em) + { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // set delivery status + $jo->setDeliveryStatus(DeliveryStatus::RIDER_DEPART_HUB_POST_JO); + + // create time stamp event for JO event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB_POST_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $em->persist($event); + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider depart hub post jo.', $data); + } + public function available(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + $rider->setAvailable(true); + + // set rider's current job order to null + $rider->setCurrentJobOrder(); + + $em->flush(); + + $data = []; + return new APIResponse(true, 'Rider available.', $data); } public function getPromos(Request $req, EntityManagerInterface $em) @@ -860,14 +1018,6 @@ class RiderController extends APIController { } - public function postHubArrive(Request $req, EntityManagerInterface $em) - { - } - - public function postHubDepart(Request $req, EntityManagerInterface $em) - { - } - protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 27c8cd1f2def9c91d7f59399cd5266316e48e7c5 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 19 Aug 2021 03:12:43 +0000 Subject: [PATCH 15/37] Add changeService, getPromos, getBatteries. #617 --- src/Controller/CAPI/RiderController.php | 240 +++++++++++++++++++++++- 1 file changed, 239 insertions(+), 1 deletion(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index 1a5a56a1..b3ed71df 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -1008,14 +1008,246 @@ class RiderController extends APIController public function getPromos(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $promos = $em->getRepository(Promo::class)->findAll(); + + $promo_data = []; + foreach ($promos as $promo) + { + $promo_data[] = [ + 'id' => $promo->getID(), + 'name' => $promo->getName(), + 'code' => $promo->getCode(), + ]; + } + + $data = [ + 'promos' => $promo_data, + ]; + + return new APIResponse(true, 'Promos found.', $data); } public function getBatteries(Request $req, EntityManagerInterface $em) { + $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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $batts = $em->getRepository(Battery::class)->findAll(); + $models = $em->getRepository(BatteryModel::class)->findAll(); + $sizes = $em->getRepository(BatterySize::class)->findAll(); + + $batt_data = []; + foreach ($batts as $batt) + { + $batt_data[] = [ + 'id' => $batt->getID(), + 'model_id' => $batt->getModel()->getID(), + 'size_id' => $batt->getSize()->getID(), + 'sell_price' => $batt->getSellingPrice(), + ]; + } + + $model_data = []; + foreach ($models as $model) + { + $model_data[] = [ + 'id' => $model->getID(), + 'name' => $model->getName(), + ]; + } + + $size_data = []; + foreach ($sizes as $size) + { + $size_data[] = [ + 'id' => $size->getID(), + 'name' => $size->getName(), + ]; + } + + $data = [ + 'batteries' => $batt_data, + 'models' => $model_data, + 'sizes' => $size_data, + ]; + + return new APIResponse(true, 'Batteries found.', $data); } - public function changeService(Request $req, EntityManagerInterface $em) + public function changeService(Request $req, EntityManagerInterface $em, InvoiceGeneratorInterface $ic) { + $this->debugRequest($req); + + // allow rider to change service, promo, battery and trade-in options + $required_params = ['jo_id', 'stype_id', 'promo_id']; + + // 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]); + + // are we logged in? + if (!$rapi_session->hasRider()) + return new APIResponse(false, 'No logged in rider.'); + + $rider = $rapi_session->getRider(); + + $msg = $this->checkJO($req, $required_params, $jo, $rider); + if (!empty($msg)) + return new APIResponse(false, $msg); + + // check service type + $stype_id = $req->request->get('stype_id'); + if (!ServiceType::validate($stype_id)) + { + $data = [ + 'error' => 'Invalid service type - ' . $stype_id + ]; + return $data; + } + + // check promo id + $promo_id = $req->request->get('promo_id'); + // no promo + if ($promo_id == 0) + $promo = null; + else + { + $promo = $em->getRepository(Promo::class)->find($promo_id); + if ($promo == null) + { + $data = [ + 'error' => 'Invalid promo id - ' . $promo_id + ]; + return $data; + } + } + + // check or number + $or_num = $req->request->get('or_num'); + if ($or_num != null) + $jo->setORNum($or_num); + + // coolant + $flag_coolant = $req->request->get('flag_coolant', 'false'); + if ($flag_coolant == 'true') + $jo->setHasCoolant(true); + else + $jo->setHasCoolant(false); + + // has motolite battery + $cv = $jo->getCustomerVehicle(); + $has_motolite = $req->request->get('has_motolite', 'false'); + if ($has_motolite == 'true') + $cv->setHasMotoliteBattery(true); + else + $cv->setHasMotoliteBattery(false); + $em->persist($cv); + + // check battery id + $batt_id = $req->request->get('batt_id', null); + // no battery + if ($batt_id == 0 || $batt_id == null) + $battery = null; + else + { + $battery = $em->getRepository(Battery::class)->find($batt_id); + if ($battery == null) + { + $data = [ + 'error' => 'Invalid battery id - ' . $batt_id + ]; + return $data; + } + } + + // check trade in + $trade_in = $req->request->get('trade_in'); + if (!TradeInType::validate($trade_in)) + $trade_in = null; + + // check mode of payment + $mode = $req->request->get('mode_of_payment'); + if (!ModeOfPayment::validate($mode)) + $mode = ModeOfPayment::CASH; + $jo->setModeOfPayment($mode); + + // generate new invoice + $crit = new InvoiceCriteria(); + $crit->setServiceType($stype_id); + $crit->setCustomerVehicle($cv); + $crit->setHasCoolant($jo->hasCoolant()); + + if ($promo != null) + $crit->addPromo($promo); + + if ($battery != null) + { + $crit->addEntry($battery, $trade_in, 1); + error_log('adding entry for battery - ' . $battery->getID()); + } + + $invoice = $ic->generateInvoice($crit); + + // remove previous invoice + $old_invoice = $jo->getInvoice(); + $em->remove($old_invoice); + $em->flush(); + + // save job order + $jo->setServiceType($stype_id); + + // save invoice + $jo->setInvoice($invoice); + $em->persist($invoice); + + // add event log + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_EDIT) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + + $em->flush(); + // TODO: send mqtt event (?) + + $data = []; + return new APIResponse(true, 'Job order service changed.', $data); } protected function checkMissingParameters(Request $req, $params = []) @@ -1074,4 +1306,10 @@ class RiderController extends APIController return $msg; } + protected function debugRequest(Request $req) + { + $all = $req->request->all(); + error_log(print_r($all, true)); + } + } From dd34466593161c603ad0fd6e2ef1aab4406740c8 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 19 Aug 2021 05:26:16 +0000 Subject: [PATCH 16/37] Fixes found during testing. #617 --- src/Controller/CAPI/RiderController.php | 3 --- src/Service/InvoiceGenerator/ResqInvoiceGenerator.php | 4 +++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index b3ed71df..1113fe54 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -997,9 +997,6 @@ class RiderController extends APIController $rider->setAvailable(true); - // set rider's current job order to null - $rider->setCurrentJobOrder(); - $em->flush(); $data = []; diff --git a/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php b/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php index 47d8728e..d3e3e4cc 100644 --- a/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php +++ b/src/Service/InvoiceGenerator/ResqInvoiceGenerator.php @@ -123,7 +123,9 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface // get current user $user = $this->security->getUser(); - if ($user != null) + // check if user is User or APIUser + //if ($user != null) + if ($user instanceof User) { $invoice->setCreatedBy($user); } From 84ced62f0f8757681f6e3d83d3725ed3eb176a5a Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 20 Aug 2021 08:04:51 +0000 Subject: [PATCH 17/37] Modify login. #617 --- src/Controller/CAPI/RiderController.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderController.php index 1113fe54..7184e97e 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderController.php @@ -20,6 +20,7 @@ use App\Entity\BatteryModel; use App\Entity\BatterySize; use App\Entity\RiderAPISession; use App\Entity\User; +use Catalyst\APIBundle\Entity\User as APIUser; use App\Service\RedisClientProvider; use App\Service\RiderCache; @@ -123,10 +124,18 @@ class RiderController extends APIController RedisClientProvider $redis) { $required_params = [ - 'user', - 'pass', ]; + // TODO: right now, no validation at all. Accept anything. + // get capi user + $capi_user_id = $this->getUser()->getID(); + $capi_user = $em->getRepository(APIUser::class)->find($capi_user_id); + + // get rider id from capi user metadata + // TODO: uncomment once getMetadata is available + // $rider_id = $capi_user->getMetadata(); + + /* $missing = $this->checkMissingParameters($req, $required_params); if (count($missing) > 0) { @@ -209,6 +218,12 @@ class RiderController extends APIController $data = [ 'hub' => $hub_data, 'rider_id' => $rider_id, + ]; + */ + + $data = [ + 'api_key' => $capi_user->getAPIKey(), + 'secret_key' => $capi_user->getSecretKey(), ]; return new APIResponse(true, 'Rider logged in.', $data); From 4f58f38f673abf26a11b665e66c3764e5d82d6db Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 20 Aug 2021 08:54:35 +0000 Subject: [PATCH 18/37] Rename rider controller. #617 --- config/routes/capi_rider.yaml | 38 +++++++++---------- ...rController.php => RiderAppController.php} | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) rename src/Controller/CAPI/{RiderController.php => RiderAppController.php} (99%) diff --git a/config/routes/capi_rider.yaml b/config/routes/capi_rider.yaml index f862c758..51a41d67 100644 --- a/config/routes/capi_rider.yaml +++ b/config/routes/capi_rider.yaml @@ -2,96 +2,96 @@ capi_rider_register: path: /capi/rider/register - controller: App\Controller\CAPI\RiderController::register + controller: App\Controller\CAPI\RiderAppController::register methods: [POST] capi_rider_login: path: /capi/rider/login - controller: App\Controller\CAPI\RiderController::login + controller: App\Controller\CAPI\RiderAppController::login methods: [POST] capi_rider_logout: path: /capi/rider/logout - controller: App\Controller\CAPI\RiderController::logout + controller: App\Controller\CAPI\RiderAppController::logout methods: [POST] capi_rider_jo_get: path: /capi/rider/joborder - controller: App\Controller\CAPI\RiderController::getJobOrder + controller: App\Controller\CAPI\RiderAppController::getJobOrder methods: [GET] capi_rider_jo_accept: path: /capi/rider/accept - controller: App\Controller\CAPI\RiderController::acceptJobOrder + controller: App\Controller\CAPI\RiderAppController::acceptJobOrder methods: [POST] capi_rider_jo_cancel: path: /capi/rider/cancel - controller: App\Controller\CAPI\RiderController::cancelJobOrder + controller: App\Controller\CAPI\RiderAppController::cancelJobOrder methods: [POST] capi_rider_arrive: path: /capi/rider/arrive - controller: App\Controller\CAPI\RiderController::arrive + controller: App\Controller\CAPI\RiderAppController::arrive methods: [POST] capi_rider_payment: path: /capi/rider/payment - controller: App\Controller\CAPI\RiderController::payment + controller: App\Controller\CAPI\RiderAppController::payment methods: [POST] capi_rider_hub_arrive: path: /capi/rider/hub_arrive - controller: App\Controller\CAPI\RiderController::hubArrive + controller: App\Controller\CAPI\RiderAppController::hubArrive methods: [POST] capi_rider_promos: path: /capi/rider/promos - controller: App\Controller\CAPI\RiderController::getPromos + controller: App\Controller\CAPI\RiderAppController::getPromos methods: [GET] capi_rider_batteries: path: /capi/rider/batteries - controller: App\Controller\CAPI\RiderController::getBatteries + controller: App\Controller\CAPI\RiderAppController::getBatteries methods: [GET] capi_rider_change_service: path: /capi/rider/service - controller: App\Controller\CAPI\RiderController::changeService + controller: App\Controller\CAPI\RiderAppController::changeService methods: [POST] capi_rider_available: path: /capi/rider/available - controller: App\Controller\CAPI\RiderController::available + controller: App\Controller\CAPI\RiderAppController::available methods: [POST] capi_rider_hub_depart: path: /capi/rider/hub_depart - controller: App\Controller\CAPI\RiderController::hubDepart + controller: App\Controller\CAPI\RiderAppController::hubDepart methods: [POST] capi_rider_pre_hub_depart: path: /capi/rider/pre_hub_depart - controller: App\Controller\CAPI\RiderController::preHubDepart + controller: App\Controller\CAPI\RiderAppController::preHubDepart methods: [POST] capi_rider_pre_hub_arrive: path: /capi/rider/pre_hub_arrive - controller: App\Controller\CAPI\RiderController::preHubArrive + controller: App\Controller\CAPI\RiderAppController::preHubArrive methods: [POST] capi_rider_post_hub_depart: path: /capi/rider/post_hub_depart - controller: App\Controller\CAPI\RiderController::postHubDepart + controller: App\Controller\CAPI\RiderAppController::postHubDepart methods: [POST] capi_rider_post_hub_arrive: path: /capi/rider/post_hub_arrive - controller: App\Controller\CAPI\RiderController::postHubArrive + controller: App\Controller\CAPI\RiderAppController::postHubArrive methods: [POST] capi_rider_jo_start: path: /capi/rider/start - controller: App\Controller\CAPI\RiderController::startJobOrder + controller: App\Controller\CAPI\RiderAppController::startJobOrder methods: [POST] diff --git a/src/Controller/CAPI/RiderController.php b/src/Controller/CAPI/RiderAppController.php similarity index 99% rename from src/Controller/CAPI/RiderController.php rename to src/Controller/CAPI/RiderAppController.php index 7184e97e..ec330176 100644 --- a/src/Controller/CAPI/RiderController.php +++ b/src/Controller/CAPI/RiderAppController.php @@ -44,7 +44,7 @@ use App\Ramcar\DeliveryStatus; use DateTime; // third party API for rider -class RiderController extends APIController +class RiderAppController extends APIController { public function register(Request $req, EntityManagerInterface $em, RedisClientProvider $redis) { From 62c78939a8c6660b793b0d16f2a2c5a22c696df7 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 20 Aug 2021 09:11:17 +0000 Subject: [PATCH 19/37] Modify rider api routes. #617 --- config/packages/security.yaml | 13 ++++++++++++ config/routes/capi_rider.yaml | 38 +++++++++++++++++------------------ 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 4339eba4..80852b2a 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -21,6 +21,11 @@ security: methods: [GET] security: false + new_rider_api_login: + pattern: ^\/rider_api\/login$ + methods: [GET] + security: false + tracker: pattern: ^\/track\/ methods: [GET] @@ -46,6 +51,14 @@ security: provider: api_key_user_provider user_checker: Catalyst\AuthBundle\Service\UserChecker + new_rider_api: + pattern: ^\/rider_api\/ + stateless: true + simple_preauth: + authenticator: Catalyst\APIBundle\Security\APIKeyAuthenticator + provider: api_key_user_provider + user_checker: Catalyst\AuthBundle\Service\UserChecker + main: provider: user_provider form_login: diff --git a/config/routes/capi_rider.yaml b/config/routes/capi_rider.yaml index 51a41d67..746cd609 100644 --- a/config/routes/capi_rider.yaml +++ b/config/routes/capi_rider.yaml @@ -1,97 +1,97 @@ # rider app api capi_rider_register: - path: /capi/rider/register + path: /rider_api/register controller: App\Controller\CAPI\RiderAppController::register methods: [POST] capi_rider_login: - path: /capi/rider/login + path: /rider_api/login controller: App\Controller\CAPI\RiderAppController::login methods: [POST] capi_rider_logout: - path: /capi/rider/logout + path: /rider_api/logout controller: App\Controller\CAPI\RiderAppController::logout methods: [POST] capi_rider_jo_get: - path: /capi/rider/joborder + path: /rider_api/joborder controller: App\Controller\CAPI\RiderAppController::getJobOrder methods: [GET] capi_rider_jo_accept: - path: /capi/rider/accept + path: /rider_api/accept controller: App\Controller\CAPI\RiderAppController::acceptJobOrder methods: [POST] capi_rider_jo_cancel: - path: /capi/rider/cancel + path: /rider_api/cancel controller: App\Controller\CAPI\RiderAppController::cancelJobOrder methods: [POST] capi_rider_arrive: - path: /capi/rider/arrive + path: /rider_api/arrive controller: App\Controller\CAPI\RiderAppController::arrive methods: [POST] capi_rider_payment: - path: /capi/rider/payment + path: /rider_api/payment controller: App\Controller\CAPI\RiderAppController::payment methods: [POST] capi_rider_hub_arrive: - path: /capi/rider/hub_arrive + path: /rider_api/hub_arrive controller: App\Controller\CAPI\RiderAppController::hubArrive methods: [POST] capi_rider_promos: - path: /capi/rider/promos + path: /rider_api/promos controller: App\Controller\CAPI\RiderAppController::getPromos methods: [GET] capi_rider_batteries: - path: /capi/rider/batteries + path: /rider_api/batteries controller: App\Controller\CAPI\RiderAppController::getBatteries methods: [GET] capi_rider_change_service: - path: /capi/rider/service + path: /rider_api/service controller: App\Controller\CAPI\RiderAppController::changeService methods: [POST] capi_rider_available: - path: /capi/rider/available + path: /rider_api/available controller: App\Controller\CAPI\RiderAppController::available methods: [POST] capi_rider_hub_depart: - path: /capi/rider/hub_depart + path: /rider_api/hub_depart controller: App\Controller\CAPI\RiderAppController::hubDepart methods: [POST] capi_rider_pre_hub_depart: - path: /capi/rider/pre_hub_depart + path: /rider_api/pre_hub_depart controller: App\Controller\CAPI\RiderAppController::preHubDepart methods: [POST] capi_rider_pre_hub_arrive: - path: /capi/rider/pre_hub_arrive + path: /rider_api/pre_hub_arrive controller: App\Controller\CAPI\RiderAppController::preHubArrive methods: [POST] capi_rider_post_hub_depart: - path: /capi/rider/post_hub_depart + path: /rider_api/post_hub_depart controller: App\Controller\CAPI\RiderAppController::postHubDepart methods: [POST] capi_rider_post_hub_arrive: - path: /capi/rider/post_hub_arrive + path: /rider_api/post_hub_arrive controller: App\Controller\CAPI\RiderAppController::postHubArrive methods: [POST] capi_rider_jo_start: - path: /capi/rider/start + path: /rider_api/start controller: App\Controller\CAPI\RiderAppController::startJobOrder methods: [POST] From b5218a349911e8ea3ed0cdee446ee72602ba59a6 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 20 Aug 2021 09:56:04 +0000 Subject: [PATCH 20/37] Modify capi user checking. #617 --- src/Controller/CAPI/RiderAppController.php | 339 ++++++++++----------- 1 file changed, 167 insertions(+), 172 deletions(-) diff --git a/src/Controller/CAPI/RiderAppController.php b/src/Controller/CAPI/RiderAppController.php index ec330176..6fc3adab 100644 --- a/src/Controller/CAPI/RiderAppController.php +++ b/src/Controller/CAPI/RiderAppController.php @@ -46,6 +46,7 @@ use DateTime; // third party API for rider class RiderAppController extends APIController { + /* public function register(Request $req, EntityManagerInterface $em, RedisClientProvider $redis) { // confirm parameters @@ -117,7 +118,7 @@ class RiderAppController extends APIController ]; return new APIResponse(true, 'Rider API user created.', $data); - } + } */ public function login(Request $req, EntityManagerInterface $em, EncoderFactoryInterface $ef, RiderCache $rcache, RiderTracker $rider_tracker, MQTTClient $mclient, @@ -128,12 +129,14 @@ class RiderAppController extends APIController // TODO: right now, no validation at all. Accept anything. // get capi user - $capi_user_id = $this->getUser()->getID(); - $capi_user = $em->getRepository(APIUser::class)->find($capi_user_id); + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); // get rider id from capi user metadata - // TODO: uncomment once getMetadata is available - // $rider_id = $capi_user->getMetadata(); + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); /* $missing = $this->checkMissingParameters($req, $required_params); @@ -239,22 +242,22 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // 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(); @@ -281,17 +284,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // do we have a job order? $jo = $rider->getActiveJobOrder(); @@ -402,17 +403,15 @@ class RiderAppController extends APIController { $required_params = ['jo_id']; - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $msg = $this->checkJO($req, $required_params, $jo, $rider); if (!empty($msg)) @@ -453,17 +452,15 @@ class RiderAppController extends APIController { $required_params = ['jo_id']; - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $msg = $this->checkJO($req, $required_params, $jo, $rider); if (!empty($msg)) @@ -510,17 +507,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // get rider's current job order $jo = $rider->getCurrentJobOrder(); @@ -552,17 +547,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // get rider's current job order $jo = $rider->getCurrentJobOrder(); @@ -594,17 +587,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // get rider's current job order $jo = $rider->getCurrentJobOrder(); @@ -636,17 +627,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // get rider's current job order $jo = $rider->getCurrentJobOrder(); @@ -673,17 +662,15 @@ class RiderAppController extends APIController { $required_params = ['jo_id']; - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $msg = $this->checkJO($req, $required_params, $jo, $rider); if (!empty($msg)) @@ -735,17 +722,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // get rider's current job order $jo = $rider->getCurrentJobOrder(); @@ -778,17 +763,15 @@ class RiderAppController extends APIController { $required_params = ['jo_id']; - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $msg = $this->checkJO($req, $required_params, $jo, $rider); if (!empty($msg)) @@ -879,8 +862,8 @@ class RiderAppController extends APIController } } - // for riders, use rider session id - $user_id = $rapi_session->getID(); + // for riders, use rider id + $user_id = $rider->getID(); $source = WarrantySource::RAPI; $wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $user_id, $source, $jo->getCustomer(), $jo->getCustomerVehicle()->getVehicle()); } @@ -913,17 +896,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // get rider's current job order $jo = $rider->getCurrentJobOrder(); @@ -956,17 +937,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); // get rider's current job order $jo = $rider->getCurrentJobOrder(); @@ -998,17 +977,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $rider->setAvailable(true); @@ -1028,15 +1005,15 @@ class RiderAppController extends APIController return new APIResponse(false, 'Missing parameter(s): ' . $params); } - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $promos = $em->getRepository(Promo::class)->findAll(); @@ -1066,16 +1043,16 @@ class RiderAppController extends APIController $params = implode(', ', $missing); return new APIResponse(false, 'Missing parameter(s): ' . $params); } + + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // 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]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $batts = $em->getRepository(Battery::class)->findAll(); $models = $em->getRepository(BatteryModel::class)->findAll(); @@ -1126,17 +1103,15 @@ class RiderAppController extends APIController // allow rider to change service, promo, battery and trade-in options $required_params = ['jo_id', 'stype_id', 'promo_id']; - // get capi user to link to rider api user - $capi_user_id = $this->getUser()->getID(); + // get capi user + $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + if ($capi_user == null) + return new APIResponse(false, 'User not found.'); - // check if capi user already has a rider api user - $rapi_session = $em->getRepository(RiderAPISession::class)->findOneBy(['capi_user_id' => $capi_user_id]); - - // are we logged in? - if (!$rapi_session->hasRider()) - return new APIResponse(false, 'No logged in rider.'); - - $rider = $rapi_session->getRider(); + // get rider id from capi user metadata + $rider = $this->getRiderFromCAPI($capi_user, $em); + if ($rider == null) + return new APIResponse(false, 'No rider found.'); $msg = $this->checkJO($req, $required_params, $jo, $rider); if (!empty($msg)) @@ -1262,6 +1237,26 @@ class RiderAppController extends APIController return new APIResponse(true, 'Job order service changed.', $data); } + protected function getCAPIUser($id, EntityManagerInterface $em) + { + $capi_user = $em->getRepository(APIUser::class)->find($id); + return $capi_user; + } + + protected function getRiderFromCAPI($capi_user, $em) + { + // TODO: uncomment once getMetadata is available + /* + $metadata = $capi_user->getMetadata(); + //get rider id from metadata + $rider_id = $metadata['rider_id']; + // get rider + $rider = $em->getRepository(Rider::class)->find($rider_id); + return $rider; + */ + + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 973ba8ff00b3396fc2bd5554688dfaa6291c2aa6 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Fri, 20 Aug 2021 22:45:50 +0800 Subject: [PATCH 21/37] Add api user link in Rider entity and metadata field for API User #617 --- catalyst/api-bundle/Entity/User.php | 20 ++++++++++++++++++++ src/Controller/APIUserController.php | 12 ++++++++++++ src/Entity/Rider.php | 19 +++++++++++++++++++ templates/api-user/form.html.twig | 15 +++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/catalyst/api-bundle/Entity/User.php b/catalyst/api-bundle/Entity/User.php index a55c88c6..6065979d 100644 --- a/catalyst/api-bundle/Entity/User.php +++ b/catalyst/api-bundle/Entity/User.php @@ -53,6 +53,11 @@ class User extends BaseUser */ protected $roles; + /** + * @ORM\Column(type="json") + */ + protected $metadata; + public function __construct() { parent::__construct(); @@ -63,6 +68,7 @@ class User extends BaseUser // set date created $this->date_create = new DateTime(); + $this->metadata = []; } public function getID() @@ -140,6 +146,20 @@ class User extends BaseUser return $this->generateKey('secret'); } + public function setMetadata($meta) + { + $this->metadata = $meta; + return $this; + } + + public function getMetadata() + { + if ($this->metadata == null) + return []; + + return $this->metadata; + } + protected function generateKey($prefix = '') { return md5(uniqid($prefix, true)); diff --git a/src/Controller/APIUserController.php b/src/Controller/APIUserController.php index 8dd7e2f1..0196ae34 100644 --- a/src/Controller/APIUserController.php +++ b/src/Controller/APIUserController.php @@ -14,6 +14,8 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Catalyst\MenuBundle\Annotation\Menu; +use App\Entity\Rider; + class APIUserController extends Controller { /** @@ -135,6 +137,7 @@ class APIUserController extends Controller // get roles $em = $this->getDoctrine()->getManager(); $params['roles'] = $em->getRepository(APIRole::class)->findAll(); + $params['riders'] = $em->getRepository(Rider::class)->findBy([], ['first_name' => 'asc']); // response return $this->render('api-user/form.html.twig', $params); @@ -149,9 +152,13 @@ class APIUserController extends Controller $em = $this->getDoctrine()->getManager(); $obj = new APIUser(); + // metadata + $meta = ['rider_id' => $req->request->get('rider_id')]; + // set and save values $obj->setName($req->request->get('name')) ->setEnabled($req->request->get('enabled') ? true : false) + ->setMetadata($meta) ->clearRoles(); // set roles @@ -221,6 +228,7 @@ class APIUserController extends Controller // get roles $params['roles'] = $em->getRepository(APIRole::class)->findAll(); + $params['riders'] = $em->getRepository(Rider::class)->findBy([], ['first_name' => 'asc']); $params['obj'] = $obj; @@ -241,8 +249,12 @@ class APIUserController extends Controller throw $this->createNotFoundException('The item does not exist'); // set and save values + $meta = $obj->getMetadata(); + $meta['rider_id'] = $req->request->get('rider_id'); + $obj->setName($req->request->get('name')) ->setEnabled($req->request->get('enabled') ? true : false) + ->setMetadata($meta) ->clearRoles(); // set roles diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index 8a2ed9ea..fa3e0df9 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -9,6 +9,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Criteria; use App\Ramcar\JOStatus; +use Catalyst\APIBundle\Entity\User as APIUser; /** * @ORM\Entity @@ -129,6 +130,12 @@ class Rider */ protected $current_job_order; + /** + * @ORM\OneToOne(targetEntity="Catalyst\APIBundle\Entity\User") + * @ORM\JoinColumn(name="api_user_id", referencedColumnName="id", nullable=true) + */ + protected $api_user; + public function __construct() { $this->job_orders = new ArrayCollection(); @@ -142,6 +149,7 @@ class Rider $this->active_job_order = null; $this->current_job_order = null; + $this->api_user = null; } public function getID() @@ -392,4 +400,15 @@ class Rider { return $this->current_job_order; } + + public function setAPIUser($user) + { + $this->api_user = $user; + return $this; + } + + public function getAPIUser() + { + return $this->api_user; + } } diff --git a/templates/api-user/form.html.twig b/templates/api-user/form.html.twig index 57c3c313..49c3e980 100644 --- a/templates/api-user/form.html.twig +++ b/templates/api-user/form.html.twig @@ -45,6 +45,21 @@ +
+
+ + + +
+
From e7fb5014ffecd0e52951b428e69a9c1f0af7ef02 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 21 Aug 2021 00:05:46 +0800 Subject: [PATCH 22/37] Fix new rider api login #617 --- config/packages/security.yaml | 10 +++--- src/Controller/CAPI/RiderAppController.php | 36 +++++++++++++--------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 80852b2a..2eecd1e8 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -16,13 +16,13 @@ security: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false - login: - pattern: ^\/login$ - methods: [GET] - security: false - new_rider_api_login: pattern: ^\/rider_api\/login$ + methods: [POST] + security: false + + login: + pattern: ^\/login$ methods: [GET] security: false diff --git a/src/Controller/CAPI/RiderAppController.php b/src/Controller/CAPI/RiderAppController.php index 6fc3adab..c515709b 100644 --- a/src/Controller/CAPI/RiderAppController.php +++ b/src/Controller/CAPI/RiderAppController.php @@ -128,15 +128,26 @@ class RiderAppController extends APIController ]; // TODO: right now, no validation at all. Accept anything. - // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); - if ($capi_user == null) - return new APIResponse(false, 'User not found.'); - // get rider id from capi user metadata - $rider = $this->getRiderFromCAPI($capi_user, $em); + + // NOTE: we retain the username and password in rider for backward compatibility + // look for rider with username + $rider = $em->getRepository(Rider::class)->findOneBy(['username' => $req->request->get('user')]); if ($rider == null) - return new APIResponse(false, 'No rider found.'); + return new APIResponse(false, 'Invalid username or password.'); + + // check if rider password is correct + // NOTE: we use + $encoder = $ef->getEncoder(new User()); + if (!$encoder->isPasswordValid($rider->getPassword(), $req->request->get('pass'), '')) + return new APIResponse(false, 'Invalid username or password.'); + + // user will be the one linked to the rider + $user = $rider->getAPIUser(); + // no linked user, cannot login + if ($user == null) + return new APIResponse(false, 'Rider cannot login, no associated user.'); + /* $missing = $this->checkMissingParameters($req, $required_params); @@ -225,8 +236,8 @@ class RiderAppController extends APIController */ $data = [ - 'api_key' => $capi_user->getAPIKey(), - 'secret_key' => $capi_user->getSecretKey(), + 'api_key' => $user->getAPIKey(), + 'secret_key' => $user->getSecretKey(), ]; return new APIResponse(true, 'Rider logged in.', $data); @@ -1245,16 +1256,13 @@ class RiderAppController extends APIController protected function getRiderFromCAPI($capi_user, $em) { - // TODO: uncomment once getMetadata is available - /* - $metadata = $capi_user->getMetadata(); //get rider id from metadata + $metadata = $capi_user->getMetadata(); $rider_id = $metadata['rider_id']; + // get rider $rider = $em->getRepository(Rider::class)->find($rider_id); return $rider; - */ - } protected function checkMissingParameters(Request $req, $params = []) From 5dee6d041816d2737b5a4c5a906df5570ed01dcb Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 21 Aug 2021 00:41:36 +0800 Subject: [PATCH 23/37] Fix new rider api login data return #617 --- src/Controller/CAPI/RiderAppController.php | 43 +++++++++++----------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/Controller/CAPI/RiderAppController.php b/src/Controller/CAPI/RiderAppController.php index c515709b..27d2888d 100644 --- a/src/Controller/CAPI/RiderAppController.php +++ b/src/Controller/CAPI/RiderAppController.php @@ -211,6 +211,9 @@ class RiderAppController extends APIController $rider_id = $rider->getID(); $redis_client->set($redis_key, $rider_id); + */ + + $rider_id = $rider->getID(); $hub = $rider->getHub(); if ($hub == null) @@ -232,13 +235,9 @@ class RiderAppController extends APIController $data = [ 'hub' => $hub_data, 'rider_id' => $rider_id, - ]; - */ - - $data = [ 'api_key' => $user->getAPIKey(), 'secret_key' => $user->getSecretKey(), - ]; + ]; return new APIResponse(true, 'Rider logged in.', $data); } @@ -254,7 +253,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -296,7 +295,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -415,7 +414,7 @@ class RiderAppController extends APIController $required_params = ['jo_id']; // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -464,7 +463,7 @@ class RiderAppController extends APIController $required_params = ['jo_id']; // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -519,7 +518,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -559,7 +558,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -599,7 +598,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -639,7 +638,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -674,7 +673,7 @@ class RiderAppController extends APIController $required_params = ['jo_id']; // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -734,7 +733,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -775,7 +774,7 @@ class RiderAppController extends APIController $required_params = ['jo_id']; // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -908,7 +907,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -949,7 +948,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -989,7 +988,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -1017,7 +1016,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -1056,7 +1055,7 @@ class RiderAppController extends APIController } // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); @@ -1115,7 +1114,7 @@ class RiderAppController extends APIController $required_params = ['jo_id', 'stype_id', 'promo_id']; // get capi user - $capi_user = $this->getCAPIUser($this->getUser()->getID(), $em); + $capi_user = $this->getUser(); if ($capi_user == null) return new APIResponse(false, 'User not found.'); From 4a9de8e465e2efdf7b27b4f3d9c803cc16305073 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 21 Aug 2021 00:50:26 +0800 Subject: [PATCH 24/37] Fix api role edit #617 --- src/Controller/APIRoleController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/APIRoleController.php b/src/Controller/APIRoleController.php index d2dbd888..f347d890 100644 --- a/src/Controller/APIRoleController.php +++ b/src/Controller/APIRoleController.php @@ -242,7 +242,7 @@ class APIRoleController extends Controller if (!$row->isSuperAdmin()) { // clear first - $row->clearACLAttributes(); + $row->clearACLAccess(); // then add $acl_attribs = $req->request->get('acl'); From 7483c35306bcc2e91aad143b3105b2c6feced38b Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 21 Aug 2021 13:11:40 +0800 Subject: [PATCH 25/37] Link api user to rider entity directly without need for metadata #617 --- catalyst/api-bundle/Entity/User.php | 18 ++++++++++++++++++ src/Controller/APIUserController.php | 21 +++++++++++++++++++-- src/Entity/Rider.php | 2 +- templates/api-user/form.html.twig | 3 +-- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/catalyst/api-bundle/Entity/User.php b/catalyst/api-bundle/Entity/User.php index 6065979d..ff6a7ba8 100644 --- a/catalyst/api-bundle/Entity/User.php +++ b/catalyst/api-bundle/Entity/User.php @@ -53,6 +53,13 @@ class User extends BaseUser */ protected $roles; + // rider linked to user + // NOTE: we're directly linking this only because we don't have to care about other apps using this library + /** + * @ORM\OneToOne(targetEntity="App\Entity\Rider", mappedBy="api_user") + */ + protected $rider; + /** * @ORM\Column(type="json") */ @@ -164,5 +171,16 @@ class User extends BaseUser { return md5(uniqid($prefix, true)); } + + public function setRider($rider) + { + $this->rider = $rider; + return $this; + } + + public function getRider() + { + return $this->rider; + } } diff --git a/src/Controller/APIUserController.php b/src/Controller/APIUserController.php index 0196ae34..06f128e9 100644 --- a/src/Controller/APIUserController.php +++ b/src/Controller/APIUserController.php @@ -153,12 +153,20 @@ class APIUserController extends Controller $obj = new APIUser(); // metadata - $meta = ['rider_id' => $req->request->get('rider_id')]; + $rider_id = $req->request->get('rider_id'); + $rider = $em->getRepository(Rider::class)->find($rider_id); + // TODO: check for null rider + + $meta = ['rider_id' => $rider_id]; + + // set api user in rider + $rider->setAPIUser($obj); // set and save values $obj->setName($req->request->get('name')) ->setEnabled($req->request->get('enabled') ? true : false) ->setMetadata($meta) + ->setRider($rider) ->clearRoles(); // set roles @@ -249,12 +257,21 @@ class APIUserController extends Controller throw $this->createNotFoundException('The item does not exist'); // set and save values + // metadata + $rider_id = $req->request->get('rider_id'); + $rider = $em->getRepository(Rider::class)->find($rider_id); + // TODO: check for null rider + $meta = $obj->getMetadata(); - $meta['rider_id'] = $req->request->get('rider_id'); + $meta['rider_id'] = $rider_id; + + // set api user in rider + $rider->setAPIUser($obj); $obj->setName($req->request->get('name')) ->setEnabled($req->request->get('enabled') ? true : false) ->setMetadata($meta) + ->setRider($rider) ->clearRoles(); // set roles diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index fa3e0df9..34f49455 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -131,7 +131,7 @@ class Rider protected $current_job_order; /** - * @ORM\OneToOne(targetEntity="Catalyst\APIBundle\Entity\User") + * @ORM\OneToOne(targetEntity="Catalyst\APIBundle\Entity\User", inversedBy="rider") * @ORM\JoinColumn(name="api_user_id", referencedColumnName="id", nullable=true) */ protected $api_user; diff --git a/templates/api-user/form.html.twig b/templates/api-user/form.html.twig index 49c3e980..436f5f7b 100644 --- a/templates/api-user/form.html.twig +++ b/templates/api-user/form.html.twig @@ -52,9 +52,8 @@ From c85ad3ab4f0917fbbdd2d7ee9fe6ff77b4b6b4e1 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 21 Aug 2021 13:13:35 +0800 Subject: [PATCH 26/37] Change rider api getRiderFromCAPI to get from direct association instead of metadata #617 --- src/Controller/CAPI/RiderAppController.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Controller/CAPI/RiderAppController.php b/src/Controller/CAPI/RiderAppController.php index 27d2888d..4f3e95e1 100644 --- a/src/Controller/CAPI/RiderAppController.php +++ b/src/Controller/CAPI/RiderAppController.php @@ -1255,13 +1255,18 @@ class RiderAppController extends APIController protected function getRiderFromCAPI($capi_user, $em) { + /* //get rider id from metadata $metadata = $capi_user->getMetadata(); $rider_id = $metadata['rider_id']; // get rider $rider = $em->getRepository(Rider::class)->find($rider_id); + return $rider; + */ + + return $capi_user->getRider(); } protected function checkMissingParameters(Request $req, $params = []) From ea2f0e639d50fd7d6a1599eedef603c7a4b7c8d1 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Sat, 21 Aug 2021 05:55:10 +0000 Subject: [PATCH 27/37] Add command to create api users from existing riders. #617 --- src/Command/CreateRiderAPIUserCommand.php | 68 +++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/Command/CreateRiderAPIUserCommand.php diff --git a/src/Command/CreateRiderAPIUserCommand.php b/src/Command/CreateRiderAPIUserCommand.php new file mode 100644 index 00000000..5c72d00c --- /dev/null +++ b/src/Command/CreateRiderAPIUserCommand.php @@ -0,0 +1,68 @@ +em = $em; + + parent::__construct(); + } + + protected function configure() + { + $this->setName('api:user-create-for-rider') + ->setDescription('Create API users for existing riders.') + ->setHelp('Creates API users for existing riders.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + error_log('Creating api users...'); + // get all existing riders + $riders = $this->em->getRepository(Rider::class)->findAll(); + + foreach ($riders as $rider) + { + // create api user for each rider + // no need to generate the keys. + // Secret and API keys are generated in constructor + $api_user = new APIUser(); + + // set name to rider's last name + first name + $rider_name = $rider->getLastName() . '_' . $rider->getFirstName(); + $api_user->setName($rider_name); + + // set rider to api_user + $api_user->setRider($rider); + + // set meta + $meta = ['rider_id' => $rider->getID()]; + $api_user->setMetaData($meta); + + $this->em->persist($api_user); + } + + $this->em->flush(); + + return 0; + } +} From ff5e747d7adfb36cec71286bc8a2bd5bb0fa05b5 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Sat, 21 Aug 2021 06:11:23 +0000 Subject: [PATCH 28/37] Set rider's api user. #617 --- src/Command/CreateRiderAPIUserCommand.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Command/CreateRiderAPIUserCommand.php b/src/Command/CreateRiderAPIUserCommand.php index 5c72d00c..9228ef5d 100644 --- a/src/Command/CreateRiderAPIUserCommand.php +++ b/src/Command/CreateRiderAPIUserCommand.php @@ -58,6 +58,9 @@ class CreateRiderAPIUserCommand extends Command $meta = ['rider_id' => $rider->getID()]; $api_user->setMetaData($meta); + // set rider's api user + $rider->setAPIUser($api_user); + $this->em->persist($api_user); } From 25954afe63fe88822f4c44620c91cf5bacb00026 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Sat, 21 Aug 2021 06:39:12 +0000 Subject: [PATCH 29/37] Set api role for rider api user. #617 --- src/Command/CreateRiderAPIUserCommand.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Command/CreateRiderAPIUserCommand.php b/src/Command/CreateRiderAPIUserCommand.php index 9228ef5d..6eefdf12 100644 --- a/src/Command/CreateRiderAPIUserCommand.php +++ b/src/Command/CreateRiderAPIUserCommand.php @@ -11,6 +11,7 @@ use Symfony\Component\Console\Output\OutputInterface; use Doctrine\ORM\EntityManagerInterface; use Catalyst\APIBundle\Entity\User as APIUser; +use Catalyst\APIBundle\Entity\Role as APIRole; use App\Entity\Rider; @@ -31,7 +32,8 @@ class CreateRiderAPIUserCommand extends Command { $this->setName('api:user-create-for-rider') ->setDescription('Create API users for existing riders.') - ->setHelp('Creates API users for existing riders.'); + ->setHelp('Creates API users for existing riders.') + ->addArgument('role_id', InputArgument::REQUIRED, 'Role ID for api_user.'); } protected function execute(InputInterface $input, OutputInterface $output) @@ -40,6 +42,15 @@ class CreateRiderAPIUserCommand extends Command // get all existing riders $riders = $this->em->getRepository(Rider::class)->findAll(); + // get role for rider api user + $role_id = $input->getArgument('role_id'); + $role = $this->em->getRepository(APIRole::class)->find($role_id); + if ($role == null) + { + error_log('Cannot find role with id ' . $role_id); + return 0; + } + foreach ($riders as $rider) { // create api user for each rider @@ -47,6 +58,9 @@ class CreateRiderAPIUserCommand extends Command // Secret and API keys are generated in constructor $api_user = new APIUser(); + // set enabled to true + $api_user->setEnabled(true); + // set name to rider's last name + first name $rider_name = $rider->getLastName() . '_' . $rider->getFirstName(); $api_user->setName($rider_name); @@ -58,6 +72,9 @@ class CreateRiderAPIUserCommand extends Command $meta = ['rider_id' => $rider->getID()]; $api_user->setMetaData($meta); + // set role + $api_user->addRole($role); + // set rider's api user $rider->setAPIUser($api_user); From fc513a973b0e0a47092851a775f46d1def32d369 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 21 Aug 2021 15:23:46 +0800 Subject: [PATCH 30/37] Fix rider api user command to only create an api user for riders without it #617 --- src/Command/CreateRiderAPIUserCommand.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Command/CreateRiderAPIUserCommand.php b/src/Command/CreateRiderAPIUserCommand.php index 6eefdf12..96508fd8 100644 --- a/src/Command/CreateRiderAPIUserCommand.php +++ b/src/Command/CreateRiderAPIUserCommand.php @@ -53,6 +53,10 @@ class CreateRiderAPIUserCommand extends Command foreach ($riders as $rider) { + // skip riders who already have users + if ($rider->getAPIUser() != null) + continue; + // create api user for each rider // no need to generate the keys. // Secret and API keys are generated in constructor @@ -62,7 +66,7 @@ class CreateRiderAPIUserCommand extends Command $api_user->setEnabled(true); // set name to rider's last name + first name - $rider_name = $rider->getLastName() . '_' . $rider->getFirstName(); + $rider_name = $rider->getFirstName() . ' ' . $rider->getLastName(); $api_user->setName($rider_name); // set rider to api_user From d863158dd68f8a994e95015f5eb2e628859b54c0 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Sat, 21 Aug 2021 09:17:14 +0000 Subject: [PATCH 31/37] Add validation to login. #617 --- src/Controller/CAPI/RiderAppController.php | 56 +++++++--------------- 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/src/Controller/CAPI/RiderAppController.php b/src/Controller/CAPI/RiderAppController.php index 4f3e95e1..f736faeb 100644 --- a/src/Controller/CAPI/RiderAppController.php +++ b/src/Controller/CAPI/RiderAppController.php @@ -125,19 +125,25 @@ class RiderAppController extends APIController RedisClientProvider $redis) { $required_params = [ + 'user', + 'pass', ]; - // TODO: right now, no validation at all. Accept anything. + $missing = $this->checkMissingParameters($req, $required_params); + if (count($missing) > 0) + { + $params = implode(', ', $missing); + return new APIResponse(false, 'Missing parameter(s): ' . $params); + } - - // NOTE: we retain the username and password in rider for backward compatibility + // NOTE: we retain the username and password in rider for backward compatibility // 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 - // NOTE: we use + // NOTE: we use $encoder = $ef->getEncoder(new User()); if (!$encoder->isPasswordValid($rider->getPassword(), $req->request->get('pass'), '')) return new APIResponse(false, 'Invalid username or password.'); @@ -148,37 +154,6 @@ class RiderAppController extends APIController if ($user == null) return new APIResponse(false, 'Rider cannot login, no associated user.'); - - /* - $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); @@ -205,13 +180,14 @@ class RiderAppController extends APIController $em->flush(); + // NOTE; commenting this out since this doesn't seem to be needed. + // this is being set in utils/mqtt_rider_convert/mqtt_rider_convert.py // 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 = $redis->getRedisClient(); + //$redis_key = 'rider.id.' . $rapi_session->getID(); + //$rider_id = $rider->getID(); - $redis_client->set($redis_key, $rider_id); - */ + //$redis_client->set($redis_key, $rider_id); $rider_id = $rider->getID(); From 7cd8f2f027b864d29563c2409c1698819c3ca566 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Sat, 21 Aug 2021 09:41:45 +0000 Subject: [PATCH 32/37] Renamed delivery status for consistency. #617 --- src/Ramcar/DeliveryStatus.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ramcar/DeliveryStatus.php b/src/Ramcar/DeliveryStatus.php index 7d464444..b4d06871 100644 --- a/src/Ramcar/DeliveryStatus.php +++ b/src/Ramcar/DeliveryStatus.php @@ -6,8 +6,8 @@ class DeliveryStatus extends NameValue { const RIDER_ASSIGN = 'rider_assign'; const REQUEUE = 'requeue'; - const RIDER_ACCEPT = 'accept'; - const RIDER_ARRIVE = 'arrive'; + const RIDER_ACCEPT = 'rider_accept'; + const RIDER_ARRIVE = 'rider_arrive'; const RIDER_EDIT = 'rider_edit'; const RIDER_DEPART_HUB = 'rider_depart_hub'; const RIDER_ARRIVE_HUB_PRE_JO = 'rider_arrive_hub_pre_jo'; From cf12d09ee56ca4bd4ad4575aa9ffc32c32d1ac96 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 21 Aug 2021 21:35:52 +0800 Subject: [PATCH 33/37] Shift from using active jo to current jo for rider related stuff #617 --- src/Controller/CAPI/RiderAppController.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Controller/CAPI/RiderAppController.php b/src/Controller/CAPI/RiderAppController.php index f736faeb..20719535 100644 --- a/src/Controller/CAPI/RiderAppController.php +++ b/src/Controller/CAPI/RiderAppController.php @@ -281,7 +281,8 @@ class RiderAppController extends APIController return new APIResponse(false, 'No rider found.'); // do we have a job order? - $jo = $rider->getActiveJobOrder(); + // $jo = $rider->getActiveJobOrder(); + $jo = $rider->getCurrentJobOrder(); if ($jo == null) { $data = [ @@ -1284,7 +1285,8 @@ class RiderAppController extends APIController } // check if we have an active JO - $jo = $rider->getActiveJobOrder(); + // $jo = $rider->getActiveJobOrder(); + $jo = $rider->getCurrentJobOrder(); if ($jo == null) { $msg = 'No active job order.'; @@ -1306,5 +1308,4 @@ class RiderAppController extends APIController $all = $req->request->all(); error_log(print_r($all, true)); } - } From b4337227645a781b8b868f3a37e0af36ee9f00c0 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 22 Aug 2021 00:32:09 +0800 Subject: [PATCH 34/37] Change mqtt channel for rider app #617 --- src/Service/MQTTClient.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Service/MQTTClient.php b/src/Service/MQTTClient.php index c9c7a4f2..13c884a0 100644 --- a/src/Service/MQTTClient.php +++ b/src/Service/MQTTClient.php @@ -72,6 +72,8 @@ class MQTTClient if ($rider == null) return; + /* + // NOTE: this is for the old rider app // check if rider has sessions $sessions = $rider->getSessions(); if (count($sessions) == 0) @@ -84,5 +86,9 @@ class MQTTClient $channel = self::RIDER_PREFIX . $sess_id; $this->publish($channel, json_encode($payload)); } + */ + + // NOTE: this is for the new rider app + $this->publish('rider/' . $rider->getID(), json_encode($payload)); } } From 473ace4f230a4d03eecadea20a87e373743ebfdb Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 23 Aug 2021 06:42:52 +0000 Subject: [PATCH 35/37] Separate setting of delivery status from calling cancel on JO when cancelling a JO. #617 --- src/Service/JobOrderHandler/ResqJobOrderHandler.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index c0aa528b..dc86ac9a 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -1145,9 +1145,11 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface throw new NotFoundHttpException('The item does not exist'); $cancel_reason = $req->request->get('cancel_reason'); - error_log($cancel_reason); - $obj->cancel($cancel_reason) - ->setDeliveryStatus(DeliveryStatus::CANCELLED); + //error_log('cancel_reason ' . $cancel_reason); + + $obj->setDeliveryStatus(DeliveryStatus::CANCELLED); + + $obj->cancel($cancel_reason); // the event $event = new JOEvent(); From 7a57ce0fac3b1cd73fc1e9f7e31c9c4eca4a6404 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 23 Aug 2021 07:53:47 +0000 Subject: [PATCH 36/37] Fix not sending of rider event. #617 --- src/Service/JobOrderHandler/ResqJobOrderHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index dc86ac9a..3909a23d 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -953,7 +953,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface if (empty($error_array)) { // set rider unavailable - $rider->setAvailable(false); + // $rider->setAvailable(false); // the event $event = new JOEvent(); From 940329de2827ff85348ffdd5b41f4ea813e25d26 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 23 Aug 2021 08:51:12 +0000 Subject: [PATCH 37/37] Set rider's current job order and availability status when reassigning job order. #617 --- src/Controller/APIController.php | 8 +++++++- .../JobOrderHandler/ResqJobOrderHandler.php | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 6c080a6d..caea00c3 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -1062,6 +1062,7 @@ class APIController extends Controller implements LoggedController // find nearest hubs $nearest_hubs = $hub_select->find($hub_criteria); + $assigned_rider = null; if (!empty($nearest_hubs)) { // go through the hub list, find the nearest hub @@ -1072,7 +1073,6 @@ class APIController extends Controller implements LoggedController $available_riders = $nearest_hub['hub']->getAvailableRiders(); if (count($available_riders) >= 1) { - $assigned_rider = null; if (count($available_riders) == 1) { $assigned_rider = $available_riders[0]; @@ -1098,6 +1098,9 @@ class APIController extends Controller implements LoggedController $assigned_rider->setAvailable(false); + // set rider's current job order + $assigned_rider->setCurrentJobOrder($jo); + // update redis hub_jo_count for hub $hub_dist->incrementJoCountForHub($nearest_hub['hub']); @@ -2952,6 +2955,9 @@ class APIController extends Controller implements LoggedController $assigned_rider->setAvailable(false); + // set rider's current job order + $assigned_rider->setCurrentJobOrder($jo); + // update redis hub_jo_count for hub $hub_dist->incrementJoCountForHub($nearest_hub['hub']); diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 3909a23d..4a98b490 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -955,6 +955,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // set rider unavailable // $rider->setAvailable(false); + // set rider's current job order + $rider->setCurrentJobOrder($obj); + // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) @@ -1470,6 +1473,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ]; $mclient->sendRiderEvent($obj, $rider_payload); + // need to unset first rider's current job order + $old_rider = $obj->getRider(); + $old_rider->setCurrentJobOrder(); + + // set available flag for first rider + $old_rider->setAvailable(true); + // coordinates $point = new Point($req->request->get('coord_lng'), $req->request->get('coord_lat')); @@ -1512,6 +1522,12 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // check if any errors were found if (empty($error_array)) { + // set new rider's current job order + $rider->setCurrentJobOrder($obj); + + // set new rider's availability to false + $rider->setAvailable(false); + // add event $event = new JOEvent(); $event->setDateHappen(new DateTime())