diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationCategoryGroupController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationCategoryGroupController.php new file mode 100644 index 00000000..660e67d7 --- /dev/null +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationCategoryGroupController.php @@ -0,0 +1,290 @@ +repository = $repository; + $this->summit_repository = $summit_repository; + } + /** + * @param $summit_id + * @return mixed + */ + public function getAllBySummit($summit_id){ + $values = Input::all(); + $rules = [ + + 'page' => 'integer|min:1', + 'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::DefaultPageSize, PagingConstants::MaxPageSize), + ]; + + try { + + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $validation = Validator::make($values, $rules); + + if ($validation->fails()) { + $ex = new ValidationException(); + throw $ex->setMessages($validation->messages()->toArray()); + } + + // default values + $page = 1; + $per_page = PagingConstants::DefaultPageSize; + + 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'), [ + 'name' => ['=@', '=='], + 'description' => ['=@', '=='], + 'slug' => ['=@', '=='], + 'track_title' => ['=@', '=='], + 'track_code' => ['=@', '=='], + 'group_title' => ['=@', '=='], + 'group_code' => ['=@', '=='], + 'voting_visible' => ['=='], + 'chair_visible' => ['=='], + 'class_name' => ['=='] + ]); + } + + if(is_null($filter)) $filter = new Filter(); + + $filter->validate([ + 'name' => 'sometimes|string', + 'description' => 'sometimes|string', + 'slug' => 'sometimes|string', + 'track_title' => 'sometimes|string', + 'track_code' => 'sometimes|string', + 'group_title' => 'sometimes|string', + 'group_code' => 'sometimes|string', + 'voting_visible' => 'sometimes|boolean', + 'chair_visible' => 'sometimes|boolean', + 'class_name' => sprintf('sometimes|in:%s', implode(',',PresentationCategoryGroupConstants::$valid_class_names)), + ], + [ + 'class_name.in' => sprintf + ( + ":attribute has an invalid value ( valid values are %s )", + implode(", ", PresentationCategoryGroupConstants::$valid_class_names) + ), + ]); + + $order = null; + + if (Input::has('order')) + { + $order = OrderParser::parse(Input::get('order'), [ + 'id', + 'name', + 'slug' + ]); + } + + $data = $this->repository->getBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); + + return $this->ok + ( + $data->toArray + ( + Request::input('expand', ''), + [], + [], + [] + ) + ); + } + catch (ValidationException $ex1) + { + Log::warning($ex1); + return $this->error412([$ex1->getMessage()]); + } + catch (EntityNotFoundException $ex2) + { + Log::warning($ex2); + return $this->error404(['message' => $ex2->getMessage()]); + } + catch(\HTTP401UnauthorizedException $ex3) + { + Log::warning($ex3); + return $this->error401(); + } + catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + /** + * @param $summit_id + * @return mixed + */ + public function getAllBySummitCSV($summit_id){ + $values = Input::all(); + + try { + + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + // default values + $page = 1; + $per_page = PHP_INT_MAX; + + 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'), [ + 'name' => ['=@', '=='], + 'description' => ['=@', '=='], + 'slug' => ['=@', '=='], + 'track_title' => ['=@', '=='], + 'track_code' => ['=@', '=='], + 'group_title' => ['=@', '=='], + 'group_code' => ['=@', '=='], + 'voting_visible' => ['=='], + 'chair_visible' => ['=='], + 'class_name' => ['=='] + ]); + } + + if(is_null($filter)) $filter = new Filter(); + + $filter->validate([ + 'name' => 'sometimes|string', + 'description' => 'sometimes|string', + 'slug' => 'sometimes|string', + 'track_title' => 'sometimes|string', + 'track_code' => 'sometimes|string', + 'group_title' => 'sometimes|string', + 'group_code' => 'sometimes|string', + 'voting_visible' => 'sometimes|boolean', + 'chair_visible' => 'sometimes|boolean', + 'class_name' => sprintf('sometimes|in:%s', implode(',',PresentationCategoryGroupConstants::$valid_class_names)), + ], + [ + 'class_name.in' => sprintf + ( + ":attribute has an invalid value ( valid values are %s )", + implode(", ", PresentationCategoryGroupConstants::$valid_class_names) + ), + ]); + + $order = null; + + if (Input::has('order')) + { + $order = OrderParser::parse(Input::get('order'), [ + 'id', + 'name', + 'slug' + ]); + } + + $data = $this->repository->getBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); + + $filename = "presentation-category-groups-" . date('Ymd'); + $list = $data->toArray(); + return $this->export + ( + 'csv', + $filename, + $list['data'], + [ + 'created' => new EpochCellFormatter, + 'last_edited' => new EpochCellFormatter, + ] + ); + } + catch (ValidationException $ex1) + { + Log::warning($ex1); + return $this->error412(array( $ex1->getMessage())); + } + catch (EntityNotFoundException $ex2) + { + Log::warning($ex2); + return $this->error404(array('message' => $ex2->getMessage())); + } + catch(\HTTP401UnauthorizedException $ex3) + { + Log::warning($ex3); + return $this->error401(); + } + catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php index 0e379c8d..a64a8975 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitApiController.php @@ -71,6 +71,9 @@ final class OAuth2SummitApiController extends OAuth2ProtectedController $this->service = $service; } + /** + * @return mixed + */ public function getSummits() { try { @@ -242,110 +245,6 @@ final class OAuth2SummitApiController extends OAuth2ProtectedController } } - /** - * @param $summit_id - * @return mixed - */ - public function getTracks($summit_id){ - try { - $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); - - //tracks - $tracks = array(); - foreach ($summit->getPresentationCategories() as $track) - { - $tracks[] = SerializerRegistry::getInstance()->getSerializer($track)->serialize(Request::input('expand', '')); - } - - $response = new PagingResponse - ( - count($tracks), - count($tracks), - 1, - 1, - $tracks - ); - - return $this->ok($response->toArray()); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $summit_id - * @param $track_id - * @return mixed - */ - public function getTrack($summit_id, $track_id){ - try { - $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); - - $track = $summit->getPresentationCategory($track_id); - if (is_null($track)) return $this->error404(); - - return $this->ok(SerializerRegistry::getInstance()->getSerializer($track)->serialize(Request::input('expand', ''))); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $summit_id - * @return mixed - */ - public function getTracksGroups($summit_id){ - try { - $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); - - //track groups - $groups = array(); - foreach ($summit->getCategoryGroups() as $group) - { - $groups[] = SerializerRegistry::getInstance()->getSerializer($group)->serialize(Request::input('expand', '')); - } - - $response = new PagingResponse - ( - count($groups), - count($groups), - 1, - 1, - $groups - ); - - return $this->ok($response->toArray()); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - - /** - * @param $summit_id - * @param $track_group_id - * @return mixed - */ - public function getTrackGroup($summit_id, $track_group_id){ - try { - $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); - - $group = $summit->getCategoryGroup($track_group_id); - if (is_null($group)) return $this->error404(); - - return $this->ok(SerializerRegistry::getInstance()->getSerializer($group)->serialize(Request::input('expand', ''))); - } catch (Exception $ex) { - Log::error($ex); - return $this->error500($ex); - } - } - /** * @param $summit_id * @param $external_order_id diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php index 2d4da99f..1400a724 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php @@ -15,7 +15,6 @@ use App\Http\Utils\EpochCellFormatter; use App\Http\Utils\PagingConstants; use App\Services\Model\ISummitTicketTypeService; use Illuminate\Support\Facades\Request; -use App\Models\Foundation\Summit\Events\SummitEventTypeConstants; use models\summit\ISummitTicketTypeRepository; use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Log; diff --git a/app/Http/routes.php b/app/Http/routes.php index 711f5b61..8e256872 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -484,8 +484,11 @@ Route::group([ // track groups Route::group(['prefix' => 'track-groups'], function () { - Route::get('', 'OAuth2SummitTracksApiController@getTracksGroups'); - Route::get('{track_group_id}', 'OAuth2SummitApiController@getTrackGroup'); + Route::get('', 'OAuth2PresentationCategoryGroupController@getAllBySummit'); + Route::get('csv', 'OAuth2PresentationCategoryGroupController@getAllBySummitCSV'); + Route::group(['prefix' => '{track_group_id}'], function () { + + }); }); // promo codes diff --git a/app/ModelSerializers/Summit/Presentation/PresentationCategoryGroupSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationCategoryGroupSerializer.php index 7d416b22..243b8789 100644 --- a/app/ModelSerializers/Summit/Presentation/PresentationCategoryGroupSerializer.php +++ b/app/ModelSerializers/Summit/Presentation/PresentationCategoryGroupSerializer.php @@ -22,6 +22,8 @@ class PresentationCategoryGroupSerializer extends SilverStripeSerializer 'Name' => 'name:json_string', 'Color' => 'color:json_string', 'Description' => 'description:json_string', + 'ClassName' => 'class_name:json_string', + 'SummitId' => 'summit_id:json_int', ]; /** @@ -31,7 +33,7 @@ class PresentationCategoryGroupSerializer extends SilverStripeSerializer * @param array $params * @return array */ - public function serialize($expand = null, array $fields = array(), array $relations = array(), array $params = array() ) + public function serialize($expand = null, array $fields = [], array $relations = [], array $params = [] ) { $values = parent::serialize($expand, $fields, $relations, $params); diff --git a/app/Models/Foundation/Summit/Events/Presentations/PresentationCategory.php b/app/Models/Foundation/Summit/Events/Presentations/PresentationCategory.php index 3bd5777c..536285ce 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/PresentationCategory.php +++ b/app/Models/Foundation/Summit/Events/Presentations/PresentationCategory.php @@ -11,9 +11,11 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\Event\PreUpdateEventArgs; use Doctrine\ORM\Mapping AS ORM; use Doctrine\ORM\Query\ResultSetMappingBuilder; +use models\main\Tag; use models\utils\SilverstripeBaseModel; use Doctrine\Common\Collections\ArrayCollection; /** @@ -136,6 +138,7 @@ class PresentationCategory extends SilverstripeBaseModel } /** + * * @ORM\ManyToMany(targetEntity="models\summit\PresentationCategoryGroup", mappedBy="categories") * @var PresentationCategoryGroup[] */ @@ -154,8 +157,8 @@ class PresentationCategory extends SilverstripeBaseModel { parent::__construct(); - $this->groups = new ArrayCollection(); - $this->allowed_tags = new ArrayCollection(); + $this->groups = new ArrayCollection; + $this->allowed_tags = new ArrayCollection; $this->session_count = 0; $this->alternate_count = 0; $this->lightning_alternate_count = 0; @@ -179,6 +182,20 @@ class PresentationCategory extends SilverstripeBaseModel return $this->groups; } + /** + * @param PresentationCategoryGroup $group + */ + public function addToGroup(PresentationCategoryGroup $group){ + $this->groups->add($group); + } + + /** + * @param PresentationCategoryGroup $group + */ + public function removeFromGroup(PresentationCategoryGroup $group){ + $this->groups->removeElement($group); + } + /** * @return Tag[] */ @@ -186,6 +203,25 @@ class PresentationCategory extends SilverstripeBaseModel return $this->allowed_tags; } + /** + * @param int $group_id + * @return PresentationCategoryGroup|null + */ + public function getGroupById($group_id){ + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq('id', intval($group_id))); + $res = $this->groups->matching($criteria)->first(); + return $res === false ? null : $res; + } + + /** + * @param int $group_id + * @return bool + */ + public function belongsToGroup($group_id){ + return $this->getGroupById($group_id) != null; + } + /** * @return int */ diff --git a/app/Models/Foundation/Summit/Events/Presentations/PresentationCategoryGroup.php b/app/Models/Foundation/Summit/Events/Presentations/PresentationCategoryGroup.php index b4359657..13a70e4a 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/PresentationCategoryGroup.php +++ b/app/Models/Foundation/Summit/Events/Presentations/PresentationCategoryGroup.php @@ -11,16 +11,20 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use Doctrine\Common\Collections\Criteria; use models\utils\SilverstripeBaseModel; use Doctrine\ORM\Mapping AS ORM; use Doctrine\Common\Collections\ArrayCollection; /** * Class PresentationCategoryGroup - * @ORM\Entity + * @ORM\Entity(repositoryClass="App\Repositories\Summit\DoctrinePresentationCategoryGroupRepository") * @ORM\Table(name="PresentationCategoryGroup") * @ORM\InheritanceType("JOINED") * @ORM\DiscriminatorColumn(name="ClassName", type="string") - * @ORM\DiscriminatorMap({"PresentationCategoryGroup" = "PresentationCategoryGroup", "PrivatePresentationCategoryGroup" = "PrivatePresentationCategoryGroup"}) + * @ORM\DiscriminatorMap({ + * "PresentationCategoryGroup" = "PresentationCategoryGroup", + * "PrivatePresentationCategoryGroup" = "PrivatePresentationCategoryGroup" + * }) * @package models\summit */ class PresentationCategoryGroup extends SilverstripeBaseModel @@ -103,6 +107,22 @@ class PresentationCategoryGroup extends SilverstripeBaseModel $this->summit = $summit; } + /** + * @return int + */ + public function getSummitId(){ + try { + return is_null($this->summit) ? 0 : $this->summit->getId(); + } + catch(\Exception $ex){ + return 0; + } + } + + public function clearSummit(){ + $this->summit = null; + } + /** * @return Summit */ @@ -117,6 +137,7 @@ class PresentationCategoryGroup extends SilverstripeBaseModel } /** + * owning side * @ORM\ManyToMany(targetEntity="models\summit\PresentationCategory", inversedBy="groups") * @ORM\JoinTable(name="PresentationCategoryGroup_Categories", * joinColumns={@ORM\JoinColumn(name="PresentationCategoryGroupID", referencedColumnName="ID")}, @@ -134,4 +155,47 @@ class PresentationCategoryGroup extends SilverstripeBaseModel return $this->categories; } + /** + * @param PresentationCategory $track + */ + public function addCategory(PresentationCategory $track){ + $track->addToGroup($this); + $this->categories[] = $track; + } + + /** + * @param PresentationCategory $track + */ + public function removeCategory(PresentationCategory $track){ + $track->removeFromGroup($this); + $this->categories->removeElement($track); + } + + /** + * @param int $category_id + * @return PresentationCategory|null + */ + public function getCategoryById($category_id){ + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq('id', intval($category_id))); + $res = $this->categories->matching($criteria)->first(); + return $res === false ? null : $res; + } + + /** + * @param int $category_id + * @return bool + */ + public function hasCategory($category_id){ + return $this->getCategoryById($category_id) != null; + } + + const ClassName = 'PresentationCategoryGroup'; + + /** + * @return string + */ + public function getClassName(){ + return self::ClassName; + } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/PresentationCategoryGroupConstants.php b/app/Models/Foundation/Summit/Events/Presentations/PresentationCategoryGroupConstants.php new file mode 100644 index 00000000..6622ad1f --- /dev/null +++ b/app/Models/Foundation/Summit/Events/Presentations/PresentationCategoryGroupConstants.php @@ -0,0 +1,26 @@ +allowed_groups->contains($group)) return; + $this->allowed_groups->add($group); + } + + /** + * @param Group $group + */ + public function removeFromGroup(Group $group){ + if(!$this->allowed_groups->contains($group)) return; + $this->allowed_groups->removeElement($group); + } + + /** + * @param int $group_id + * @return Group|null + */ + public function getGroupById($group_id){ + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq('id', intval($group_id))); + $res = $this->allowed_groups->matching($criteria)->first(); + return $res === false ? null : $res; + } + + /** + * @param int $group_id + * @return bool + */ + public function belongsToGroup($group_id){ + return $this->getGroupById($group_id) != null; + } + /** * @return bool */ @@ -71,6 +107,12 @@ class PrivatePresentationCategoryGroup extends PresentationCategoryGroup return ($now >= $start_date && $now <= $end_date); } + public function __construct() + { + parent::__construct(); + $this->allowed_groups = new ArrayCollection; + } + /** * @return DateTime */ @@ -102,4 +144,13 @@ class PrivatePresentationCategoryGroup extends PresentationCategoryGroup { return $this->allowed_groups; } + + const ClassName = 'PrivatePresentationCategoryGroup'; + + /** + * @return string + */ + public function getClassName(){ + return self::ClassName; + } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Repositories/IPresentationCategoryGroupRepository.php b/app/Models/Foundation/Summit/Repositories/IPresentationCategoryGroupRepository.php new file mode 100644 index 00000000..aa0f0315 --- /dev/null +++ b/app/Models/Foundation/Summit/Repositories/IPresentationCategoryGroupRepository.php @@ -0,0 +1,21 @@ +summit->getId(); + return is_null($this->summit) ? 0 : $this->summit->getId(); } catch(\Exception $ex){ return 0; diff --git a/app/Repositories/RepositoriesProvider.php b/app/Repositories/RepositoriesProvider.php index 4c34edda..762db84f 100644 --- a/app/Repositories/RepositoriesProvider.php +++ b/app/Repositories/RepositoriesProvider.php @@ -15,6 +15,7 @@ use App\Models\Foundation\Summit\Defaults\DefaultSummitEventType; use App\Models\Foundation\Summit\Events\RSVP\RSVPTemplate; use App\Models\Foundation\Summit\Locations\Banners\SummitLocationBanner; use App\Models\Foundation\Summit\Repositories\IDefaultSummitEventTypeRepository; +use App\Models\Foundation\Summit\Repositories\IPresentationCategoryGroupRepository; use App\Models\Foundation\Summit\Repositories\IPresentationSpeakerSummitAssistanceConfirmationRequestRepository; use App\Models\Foundation\Summit\Repositories\IRSVPTemplateRepository; use App\Models\Foundation\Summit\Repositories\ISummitEventTypeRepository; @@ -34,6 +35,7 @@ use models\main\Organization; use models\summit\ISummitRegistrationPromoCodeRepository; use models\summit\ISummitTicketTypeRepository; use models\summit\PresentationCategory; +use models\summit\PresentationCategoryGroup; use models\summit\PresentationSpeakerSummitAssistanceConfirmationRequest; use models\summit\SpeakerRegistrationRequest; use models\summit\SpeakerSummitRegistrationPromoCode; @@ -294,28 +296,35 @@ final class RepositoriesProvider extends ServiceProvider App::singleton( ISummitTrackRepository::class, function(){ - return EntityManager::getRepository(PresentationCategory::class); + return EntityManager::getRepository(PresentationCategory::class); } ); App::singleton( IRSVPTemplateRepository::class, function(){ - return EntityManager::getRepository(RSVPTemplate::class); + return EntityManager::getRepository(RSVPTemplate::class); } ); App::singleton( ISummitLocationRepository::class, function(){ - return EntityManager::getRepository(SummitAbstractLocation::class); + return EntityManager::getRepository(SummitAbstractLocation::class); } ); App::singleton( ISummitLocationBannerRepository::class, function(){ - return EntityManager::getRepository(SummitLocationBanner::class); + return EntityManager::getRepository(SummitLocationBanner::class); + } + ); + + App::singleton( + IPresentationCategoryGroupRepository::class, + function(){ + return EntityManager::getRepository(PresentationCategoryGroup::class); } ); } diff --git a/app/Repositories/Summit/DoctrinePresentationCategoryGroupRepository.php b/app/Repositories/Summit/DoctrinePresentationCategoryGroupRepository.php new file mode 100644 index 00000000..f1706142 --- /dev/null +++ b/app/Repositories/Summit/DoctrinePresentationCategoryGroupRepository.php @@ -0,0 +1,148 @@ + 'pcg.name:json_string', + 'description' => 'pcg.description:json_string', + 'slug' => 'pcg.slug:json_string', + 'submission_begin_date' => 'ppcg.submission_begin_date:datetime_epoch', + 'submission_end_date' => 'ppcg.submission_begin_date:datetime_epoch', + 'class_name' => new DoctrineInstanceOfFilterMapping + ( + "pcg", + [ + PresentationCategoryGroup::ClassName => PresentationCategoryGroup::class, + PrivatePresentationCategoryGroup::ClassName => PrivatePresentationCategoryGroup::class, + ] + ), + 'track_title' => new DoctrineFilterMapping + ( + "(cat.title :operator ':value')" + ), + 'track_code' => new DoctrineFilterMapping + ( + "(cat.code :operator ':value')" + ), + 'group_title' => new DoctrineFilterMapping + ( + "(grp.title :operator ':value')" + ), + 'group_code' => new DoctrineFilterMapping + ( + "(grp.code :operator ':value')" + ), + ]; + } + + /** + * @return array + */ + protected function getOrderMappings() + { + return [ + 'name' => 'pcg.name', + 'id' => 'pcg.id', + 'slug' => 'pcg.slug', + ]; + } + + /** + * @param Summit $summit + * @param PagingInfo $paging_info + * @param Filter|null $filter + * @param Order|null $order + * @return PagingResponse + */ + public function getBySummit + ( + Summit $summit, + PagingInfo $paging_info, + Filter $filter = null, + Order $order = null + ) + { + $query = $this->getEntityManager() + ->createQueryBuilder() + ->select("pcg") + ->from(PresentationCategoryGroup::class, "pcg") + ->leftJoin(PrivatePresentationCategoryGroup::class, 'ppcg', 'WITH', 'ppcg.id = pcg.id') + ->leftJoin("pcg.categories", "cat") + ->leftJoin("ppcg.allowed_groups", "grp") + ->leftJoin('pcg.summit', 's') + ->where("s.id = :summit_id"); + + $query->setParameter("summit_id", $summit->getId()); + + if(!is_null($filter)){ + $filter->apply2Query($query, $this->getFilterMappings()); + } + + if (!is_null($order)) { + $order->apply2Query($query, $this->getOrderMappings()); + } else { + //default order + $query = $query->addOrderBy("pcg.id",'ASC'); + } + + $query = $query + ->setFirstResult($paging_info->getOffset()) + ->setMaxResults($paging_info->getPerPage()); + + $paginator = new Paginator($query, $fetchJoinCollection = true); + $total = $paginator->count(); + $data = []; + + foreach($paginator as $entity) + $data[] = $entity; + + return new PagingResponse + ( + $total, + $paging_info->getPerPage(), + $paging_info->getCurrentPage(), + $paging_info->getLastPage($total), + $data + ); + } +} \ No newline at end of file diff --git a/app/Services/Model/IPresentationCategoryGroupService.php b/app/Services/Model/IPresentationCategoryGroupService.php new file mode 100644 index 00000000..1440a98b --- /dev/null +++ b/app/Services/Model/IPresentationCategoryGroupService.php @@ -0,0 +1,17 @@ + 'get-track-groups', 'route' => '/api/v1/summits/{id}/track-groups', 'http_method' => 'GET', @@ -1177,8 +1177,17 @@ class ApiEndpointsSeeder extends Seeder sprintf(SummitScopes::ReadSummitData, $current_realm), sprintf(SummitScopes::ReadAllSummitData, $current_realm) ], - ), - array( + ], + [ + 'name' => 'get-track-groups-csv', + 'route' => '/api/v1/summits/{id}/track-groups/csv', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadSummitData, $current_realm), + sprintf(SummitScopes::ReadAllSummitData, $current_realm) + ], + ], + [ 'name' => 'get-track-group', 'route' => '/api/v1/summits/{id}/track-groups/{track_group_id}', 'http_method' => 'GET', @@ -1186,7 +1195,7 @@ class ApiEndpointsSeeder extends Seeder sprintf(SummitScopes::ReadSummitData, $current_realm), sprintf(SummitScopes::ReadAllSummitData, $current_realm) ], - ), + ], //external orders array( 'name' => 'get-external-order', diff --git a/tests/OAuth2SummitApiTest.php b/tests/OAuth2SummitApiTest.php index c2181199..66b6de1c 100644 --- a/tests/OAuth2SummitApiTest.php +++ b/tests/OAuth2SummitApiTest.php @@ -163,58 +163,6 @@ final class OAuth2SummitApiTest extends ProtectedApiTest $this->assertResponseStatus(200); } - public function testGetTracks() - { - - $params = array - ( - 'id' => 6, - 'expand' => 'track_groups', - ); - - $headers = array("HTTP_Authorization" => " Bearer " . $this->access_token); - $response = $this->action( - "GET", - "OAuth2SummitApiController@getTracks", - $params, - array(), - array(), - array(), - $headers - ); - - $content = $response->getContent(); - $tracks = json_decode($content); - $this->assertTrue(!is_null($tracks)); - $this->assertResponseStatus(200); - } - - public function testGetTrackGroups() - { - - $params = array - ( - 'id' => 6, - 'expand' => 'tracks', - ); - - $headers = array("HTTP_Authorization" => " Bearer " . $this->access_token); - $response = $this->action( - "GET", - "OAuth2SummitApiController@getTracksGroups", - $params, - array(), - array(), - array(), - $headers - ); - - $content = $response->getContent(); - $groups = json_decode($content); - $this->assertTrue(!is_null($groups)); - $this->assertResponseStatus(200); - } - public function testGetCurrentSummit($summit_id = 23) { diff --git a/tests/OAuth2TrackGroupsApiTest.php b/tests/OAuth2TrackGroupsApiTest.php new file mode 100644 index 00000000..8369a625 --- /dev/null +++ b/tests/OAuth2TrackGroupsApiTest.php @@ -0,0 +1,75 @@ + $summit_id, + 'expand' => 'tracks', + ]; + + $headers = ["HTTP_Authorization" => " Bearer " . $this->access_token]; + $response = $this->action( + "GET", + "OAuth2PresentationCategoryGroupController@getAllBySummit", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $track_groups = json_decode($content); + $this->assertTrue(!is_null($track_groups)); + $this->assertResponseStatus(200); + } + + + /** + * @param int $summit_id + */ + public function testGetTrackGroupsPrivate($summit_id = 23) + { + + $params = [ + 'id' => $summit_id, + 'expand' => 'tracks', + 'filter' => ['class_name=='.\models\summit\PrivatePresentationCategoryGroup::ClassName], + 'order' => '+title', + ]; + + $headers = ["HTTP_Authorization" => " Bearer " . $this->access_token]; + $response = $this->action( + "GET", + "OAuth2PresentationCategoryGroupController@getAllBySummit", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $track_groups = json_decode($content); + $this->assertTrue(!is_null($track_groups)); + $this->assertResponseStatus(200); + } +} \ No newline at end of file