Added get all speakers endpoint

Added new endpoint to get all speakers
without filtering by summit

Change-Id: If803cc7801e2a66dc97f2820788272c736b93401
This commit is contained in:
Sebastian Marcet 2017-11-24 10:56:26 -03:00
parent 702e3d0a34
commit 412c5d63cf
5 changed files with 236 additions and 0 deletions

View File

@ -155,6 +155,77 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
}
}
public function getAllSpeakers(){
try {
$values = Input::all();
$rules = array
(
'page' => 'integer|min:1',
'per_page' => 'required_with:page|integer|min:10|max:100',
);
$validation = Validator::make($values, $rules);
if ($validation->fails())
{
$messages = $validation->messages()->toArray();
return $this->error412($messages);
}
// default values
$page = 1;
$per_page = 10;
if (Input::has('page'))
{
$page = intval(Input::get('page'));
$per_page = intval(Input::get('per_page'));
}
$filter = null;
if (Input::has('filter'))
{
$filter = FilterParser::parse(Input::get('filter'), array
(
'first_name' => array('=@', '=='),
'last_name' => array('=@', '=='),
'email' => array('=@', '=='),
));
}
$order = null;
if (Input::has('order'))
{
$order = OrderParser::parse(Input::get('order'), array
(
'first_name',
'last_name',
));
}
$result = $this->speaker_repository->getAllByPage(new PagingInfo($page, $per_page), $filter, $order);
return $this->ok
(
$result->toArray(Request::input('expand', ''),[],[])
);
}
catch(FilterParserException $ex1){
Log::warning($ex1);
return $this->error412($ex1->getMessages());
}
catch (Exception $ex)
{
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $speaker_id

View File

@ -283,6 +283,12 @@ Route::group([
});
});
// speakers
Route::group(array('prefix' => 'speakers'), function () {
Route::get('', 'OAuth2SummitSpeakersApiController@getAllSpeakers');
});
});
//OAuth2 Protected API V2

View File

@ -222,6 +222,132 @@ SQL;
return new PagingResponse($total, $paging_info->getPerPage(), $paging_info->getCurrentPage(), $last_page, $speakers);
}
/**
* @param PagingInfo $paging_info
* @param Filter|null $filter
* @param Order|null $order
* @return PagingResponse
*/
public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Order $order = null)
{
$extra_filters = '';
$extra_orders = '';
$bindings = [];
if(!is_null($filter))
{
$where_conditions = $filter->toRawSQL([
'first_name' => 'FirstName',
'last_name' => 'LastName',
'email' => 'Email',
]);
if(!empty($where_conditions)) {
$extra_filters = " WHERE {$where_conditions}";
$bindings = array_merge($bindings, $filter->getSQLBindings());
}
}
if(!is_null($order))
{
$extra_orders = $order->toRawSQL(array
(
'first_name' => 'FirstName',
'last_name' => 'LastName',
));
}
$query_count = <<<SQL
SELECT COUNT(DISTINCT(ID)) AS QTY
FROM (
SELECT S.ID,
IFNULL(M.FirstName, S.FirstName) AS FirstName,
IFNULL(M.Surname,S.LastName) AS LastName,
IFNULL(M.Email,R.Email) AS Email
FROM PresentationSpeaker S
LEFT JOIN Member M ON M.ID = S.MemberID
LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID
)
SUMMIT_SPEAKERS
{$extra_filters}
SQL;
$stm = $this->_em->getConnection()->executeQuery($query_count, $bindings);
$total = intval($stm->fetchColumn(0));
$bindings = array_merge( $bindings, array
(
'per_page' => $paging_info->getPerPage(),
'offset' => $paging_info->getOffset(),
));
$query = <<<SQL
SELECT *
FROM (
SELECT
S.ID,
S.ClassName,
S.Created,
S.LastEdited,
S.Title AS SpeakerTitle,
S.Bio,
S.IRCHandle,
S.AvailableForBureau,
S.FundedTravel,
S.Country,
S.MemberID,
S.WillingToTravel,
S.WillingToPresentVideo,
S.Notes,
S.TwitterName,
IFNULL(M.FirstName, S.FirstName) AS FirstName,
IFNULL(M.Surname,S.LastName) AS LastName,
IFNULL(M.Email,R.Email) AS Email,
S.PhotoID
FROM PresentationSpeaker S
LEFT JOIN Member M ON M.ID = S.MemberID
LEFT JOIN File F ON F.ID = S.PhotoID
LEFT JOIN SpeakerRegistrationRequest R ON R.SpeakerID = S.ID
)
SUMMIT_SPEAKERS
{$extra_filters} {$extra_orders} limit :per_page offset :offset;
SQL;
/*$rsm = new ResultSetMapping();
$rsm->addEntityResult(\models\summit\PresentationSpeaker::class, 's');
$rsm->addJoinedEntityResult(\models\main\File::class,'p', 's', 'photo');
$rsm->addJoinedEntityResult(\models\main\Member::class,'m', 's', 'member');
$rsm->addFieldResult('s', 'ID', 'id');
$rsm->addFieldResult('s', 'FirstName', 'first_name');
$rsm->addFieldResult('s', 'LastName', 'last_name');
$rsm->addFieldResult('s', 'Bio', 'last_name');
$rsm->addFieldResult('s', 'SpeakerTitle', 'title' );
$rsm->addFieldResult('p', 'PhotoID', 'id');
$rsm->addFieldResult('p', 'PhotoTitle', 'title');
$rsm->addFieldResult('p', 'PhotoFileName', 'filename');
$rsm->addFieldResult('p', 'PhotoName', 'name');
$rsm->addFieldResult('m', 'MemberID', 'id');*/
$rsm = new ResultSetMappingBuilder($this->_em);
$rsm->addRootEntityFromClassMetadata(\models\summit\PresentationSpeaker::class, 's', ['Title' => 'SpeakerTitle']);
// build rsm here
$native_query = $this->_em->createNativeQuery($query, $rsm);
foreach($bindings as $k => $v)
$native_query->setParameter($k, $v);
$speakers = $native_query->getResult();
$last_page = (int) ceil($total / $paging_info->getPerPage());
return new PagingResponse($total, $paging_info->getPerPage(), $paging_info->getCurrentPage(), $last_page, $speakers);
}
/**
* @return string
*/

View File

@ -139,6 +139,12 @@ class ApiEndpointsSeeder extends Seeder
'http_method' => 'GET',
'scopes' => [sprintf('%s/summits/read', $current_realm)],
),
array(
'name' => 'get-all-speakers',
'route' => '/api/v1/speakers',
'http_method' => 'GET',
'scopes' => [sprintf('%s/summits/read', $current_realm)],
),
array(
'name' => 'get-speaker',
'route' => '/api/v1/summits/{id}/speakers/{speaker_id}',

View File

@ -211,6 +211,33 @@ final class OAuth2SummitApiTest extends ProtectedApiTest
$this->assertTrue(!is_null($speakers));
}
public function testAllSpeakers()
{
$params = [
'page' => 1,
'per_page' => 15,
'filter' => 'first_name=@John,last_name=@Bryce,email=@sebastian@',
'order' => '+first_name,-last_name'
];
$headers = array("HTTP_Authorization" => " Bearer " . $this->access_token);
$response = $this->action(
"GET",
"OAuth2SummitSpeakersApiController@getAllSpeakers",
$params,
array(),
array(),
array(),
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(200);
$speakers = json_decode($content);
$this->assertTrue(!is_null($speakers));
}
public function testCurrentSummitMyAttendeeFail404()
{
App::singleton('App\Models\ResourceServer\IAccessTokenService', 'AccessTokenServiceStub2');