Finish warranty api calls #164

This commit is contained in:
Kendrick Chan 2018-10-26 00:58:32 +08:00
parent 9fcae0f05b
commit 4867f1b6bb
5 changed files with 281 additions and 29 deletions

View file

@ -42,18 +42,26 @@ class TestCommand extends Command
// TODO: shift this out of the bundle, since it's project specific // TODO: shift this out of the bundle, since it's project specific
// warranty register // warranty register
$params = [ $params = [
'serial' => 'LJ34LJADR12SDLKJL',
'plate_number' => 'XEN918',
'warranty_class' => 'private',
'date_purchase' => '20181001',
'date_expire' => '20191001',
]; ];
$api->post('/capi/warranty', $params); $api->post('/capi/warranty', $params);
// warranty find // warranty find
$api->get('/capi/warranty/LJ34LJADR12SDLKJL'); $api->get('/capi/warranty/LJ34LJADR12SDLKJL');
// warranty claim
$api->post('/capi/warranty/LJ34LJADR12SDLKJL/claim');
// battery // battery
$api->get('/capi/battery_models'); // $api->get('/capi/battery_models');
$api->get('/capi/battery_sizes'); // $api->get('/capi/battery_sizes');
// vehicle // vehicle
$api->get('/capi/vehicle_manufacturers'); // $api->get('/capi/vehicle_manufacturers');
$api->get('/capi/vehicles'); // $api->get('/capi/vehicles');
} }
} }

View file

@ -48,7 +48,7 @@ capi_warranty_register:
# claim warranty # claim warranty
capi_warranty_claim: capi_warranty_claim:
path: /capi/warranty/{serial} path: /capi/warranty/{serial}/claim
controller: App\Controller\CAPI\WarrantyController::claim controller: App\Controller\CAPI\WarrantyController::claim
methods: [POST] methods: [POST]

View file

