Added get all speakers endpoint
Added new endpoint to get all speakers without filtering by summit Change-Id: If803cc7801e2a66dc97f2820788272c736b93401
This commit is contained in:
parent
702e3d0a34
commit
412c5d63cf
|
@ -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
|
||||
|
|
|
@ -283,6 +283,12 @@ Route::group([
|
|||
|
||||
});
|
||||
});
|
||||
|
||||
// speakers
|
||||
|
||||
Route::group(array('prefix' => 'speakers'), function () {
|
||||
Route::get('', 'OAuth2SummitSpeakersApiController@getAllSpeakers');
|
||||
});
|
||||
});
|
||||
|
||||
//OAuth2 Protected API V2
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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}',
|
||||
|
|
|
@ -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');
|
||||
|
|
Loading…
Reference in New Issue