From 40c629eee30769684114b1986883858f94442666 Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Sat, 24 Aug 2024 18:00:38 +0800 Subject: [PATCH] Add endpoint for activating a subscription #799 --- .../CustomerAppAPI/SubscriptionController.php | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/src/Controller/CustomerAppAPI/SubscriptionController.php b/src/Controller/CustomerAppAPI/SubscriptionController.php index 290ea43a..f178c840 100644 --- a/src/Controller/CustomerAppAPI/SubscriptionController.php +++ b/src/Controller/CustomerAppAPI/SubscriptionController.php @@ -7,6 +7,11 @@ use Catalyst\ApiBundle\Component\Response as ApiResponse; use App\Service\PayMongoConnector; use App\Entity\Vehicle; +use App\Entity\Subscription; +use App\Entity\CustomerVehicle; +use App\Ramcar\SubscriptionStatus; + +use DateTime; class SubscriptionController extends ApiController { @@ -66,6 +71,7 @@ class SubscriptionController extends ApiController // check requirements $validity = $this->validateRequest($req, [ 'plan_id', + 'cv_id', ]); if (!$validity['is_valid']) { @@ -78,6 +84,19 @@ class SubscriptionController extends ApiController return new ApiResponse(false, 'No customer information found.'); } + // get customer vehicle + $cv = $this->em->getRepository(CustomerVehicle::class)->find($req->request->get('cv_id')); + + // check if it exists + if ($cv == null) { + return new ApiResponse(false, 'Vehicle does not exist.'); + } + + // check if it's owned by customer + if ($cv->getCustomer()->getID() != $cust->getID()) { + return new ApiResponse(false, 'Invalid vehicle.'); + } + // initialize paymongo connector $this->initializeSubscriptionPayMongoConnector($pm); @@ -109,9 +128,20 @@ class SubscriptionController extends ApiController return new ApiResponse(false, 'Error retrieving payment intent. Please try again later.'); } + // create subscription entity + $obj = new Subscription(); + $obj->setCustomer($cust) + ->setCustomerVehicle($cv) + ->setStatus(SubscriptionStatus::PENDING) + ->setExtApiId($pm_sub['response']['data']['id']) + ->setMetadata($pm_sub['response']['data']); + + $this->em->persist($obj); + $this->em->flush(); + // response return new ApiResponse(true, '', [ - //'subscription_id' => $pm_sub['response']['data']['id'], + 'subscription_id' => $obj->getID(), 'payment_intent_id' => $pi['response']['data']['id'], 'payment_intent_client_key' => $pi['response']['data']['attributes']['client_key'], 'paymongo_public_key' => $this->getParameter('subscription_paymongo_public_key'), @@ -141,4 +171,39 @@ class SubscriptionController extends ApiController 'payment_intent' => $pi['response']['data'], ]); } + + public function setSubscriptionAsPaid(Request $req, $sub_id, PayMongoConnector $pm) + { + // check requirements + $validity = $this->validateRequest($req); + + if (!$validity['is_valid']) { + return new ApiResponse(false, $validity['error']); + } + + // initialize paymongo connector + $this->initializeSubscriptionPayMongoConnector($pm); + + // get subscription + $obj = $this->em->getRepository(Subscription::class)->findOneBy([ + 'id' => $sub_id, + 'status' => SubscriptionStatus::PENDING, + 'customer' => $this->session->getCustomer(), + ]); + + if (empty($obj)) { + return new ApiResponse(false, 'Invalid subscription provided.'); + } + + // mark subscription as paid + $obj->setStatus(SubscriptionStatus::ACTIVE) + ->setDateStart(new DateTime()); + + $this->em->flush(); + + // response + return new ApiResponse(true, '', [ + 'success' => true, + ]); + } }