diff --git a/app/Http/Controllers/apis/protected/summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/apis/protected/summit/OAuth2SummitLocationsApiController.php index 1bdc19c7..5053d0a1 100644 --- a/app/Http/Controllers/apis/protected/summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/apis/protected/summit/OAuth2SummitLocationsApiController.php @@ -29,6 +29,7 @@ use services\model\ISummitService; use utils\Filter; use utils\FilterParser; use utils\FilterParserException; +use utils\OrderParser; use utils\PagingInfo; use utils\PagingResponse; @@ -162,6 +163,7 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController } $filter = null; + if (Input::has('filter')) { $filter = FilterParser::parse(Input::get('filter'), array ( @@ -176,6 +178,20 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController )); } + $order = null; + + if (Input::has('order')) + { + $order = OrderParser::parse(Input::get('order'), array + ( + 'title', + 'start_date', + 'end_date', + 'id', + 'created', + )); + } + if(is_null($filter)) $filter = new Filter(); $filter->addFilterCondition(FilterParser::buildFilter('location_id','==', $location_id)); @@ -185,7 +201,7 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController $filter->addFilterCondition(FilterParser::buildFilter('published','==', 1)); } - return $this->event_repository->getAllByPage(new PagingInfo($page, $per_page), $filter); + return $this->event_repository->getAllByPage(new PagingInfo($page, $per_page), $filter, $order); } /** diff --git a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsBySummitStrategy.php b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsBySummitStrategy.php index 15958c07..537ec40a 100644 --- a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsBySummitStrategy.php +++ b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsBySummitStrategy.php @@ -20,6 +20,7 @@ use models\summit\ISummitRepository; use models\summit\Summit; use utils\Filter; use utils\FilterParser; +use utils\Order; use utils\PagingInfo; use utils\PagingResponse; @@ -97,11 +98,12 @@ class RetrieveAllSummitEventsBySummitStrategy extends RetrieveSummitEventsStrate /** * @param PagingInfo $paging_info * @param Filter|null $filter + * @param Order|null $order * @return PagingResponse */ - public function retrieveEventsFromSource(PagingInfo $paging_info, Filter $filter = null) + public function retrieveEventsFromSource(PagingInfo $paging_info, Filter $filter = null, Order $order = null) { - return $this->events_repository->getAllByPage($paging_info, $filter); + return $this->events_repository->getAllByPage($paging_info, $filter, $order); } } \ No newline at end of file diff --git a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsStrategy.php b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsStrategy.php index 1f0604a5..cddd5916 100644 --- a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsStrategy.php +++ b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveAllSummitEventsStrategy.php @@ -16,6 +16,7 @@ namespace App\Http\Controllers; use models\summit\ISummitEventRepository; use utils\Filter; +use utils\Order; use utils\PagingInfo; use utils\PagingResponse; @@ -42,11 +43,12 @@ class RetrieveAllSummitEventsStrategy extends RetrieveSummitEventsStrategy /** * @param PagingInfo $paging_info * @param Filter|null $filter + * @param Order|null $order * @return PagingResponse */ - public function retrieveEventsFromSource(PagingInfo $paging_info, Filter $filter = null) + public function retrieveEventsFromSource(PagingInfo $paging_info, Filter $filter = null, Order $order = null) { - return $this->event_repository->getAllByPage($paging_info, $filter); + return $this->event_repository->getAllByPage($paging_info, $filter, $order); } /** diff --git a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrievePublishedSummitEventsBySummitStrategy.php b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrievePublishedSummitEventsBySummitStrategy.php index 5387156f..d6e11aff 100644 --- a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrievePublishedSummitEventsBySummitStrategy.php +++ b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrievePublishedSummitEventsBySummitStrategy.php @@ -40,6 +40,4 @@ final class RetrievePublishedSummitEventsBySummitStrategy extends RetrieveAllSum $filter->addFilterCondition(FilterParser::buildFilter('published','==','1')); return $filter; } - - } \ No newline at end of file diff --git a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveSummitEventsStrategy.php b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveSummitEventsStrategy.php index 27d0eff3..f0f2a59e 100644 --- a/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveSummitEventsStrategy.php +++ b/app/Http/Controllers/apis/protected/summit/strategies/events/RetrieveSummitEventsStrategy.php @@ -13,6 +13,8 @@ **/ use models\exceptions\ValidationException; use utils\Filter; +use utils\Order; +use utils\OrderParser; use utils\PagingResponse; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Input; @@ -59,7 +61,7 @@ abstract class RetrieveSummitEventsStrategy return $this->retrieveEventsFromSource ( - new PagingInfo($page, $per_page), $this->buildFilter() + new PagingInfo($page, $per_page), $this->buildFilter(), $this->buildOrder() ); } @@ -73,12 +75,32 @@ abstract class RetrieveSummitEventsStrategy } return $filter; } + + /** + * @return null|Order + */ + protected function buildOrder(){ + $order = null; + if (Input::has('order')) + { + $order = OrderParser::parse(Input::get('order'), array + ( + 'title', + 'start_date', + 'end_date', + 'id', + 'created', + )); + } + return $order; + } /** * @param PagingInfo $paging_info * @param Filter|null $filter + * @param Order|null $order * @return PagingResponse */ - abstract public function retrieveEventsFromSource(PagingInfo $paging_info, Filter $filter = null); + abstract public function retrieveEventsFromSource(PagingInfo $paging_info, Filter $filter = null, Order $order = null); /** * @return array diff --git a/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php b/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php index 123e0bdf..68432019 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php +++ b/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationMaterial.php @@ -153,7 +153,7 @@ abstract class PresentationMaterial extends SilverstripeBaseModel protected $display_on_site; /** - * @ORM\Column(name="Order", type="integer") + * @ORM\Column(name="`Order`", type="integer") * @var int */ protected $order; diff --git a/app/Models/Foundation/Summit/Events/SummitEvent.php b/app/Models/Foundation/Summit/Events/SummitEvent.php index 7d7c01f4..88566be1 100644 --- a/app/Models/Foundation/Summit/Events/SummitEvent.php +++ b/app/Models/Foundation/Summit/Events/SummitEvent.php @@ -293,7 +293,6 @@ class SummitEvent extends SilverstripeBaseModel */ protected $head_count; - /** * @return bool */ diff --git a/app/Models/Foundation/Summit/Repositories/ISummitEventRepository.php b/app/Models/Foundation/Summit/Repositories/ISummitEventRepository.php index d2895188..a3348093 100644 --- a/app/Models/Foundation/Summit/Repositories/ISummitEventRepository.php +++ b/app/Models/Foundation/Summit/Repositories/ISummitEventRepository.php @@ -14,6 +14,7 @@ use models\utils\IBaseRepository; use utils\Filter; +use utils\Order; use utils\PagingInfo; use utils\PagingResponse; @@ -31,10 +32,11 @@ interface ISummitEventRepository extends IBaseRepository /** * @param PagingInfo $paging_info - * @param Filter $filter + * @param Filter|null $filter + * @param Order|null $order * @return PagingResponse */ - public function getAllByPage(PagingInfo $paging_info, Filter $filter); + public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Order $order = null); /** * @param int $event_id diff --git a/app/Repositories/Summit/Doctrine/DoctrineSummitEventRepository.php b/app/Repositories/Summit/Doctrine/DoctrineSummitEventRepository.php index fdec7022..fe42e861 100644 --- a/app/Repositories/Summit/Doctrine/DoctrineSummitEventRepository.php +++ b/app/Repositories/Summit/Doctrine/DoctrineSummitEventRepository.php @@ -19,6 +19,7 @@ use models\summit\SummitEvent; use repositories\SilverStripeDoctrineRepository; use utils\DoctrineJoinFilterMapping; use utils\Filter; +use utils\Order; use utils\PagingInfo; use utils\PagingResponse; use Doctrine\ORM\Query\Expr\Join; @@ -55,10 +56,11 @@ final class DoctrineSummitEventRepository extends SilverStripeDoctrineRepository /** * @param PagingInfo $paging_info - * @param Filter $filter + * @param Filter|null $filter + * @param Order|null $order * @return PagingResponse */ - public function getAllByPage(PagingInfo $paging_info, Filter $filter) + public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Order $order = null) { $class = count($filter->getFilter('speaker')) > 0? \models\summit\Presentation::class : \models\summit\SummitEvent::class; $query = $this->getEntityManager()->createQueryBuilder() @@ -69,7 +71,7 @@ final class DoctrineSummitEventRepository extends SilverStripeDoctrineRepository $filter->apply2Query($query, array ( - 'title' => 'e.title', + 'title' => 'e.title:json_string', 'published' => 'e.published', 'start_date' => 'e.start_date:datetime_epoch', 'end_date' => 'e.end_date:datetime_epoch', @@ -118,9 +120,23 @@ final class DoctrineSummitEventRepository extends SilverStripeDoctrineRepository )); } + if (!is_null($order)) { + + $order->apply2Query($query, array + ( + 'title' => 'e.title', + 'id' => 'e.id', + 'start_date' => 'e.start_date', + 'end_date' => 'e.end_date', + 'created' => 'e.created', + )); + } else { + //default order + $query = $query->addOrderBy("e.start_date",'ASC'); + $query = $query->addOrderBy("e.end_date", 'ASC'); + } + $query= $query - ->addOrderBy("e.start_date",'ASC') - ->addOrderBy("e.end_date", 'ASC') ->setFirstResult($paging_info->getOffset()) ->setMaxResults($paging_info->getPerPage()); diff --git a/tests/OAuth2SummitApiTest.php b/tests/OAuth2SummitApiTest.php index d346a139..eaac4a75 100644 --- a/tests/OAuth2SummitApiTest.php +++ b/tests/OAuth2SummitApiTest.php @@ -1660,8 +1660,8 @@ final class OAuth2SummitApiTest extends ProtectedApiTest { $params = array ( - 'id' => 6, - 'presentation_id' => 6838 + 'id' => 7, + 'presentation_id' => 15404 ); $headers = array @@ -1672,8 +1672,10 @@ final class OAuth2SummitApiTest extends ProtectedApiTest $video_data = array ( - 'you_tube_id' => 'nrGk0AuFd_9', - 'name' => 'Fostering Full Equality, Organized by the Women of OpenStack!', + 'you_tube_id' => 'cpHa7kSOur0', + 'name' => 'test video', + 'description' => 'test video', + 'display_on_site' => true, ); $response = $this->action @@ -1755,4 +1757,75 @@ final class OAuth2SummitApiTest extends ProtectedApiTest $this->assertTrue(!is_null($notifications)); } + public function testGetAllScheduledEvents(){ + + $params = array + ( + 'id' => 7, + 'page' => 1, + 'per_page' => 10, + 'filter' => array + ( + 'title=@Lightning', + ), + ); + + $headers = array + ( + "HTTP_Authorization" => " Bearer " .$this->access_token, + "CONTENT_TYPE" => "application/json" + ); + + $response = $this->action + ( + "GET", + "OAuth2SummitEventsApiController@getScheduledEvents", + $params, + array(), + array(), + array(), + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + + $events = json_decode($content); + $this->assertTrue(!is_null($events)); + } + + public function testGetAllScheduledEventsUsingOrder(){ + + $params = array + ( + 'id' => 7, + 'page' => 1, + 'per_page' => 5, + 'filter' => '', + 'order' => '+title' + ); + + $headers = array + ( + "HTTP_Authorization" => " Bearer " .$this->access_token, + "CONTENT_TYPE" => "application/json" + ); + + $response = $this->action + ( + "GET", + "OAuth2SummitEventsApiController@getScheduledEvents", + $params, + array(), + array(), + array(), + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + + $events = json_decode($content); + $this->assertTrue(!is_null($events)); + } } \ No newline at end of file