From b76542f7c2de7b838a0367956c37e65cb75052d0 Mon Sep 17 00:00:00 2001 From: smarcet Date: Tue, 9 Mar 2021 09:53:07 -0300 Subject: [PATCH] Fixes on track chairs filters Change-Id: Iac273f90df83f590a9c3a1382ca3c5d7f36ff7f6 Signed-off-by: smarcet --- ...Auth2SummitSelectionPlansApiController.php | 10 +- .../Summit/DoctrineSummitEventRepository.php | 151 +++++++++++-- tests/OAuth2SelectionPlansApiTest.php | 206 +++++++++++++++++- 3 files changed, 337 insertions(+), 30 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php index 29f300bb..d561770d 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php @@ -15,7 +15,6 @@ use App\Models\Exceptions\AuthzException; use App\Models\Foundation\Summit\Repositories\ISummitCategoryChangeRepository; use App\Services\Model\ISummitSelectionPlanService; -use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Request; @@ -27,7 +26,6 @@ use models\summit\ISummitEventRepository; use models\summit\ISummitRepository; use Exception; use ModelSerializers\IPresentationSerializerTypes; -use ModelSerializers\ISerializerTypeSelector; use ModelSerializers\SerializerRegistry; use utils\Filter; use utils\FilterElement; @@ -122,7 +120,7 @@ final class OAuth2SummitSelectionPlansApiController extends OAuth2ProtectedContr try { if (!Request::isJson()) return $this->error400(); - $payload = Input::json()->all(); + $payload = Request::json()->all(); $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -164,7 +162,7 @@ final class OAuth2SummitSelectionPlansApiController extends OAuth2ProtectedContr try { if (!Request::isJson()) return $this->error400(); - $payload = Input::json()->all(); + $payload = Request::json()->all(); $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -389,6 +387,10 @@ final class OAuth2SummitSelectionPlansApiController extends OAuth2ProtectedContr if ($filter instanceof Filter) { $filter->addFilterCondition(FilterElement::makeEqual('summit_id', $summit->getId())); $filter->addFilterCondition(FilterElement::makeEqual('selection_plan_id', $selection_plan_id)); + $current_member = $this->resource_server_context->getCurrentUser(false); + if(!is_null($current_member)) { + $filter->addFilterCondition(FilterElement::makeEqual('current_member_id', $current_member->getId())); + } } return $filter; }, diff --git a/app/Repositories/Summit/DoctrineSummitEventRepository.php b/app/Repositories/Summit/DoctrineSummitEventRepository.php index 888164ee..94131f2c 100644 --- a/app/Repositories/Summit/DoctrineSummitEventRepository.php +++ b/app/Repositories/Summit/DoctrineSummitEventRepository.php @@ -11,28 +11,35 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ + use App\Models\Foundation\Main\IGroup; +use App\Repositories\SilverStripeDoctrineRepository; +use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Tools\Pagination\Paginator; +<<<<<<< HEAD use Illuminate\Support\Facades\App; use models\main\Tag; use models\oauth2\IResourceServerContext; +======= +use Illuminate\Support\Facades\Log; +use models\main\Tag; +>>>>>>> 76f1b0cb... Fixes on track chairs filters use models\summit\ISummitCategoryChangeStatus; use models\summit\ISummitEventRepository; use models\summit\Presentation; use models\summit\Summit; use models\summit\SummitEvent; -use App\Repositories\SilverStripeDoctrineRepository; +use models\summit\SummitGroupEvent; use utils\DoctrineCaseFilterMapping; use utils\DoctrineFilterMapping; use utils\DoctrineJoinFilterMapping; +use utils\DoctrineLeftJoinFilterMapping; use utils\DoctrineSwitchFilterMapping; use utils\Filter; use utils\Order; use utils\PagingInfo; use utils\PagingResponse; -use Doctrine\ORM\Query\Expr\Join; -use utils\DoctrineLeftJoinFilterMapping; -use models\summit\SummitGroupEvent; + /** * Class DoctrineSummitEventRepository * @package App\Repositories\Summit @@ -71,7 +78,7 @@ final class DoctrineSummitEventRepository $idx = 1; foreach(self::$forbidden_classes as $forbidden_class){ $query = $query - ->andWhere("not e INSTANCE OF :forbidden_class".$idx); + ->andWhere("not e INSTANCE OF :forbidden_class".$idx); $query->setParameter("forbidden_class".$idx, $forbidden_class); $idx++; } @@ -172,27 +179,92 @@ final class DoctrineSummitEventRepository "(sprs.name :operator :value)" ), 'selection_status' => new DoctrineSwitchFilterMapping([ - 'selected' => new DoctrineCaseFilterMapping( - 'selected', - "ssp.order is not null and sspl.list_type = 'Group' and sspl.category = e.category" - ), - 'accepted' => new DoctrineCaseFilterMapping( - 'accepted', - "ssp.order is not null and ssp.order <= cc.session_count and sspl.list_type = 'Group' and sspl.list_class = 'Session' and sspl.category = e.category" - ), - 'alternate' => new DoctrineCaseFilterMapping( + 'selected' => new DoctrineCaseFilterMapping( + 'selected', + "ssp.order is not null and sspl.list_type = 'Group' and sspl.category = e.category" + ), + 'accepted' => new DoctrineCaseFilterMapping( + 'accepted', + "ssp.order is not null and ssp.order <= cc.session_count and sspl.list_type = 'Group' and sspl.list_class = 'Session' and sspl.category = e.category" + ), + 'alternate' => new DoctrineCaseFilterMapping( 'alternate', "ssp.order is not null and ssp.order > cc.session_count and sspl.list_type = 'Group' and sspl.list_class = 'Session' and sspl.category = e.category" - ), - 'lightning-accepted' => new DoctrineCaseFilterMapping( + ), + 'lightning-accepted' => new DoctrineCaseFilterMapping( 'lightning-accepted', "ssp.order is not null and ssp.order <= cc.lightning_count and sspl.list_type = 'Group' and sspl.list_class = 'Lightning' and sspl.category = e.category" - ), - 'lightning-alternate' => new DoctrineCaseFilterMapping( + ), + 'lightning-alternate' => new DoctrineCaseFilterMapping( 'lightning-alternate', "ssp.order is not null and ssp.order > cc.lightning_count and sspl.list_type = 'Group' and sspl.list_class = 'Lightning' and sspl.category = e.category" - ), - ] + ), + ] + ), + 'track_chairs_status' => new DoctrineSwitchFilterMapping + ( + [ + 'voted' => new DoctrineCaseFilterMapping( + 'voted', + "exists (select ssp1 from models\summit\SummitSelectedPresentation ssp1 inner join ssp1.presentation p1 where p1.id = p.id)" + ), + 'untouched' => new DoctrineCaseFilterMapping( + 'untouched', + "not exists (select ssp1 from models\summit\SummitSelectedPresentation ssp1 inner join ssp1.presentation p1 where p1.id = p.id)" + ), + 'team_selected' => new DoctrineCaseFilterMapping( + 'team_selected', + "sspl.list_type = 'Group' and sspl.list_class = 'Session' and ssp.collection= 'selected'" + ), + 'selected' => new DoctrineCaseFilterMapping( + 'selected', + "sspl.list_type = 'Individual' and sspl.list_class = 'Session' and ssp.collection = 'selected' and ssp_member.id = ".$current_member_id + ), + 'maybe' => new DoctrineCaseFilterMapping( + 'maybe', + "sspl.list_type = 'Individual' and sspl.list_class = 'Session' and ssp.collection = 'maybe' and ssp_member.id = ".$current_member_id + ), + 'pass' => new DoctrineCaseFilterMapping( + 'selected', + "sspl.list_type = 'Individual' and sspl.list_class = 'Session' and ssp.collection = 'pass' and ssp_member.id = ".$current_member_id + ), + ] + ), + 'viewed_status' => new DoctrineSwitchFilterMapping + ( + [ + 'seen' => new DoctrineCaseFilterMapping( + 'seen', + sprintf("exists (select vw1 from models\summit\PresentationTrackChairView vw1 inner join vw1.presentation p1 join vw1.viewer v1 where p1.id = p.id and v1.id = %s)", $current_member_id) + ), + 'unseen' => new DoctrineCaseFilterMapping( + 'unseen', + sprintf("not exists (select vw1 from models\summit\PresentationTrackChairView vw1 inner join vw1.presentation p1 join vw1.viewer v1 where p1.id = p.id and v1.id = %s)", $current_member_id) + ), + 'moved' => new DoctrineCaseFilterMapping( + 'moved', + sprintf + ( + "not exists + ( + select vw1 from models\summit\PresentationTrackChairView vw1 + inner join vw1.presentation p1 join vw1.viewer v1 where p1.id = p.id and v1.id = %s + ) + and exists + ( + select cch from models\summit\SummitCategoryChange cch + inner join cch.presentation p2 + inner join cch.new_category nc + where p2.id = p.id and + cch.status = %s and + nc.id = %s + ) ", + $current_member_id, + ISummitCategoryChangeStatus::Approved, + $current_track_id + ) + ), + ] ), 'track_chairs_status' => new DoctrineSwitchFilterMapping ( @@ -282,10 +354,27 @@ final class DoctrineSummitEventRepository public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Order $order = null) { +<<<<<<< HEAD $track_id_filter = $filter->getFilter('track_id'); $current_track_id = 0; if(!is_null($track_id_filter)){ $current_track_id = intval($track_id_filter->getValue()); +======= + Log::debug("DoctrineSummitEventRepository::getAllByPage"); + $current_track_id = 0; + $current_member_id = 0; + + if(!is_null($filter)){ + // check for dependant filtering + $track_id_filter = $filter->getUniqueFilter('track_id'); + if (!is_null($track_id_filter)) { + $current_track_id = intval($track_id_filter->getValue()); + } + $current_member_id_filter = $filter->getUniqueFilter('current_member_id'); + if (!is_null($current_member_id_filter)) { + $current_member_id = intval($current_member_id_filter->getValue()); + } +>>>>>>> 76f1b0cb... Fixes on track chairs filters } $query = $this->getEntityManager()->createQueryBuilder() @@ -307,9 +396,13 @@ final class DoctrineSummitEventRepository ->leftJoin('spm.registration_request', "sprr2", Join::LEFT_JOIN); if(!is_null($filter)){ +<<<<<<< HEAD $resource_server_ctx = App::make(IResourceServerContext::class); $member = $resource_server_ctx->getCurrentUser(false); $filter->apply2Query($query, $this->getCustomFilterMappings($member->getId(), $current_track_id)); +======= + $filter->apply2Query($query, $this->getCustomFilterMappings($current_member_id, $current_track_id)); +>>>>>>> 76f1b0cb... Fixes on track chairs filters } if (!is_null($order)) { @@ -347,6 +440,7 @@ final class DoctrineSummitEventRepository foreach($paginator as $entity) $data[]= $entity; + Log::debug("DoctrineSummitEventRepository::getAllByPage End"); return new PagingResponse ( $total, @@ -386,6 +480,21 @@ final class DoctrineSummitEventRepository public function getAllByPageLocationTBD(PagingInfo $paging_info, Filter $filter = null, Order $order = null) { + $current_track_id = 0; + $current_member_id = 0; + + if(!is_null($filter)){ + // check for dependant filtering + $track_id_filter = $filter->getUniqueFilter('track_id'); + if (!is_null($track_id_filter)) { + $current_track_id = intval($track_id_filter->getValue()); + } + $current_member_id_filter = $filter->getUniqueFilter('current_member_id'); + if (!is_null($current_member_id_filter)) { + $current_member_id = intval($current_member_id_filter->getValue()); + } + } + $query = $this->getEntityManager()->createQueryBuilder() ->select("e") ->from($this->getBaseEntity(), "e") @@ -400,7 +509,7 @@ final class DoctrineSummitEventRepository ->where("l.id is null or l.id = 0"); if(!is_null($filter)){ - $filter->apply2Query($query, $this->getFilterMappings()); + $filter->apply2Query($query, $this->getCustomFilterMappings($current_member_id, $current_track_id)); } if (!is_null($order)) { diff --git a/tests/OAuth2SelectionPlansApiTest.php b/tests/OAuth2SelectionPlansApiTest.php index b7cad657..f880d2a4 100644 --- a/tests/OAuth2SelectionPlansApiTest.php +++ b/tests/OAuth2SelectionPlansApiTest.php @@ -1,8 +1,11 @@ >>>>>> 76f1b0cb... Fixes on track chairs filters /** * Copyright 2018 OpenStack Foundation * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,12 +18,18 @@ use models\summit\SummitSelectedPresentation; * See the License for the specific language governing permissions and * limitations under the License. **/ +use App\Models\Foundation\Main\IGroup; +use models\summit\SummitSelectedPresentation; +/** + * Class OAuth2SelectionPlansApiTest + * @package Tests + */ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest { - use \InsertSummitTestData; + use InsertSummitTestData; - protected function setUp() + protected function setUp():void { $this->setCurrentGroup(IGroup::TrackChairs); parent::setUp(); @@ -34,7 +43,7 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest self::$em->flush(); } - protected function tearDown() + protected function tearDown():void { self::clearTestData(); parent::tearDown(); @@ -285,7 +294,7 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest $this->assertResponseStatus(201); $params = [ - 'status' => $status, + 'status' => $status, 'expand' => 'track_groups,summit' ]; @@ -312,6 +321,98 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest public function testGetPresentationsBySelectionPlanAndConditions(){ +<<<<<<< HEAD +======= + $params = [ + 'id' => self::$summit->getId(), + 'track_id' => self::$defaultTrack->getId(), + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "POST", + "OAuth2SummitSelectedPresentationListApiController@createIndividualSelectionList", + $params, + [], + [], + [], + $headers, + "" + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $selection_list = json_decode($content); + $this->assertTrue(!is_null($selection_list)); + + $params = [ + 'id' => self::$summit->getId(), + 'track_id' => self::$defaultTrack->getId(), + 'collection' => SummitSelectedPresentation::CollectionSelected, + 'presentation_id' => self::$presentations[0]->getId(), + 'expand' => 'selected_presentations,interested_presentations,' + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "POST", + "OAuth2SummitSelectedPresentationListApiController@assignPresentationToMyIndividualList", + $params, + [], + [], + [], + $headers, + "" + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $selection_list = json_decode($content); + $this->assertTrue(!is_null($selection_list)); + $this->assertTrue(count($selection_list->selected_presentations) > 0); + + $params = [ + 'id' => self::$summit->getId(), + 'selection_plan_id' => self::$default_selection_plan->getId(), + 'filter' => [ + 'status==Received', + 'is_chair_visible==1', + 'track_chairs_status==voted' + ], + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "GET", + "OAuth2SummitSelectionPlansApiController@getSelectionPlanPresentations", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + $presentations = json_decode($content); + $this->assertTrue(!is_null($presentations)); + $this->assertTrue($presentations->total >= 1); + } + + public function testGetPresentationsBySelectionPlanAndConditionsMoved(){ +>>>>>>> 76f1b0cb... Fixes on track chairs filters $params = [ 'id' => self::$summit->getId(), @@ -369,13 +470,106 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest $this->assertTrue(!is_null($selection_list)); $this->assertTrue(count($selection_list->selected_presentations) > 0); +<<<<<<< HEAD +======= $params = [ - 'summit' => self::$summit->getId(), + 'id' => self::$summit->getId(), 'selection_plan_id' => self::$default_selection_plan->getId(), 'filter' => [ 'status==Received', 'is_chair_visible==1', + 'viewed_status==moved' + ], + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "GET", + "OAuth2SummitSelectionPlansApiController@getSelectionPlanPresentations", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + $presentations = json_decode($content); + $this->assertTrue(!is_null($presentations)); + $this->assertTrue($presentations->total == 0); + } + + public function testGetPresentationsBySelectionPlanAndConditionsPass(){ + + $params = [ + 'id' => self::$summit->getId(), + 'track_id' => self::$defaultTrack->getId(), + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "POST", + "OAuth2SummitSelectedPresentationListApiController@createIndividualSelectionList", + $params, + [], + [], + [], + $headers, + "" + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $selection_list = json_decode($content); + $this->assertTrue(!is_null($selection_list)); +>>>>>>> 76f1b0cb... Fixes on track chairs filters + + $params = [ + 'id' => self::$summit->getId(), + 'track_id' => self::$defaultTrack->getId(), + 'collection' => SummitSelectedPresentation::CollectionPass, + 'presentation_id' => self::$presentations[0]->getId(), + 'expand' => 'selected_presentations,interested_presentations,' + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "POST", + "OAuth2SummitSelectedPresentationListApiController@assignPresentationToMyIndividualList", + $params, + [], + [], + [], + $headers, + "" + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $selection_list = json_decode($content); + $this->assertTrue(!is_null($selection_list)); + + $params = [ + 'id' => self::$summit->getId(), + 'selection_plan_id' => self::$default_selection_plan->getId(), + 'filter' => [ + 'status==Received', + 'is_chair_visible==1', +<<<<<<< HEAD 'track_chairs_status==voted' ], ]; @@ -466,6 +660,8 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest 'filter' => [ 'status==Received', 'is_chair_visible==1', +======= +>>>>>>> 76f1b0cb... Fixes on track chairs filters 'track_chairs_status==pass' ], ];