Refactor API controller for ease of use

This commit is contained in:
Kendrick Chan 2018-01-28 13:38:06 +08:00
parent f7c9931d9f
commit e56929dbcc
2 changed files with 57 additions and 49 deletions

View file

@ -2,13 +2,12 @@
namespace App\Controller; namespace App\Controller;
use App\Ramcar\BaseController;
use Doctrine\ORM\Query; use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Doctrine\DBAL\DBALException; use Doctrine\DBAL\DBALException;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\Ramcar\APIResult; use App\Ramcar\APIResult;
use App\Entity\MobileSession; use App\Entity\MobileSession;
@ -16,8 +15,15 @@ use App\Entity\MobileSession;
use DateTime; use DateTime;
class APIController extends BaseController class APIController extends Controller
{ {
protected $session;
public function __construct()
{
$this->session = null;
}
protected function checkMissingParameters(Request $req, $params = []) protected function checkMissingParameters(Request $req, $params = [])
{ {
$missing = []; $missing = [];
@ -44,16 +50,50 @@ class APIController extends BaseController
return $missing; return $missing;
} }
// TODO: type hint entity manager
protected function checkAPIKey($em, $api_key) protected function checkAPIKey($em, $api_key)
{ {
// find the api key (session id) // find the api key (session id)
$session = $em->getRepository(MobileSession::class)->find($api_key); $session = $em->getRepository(MobileSession::class)->find($api_key);
if ($session == null) if ($session == null)
return false; return null;
return $session; return $session;
} }
protected function checkParamsAndKey(Request $req, $em, $params)
{
// returns APIResult object
$res = new APIResult();
// inject api_key in params
$params[] = 'api_key';
// check missing parameters
$missing = $this->checkMissingParameters($req, $params);
if (count($missing) > 0)
{
$miss_string = implode(', ', $missing);
$res->setError(true)
->setErrorMessage('Missing parameter(s): ' . $miss_string);
return $res;
}
// check api key
$sess = $this->checkAPIKey($em, $req->request->get('api_key'));
if ($sess == null)
{
$res->setError(true)
->setErrorMessage('Invalid API Key');
return $res;
}
// store session
$this->session = $sess;
return $res;
}
public function register(Request $req) public function register(Request $req)
{ {
$res = new APIResult(); $res = new APIResult();
@ -70,7 +110,7 @@ class APIController extends BaseController
if (count($missing) > 0) if (count($missing) > 0)
{ {
$params = implode(', ', $missing); $params = implode(', ', $missing);
$res->setErrorFlag(true) $res->setError(true)
->setErrorMessage('Missing parameter(s): ' . $params); ->setErrorMessage('Missing parameter(s): ' . $params);
return $this->json($res->getReturnResponse()); return $this->json($res->getReturnResponse());
} }
@ -126,33 +166,16 @@ class APIController extends BaseController
public function confirmNumber(Request $req) public function confirmNumber(Request $req)
{ {
$res = new APIResult();
// check parameters // check parameters
$required_params = [ $required_params = [
'api_key',
'phone_number', 'phone_number',
]; ];
$missing = $this->checkMissingParameters($req, $required_params); // check required parameters and api key
if (count($missing) > 0)
{
$params = implode(', ', $missing);
$res->setErrorFlag(true)
->setErrorMessage('Missing parameter(s): ' . $params);
return $this->json($res->getReturnResponse());
}
// check api key
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$sess = $this->checkAPIKey($em, $req->request->get('api_key')); $res = $this->checkParamsAndKey($req, $em, $required_params);
if (!$sess) if ($res->isError())
{
$res->setErrorFlag(true)
->setErrorMessage('Invalid API Key');
return $this->json($res->getReturnResponse()); return $this->json($res->getReturnResponse());
}
// phone number // phone number
$phone_number = $req->request->get('phone_number'); $phone_number = $req->request->get('phone_number');
@ -162,7 +185,7 @@ class APIController extends BaseController
// TODO: generate code and save // TODO: generate code and save
// use '123456' for now // use '123456' for now
$code = '123456'; $code = '123456';
$sess->setConfirmCode($code) $this->session->setConfirmCode($code)
->setPhoneNumber($phone_number); ->setPhoneNumber($phone_number);
$em->flush(); $em->flush();
@ -178,42 +201,27 @@ class APIController extends BaseController
// check parameters // check parameters
$required_params = [ $required_params = [
'api_key',
'code', 'code',
]; ];
$missing = $this->checkMissingParameters($req, $required_params); // check required parameters and api key
if (count($missing) > 0)
{
$params = implode(', ', $missing);
$res->setErrorFlag(true)
->setErrorMessage('Missing parameter(s): ' . $params);
return $this->json($res->getReturnResponse());
}
// check api key
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$sess = $this->checkAPIKey($em, $req->request->get('api_key')); $res = $this->checkParamsAndKey($req, $em, $required_params);
if (!$sess) if ($res->isError())
{
$res->setErrorFlag(true)
->setErrorMessage('Invalid API Key');
return $this->json($res->getReturnResponse()); return $this->json($res->getReturnResponse());
}
$code = $req->request->get('code');
// code is wrong // code is wrong
if ($sess->getConfirmCode() != $code) $code = $req->request->get('code');
if ($this->session->getConfirmCode() != $code)
{ {
$res->setErrorFlag(true) $res->setError(true)
->setErrorMessage('Wrong confirm code'); ->setErrorMessage('Wrong confirm code');
return $this->json($res->getReturnResponse()); return $this->json($res->getReturnResponse());
} }
// set confirm date // set confirm date
$date = new DateTime(); $date = new DateTime();
$sess->setDateConfirmed($date) $this->session->setDateConfirmed($date)
->setConfirmed(); ->setConfirmed();
$em->flush(); $em->flush();

View file

@ -15,7 +15,7 @@ class APIResult
$this->data = []; $this->data = [];
} }
public function setErrorFlag($flag = true) public function setError($flag = true)
{ {
$this->err_flag = $flag; $this->err_flag = $flag;
return $this; return $this;