@ -6,18 +6,76 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\Query; use Doctrine\ORM\Query;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Catalyst\APIBundle\Controller\APIController; use Catalyst\APIBundle\Controller\APIController;
use Catalyst\APIBundle\Response\APIResponse; use Catalyst\APIBundle\Response\APIResponse;
use App\Entity\Warranty; use App\Entity\Warranty;
use App\Ramcar\NameValue;
use App\Ramcar\WarrantyClass;
use App\Ramcar\WarrantyStatus;
use DateTime; use DateTime;
class WarrantyController extends Controller implements APIController class WarrantyController extends Controller implements APIController
{ {
protected function checkRequiredParameters(Request $req, $params = [])
{
$missing = [];
// check if parameters are there
foreach ($params as $param)
{
if ($req->getMethod() == 'GET')
{
$check = $req->query->get($param);
if (empty($check))
$missing[] = $param;
}
// else if ($req->getMethod() == 'POST')
else
{
$check = $req->request->get($param);
if (empty($check))
$missing[] = $param;
}
}
// check missing parameters
if (count($missing) > 0)
{
$miss_string = implode(', ', $missing);
return 'Missing required parameter(s): ' . $miss_string;
}
return false;
}
protected function cleanSerial($serial) protected function cleanSerial($serial)
{ {
return trim(strtoupper($serial)); return trim(strtoupper($serial));
} }
protected function generateWarrantyData(Warranty $warr)
{
$data = [
'id' => (int) $warr->getID(),
'serial' => (string) $warr->getSerial(),
'warranty_class' => (string) $warr->getWarrantyClass(),
'plate_number' => (string) $warr->getPlateNumber(),
'status' => (string) $warr->getStatus(),
'date_create' => (string) $warr->getDateCreate()->format('YmdHis'),
'date_purchase' => (string) $warr->getDatePurchase()->format('Ymd'),
'date_expire' => (string) $warr->getDateExpire()->format('Ymd'),
];
$date_claim = $warr->getDateClaim();
if ($date_claim == null)
$data['date_claim'] = null;
else
$data['date_claim'] = (string) $warr->getDateClaim()->format('Ymd');
return $data;
}
public function find($serial, EntityManagerInterface $em) public function find($serial, EntityManagerInterface $em)
{ {
$clean_serial = $this->cleanSerial($serial); $clean_serial = $this->cleanSerial($serial);
@ -28,12 +86,7 @@ class WarrantyController extends Controller implements APIController
$data = [ $data = [
'warranty' => [ 'warranty' => $this->generateWarrantyData($warr),
'id' => (int) $warr->getID(),
'serial' => (string) $warr->getSerial(),
'date_create' => (string) $warr->getDateCreate()->format('YmdHis'),
'date_expire' => (string) $warr->getDateExpire()->format('Ymd'),
],
]; ];
return new APIResponse(true, 'Warranty found.', $data); return new APIResponse(true, 'Warranty found.', $data);
@ -42,44 +95,91 @@ class WarrantyController extends Controller implements APIController
public function register(Request $req, EntityManagerInterface $em) public function register(Request $req, EntityManagerInterface $em)
{ {
// required parameters // required parameters
$params = [
'serial',
'warranty_class',
'plate_number',
'date_expire',
'date_purchase',
];
$msg = $this->checkRequiredParameters($req, $params);
error_log('msg - ' . $msg);
if ($msg)
return new APIResponse(false, $msg);
$serial = $req->request->get('serial'); $serial = $req->request->get('serial');
$date_expire_string = $req->request->get('date_expire'); $date_expire_string = $req->request->get('date_expire');
$date_pur_string = $req->request->get('date_purchase');
$warr_class = $req->request->get('warranty_class');
$plate = $req->request->get('plate_number');
// missing serial // wrong date expire format
if ($serial == null)
return new APIResponse(false, 'Required parameter missing: serial.');
// missing date expire
if ($date_expire_string == null)
return new APIResponse(false, 'Required parameter missing: date_expire.');
// wrong date format
$date_expire = DateTime::createFromFormat('Ymd', $date_expire_string); $date_expire = DateTime::createFromFormat('Ymd', $date_expire_string);
if ($date_expire === false) if ($date_expire === false)
return new APIResponse(false, 'Wrong date format: date_expire.'); return new APIResponse(false, 'Wrong date format: date_expire.');
// wrong date purchase format
$date_pur = DateTime::createFromFormat('Ymd', $date_pur_string);
if ($date_pur === false)
return new APIResponse(false, 'Wrong date format: date_purchase.');
// valid warranty class
if (!WarrantyClass::validate($warr_class))
return new APIResponse(false, 'Invalid warranty class.');
// plate number
$plate = Warranty::cleanPlateNumber($plate);
if (!$plate)
return new APIResponse(false, 'Invalid plate number.');
// warranty // warranty
$warr = new Warranty(); $warr = new Warranty();
$warr->setSerial($serial) $warr->setSerial($serial)
->setWarrantyClass($warr_class)
->setPlateNumber($plate)
->setDatePurchase($date_pur)
->setDateClaim(null)
->setDateExpire($date_expire); ->setDateExpire($date_expire);
$em->persist($warr); try
$em->flush(); {
$em->persist($warr);
$em->flush();
}
catch (UniqueConstraintViolationException $e)
{
return new APIResponse(false, 'Duplicate serial encountered.');
}
// data // data
$data = [ $data = [
'warranty' => [ 'warranty' => $this->generateWarrantyData($warr),
'id' => (int) $warr->getID(),
'serial' => (string) $warr->getSerial(),
'date_create' => (string) $warr->getDateCreate(),
'date_expire' => (string) $warr->getDateExpire(),
],
]; ];
return new APIResponse(true, 'Warranty registered.', $data); return new APIResponse(true, 'Warranty registered.', $data);
} }
public function claim($serial) public function claim(Request $req, EntityManagerInterface $em, $serial)
{ {
$clean_serial = $this->cleanSerial($serial);
$warr = $em->getRepository(Warranty::class)->findOneBy(['serial' => $clean_serial]);
// no warranty
if ($warr == null)
return new APIResponse(false, 'No warranty found with that serial number.', null, 404);
// warranty is not active
if (!$warr->canClaim())
return new APIResponse(false, 'Warranty is not active.');
// set status to claim
$warr->setStatus(WarrantyStatus::CLAIMED)
->setDateClaim(new DateTime());
$em->flush();
// TODO: claim log
return new APIResponse(true, 'Warranty claimed successfully.');
} }
} }

View file

@ -3,7 +3,10 @@
namespace App\Entity; namespace App\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use App\Ramcar\WarrantyClass;
use App\Ramcar\WarrantyStatus;
use DateTime; use DateTime;
use Exception;
/** /**
* @ORM\Entity * @ORM\Entity
@ -30,21 +33,54 @@ class Warranty
*/ */
protected $serial; protected $serial;
// warranty class
/**
* @ORM\Column(type="string", length=25)
*/
protected $warranty_class;
// plate
/**
* @ORM\Column(type="string", length=10)
*/
protected $plate_number;
// status
/**
* @ORM\Column(type="string", length=25)
*/
protected $status;
// date created // date created
/** /**
* @ORM\Column(type="datetime") * @ORM\Column(type="datetime")
*/ */
protected $date_create; protected $date_create;
// date purchased
/**
* @ORM\Column(type="date")
*/
protected $date_purchase;
// date expires // date expires
/** /**
* @ORM\Column(type="date") * @ORM\Column(type="date")
*/ */
protected $date_expire; protected $date_expire;
// date claimed
/**
* @ORM\Column(type="date", nullable=true)
*/
protected $date_claim;
public function __construct() public function __construct()
{ {
$this->date_create = new DateTime(); $this->date_create = new DateTime();
$this->warranty_class = WarrantyClass::WTY_PRIVATE;
$this->status = WarrantyStatus::ACTIVE;
$this->date_claim = null;
} }
public function getID() public function getID()
@ -63,11 +99,79 @@ class Warranty
return $this->serial; return $this->serial;
} }
public function setWarrantyClass($class)
{
$this->warranty_class = $class;
return $this;
}
public function getWarrantyClass()
{
return $this->warranty_class;
}
// TODO: use a service to handle plate number filtering
public static function cleanPlateNumber($plate)
{
// trim and make upper case
$clean_plate = strtoupper(trim($plate));
// remove invalid characters
$clean_plate = preg_replace("/[^A-Z0-9]/", '', $clean_plate);
// check if format is correct
// AAA123 or AAA1234
$res = preg_match("/^[A-Z]{3}[0-9]{3,4}$/", $clean_plate);
if ($res)
return $clean_plate;
return false;
}
public function setPlateNumber($plate)
{
// TODO: custom exception
$plate_number = $this->cleanPlateNumber($plate);
if (!$plate_number)
throw new Exception('Invalid plate number.');
$this->plate_number = $plate_number;
return $this;
}
public function getPlateNumber()
{
return $this->plate_number;
}
public function setStatus($status)
{
$this->status = $status;
return $this;
}
public function getStatus()
{
return $this->status;
}
public function getDateCreate() public function getDateCreate()
{ {
return $this->date_create; return $this->date_create;
} }
public function setDatePurchase(DateTime $date)
{
$this->date_purchase = $date;
return $this;
}
public function getDatePurchase()
{
return $this->date_purchase;
}
public function setDateExpire(DateTime $date) public function setDateExpire(DateTime $date)
{ {
$this->date_expire = $date; $this->date_expire = $date;
@ -78,4 +182,26 @@ class Warranty
{ {
return $this->date_expire; return $this->date_expire;
} }
public function setDateClaim(DateTime $date = null)
{
$this->date_claim = $date;
return $this;
}
public function getDateClaim()
{
return $this->date_claim;
}
public function canClaim()
{
if ($this->status == WarrantyStatus::ACTIVE)
return true;
if ($this->status == WarrantyStatus::CLAIMED)
return true;
return false;
}
} }

View file

@ -0,0 +1,18 @@
<?php
namespace App\Ramcar;
class WarrantyStatus extends NameValue
{
const ACTIVE = 'active';
const EXPIRED = 'expired';
const CLAIMED = 'claimed';
const CANCELLED = 'cancelled';
const COLLECTION = [
'active' => 'Active',
'expired' => 'Expired',
'claimed' => 'Claimed',
'cancelled' => 'Cancelled',
];
}