From e193e866cd6cbc65a6851505ae346fc393ffcd5a Mon Sep 17 00:00:00 2001 From: Sebastian Marcet Date: Fri, 7 Sep 2018 15:45:20 -0300 Subject: [PATCH] Added new endpoints for Track Tag Groups * get track tag groups per summit GET /api/v1/summits/{id}/track-tag-groups params expand: allowed_tags,tag scopes %s/summits/read/all * get track tag group by id GET /api/v1/summits/{id}/track-tag-groups/{track_tag_group_id} params expand: allowed_tags,tag scopes %s/summits/read/all * seed default track tag groups on summit PUT /api/v1/summits/{id}/track-tag-groups/seed-defaults scopes %s/summits/write %s/track-tag-groups/write * add track tag groups POST /api/v1/summits/{id}/track-tag-groups payload 'name' => 'required|string|max:50', 'label' => 'required|string|max:50', 'is_mandatory' => 'required|boolean', 'allowed_tags' => 'sometimes|string_array' scopes %s/summits/write %s/track-tag-groups/write * update track tag group PUT /api/v1/summits/{id}/track-tag-groups/{track_tag_group_id} payload 'name' => 'sometimes|string|max:50', 'label' => 'sometimes|string|max:50', 'is_mandatory' => 'sometimes|boolean', 'order' => 'sometimes|integer|min:1', 'allowed_tags' => 'sometimes|string_array', scopes %s/summits/write %s/track-tag-groups/write * delete track tag group by id DELETE /api/v1/summits/{id}/track-tag-groups/{track_tag_group_id} scopes %s/summits/write %s/track-tag-groups/write Change-Id: Ieef974863c19b41655888cbbd8e29215f4724127 --- ...Auth2SummitTrackTagGroupsApiController.php | 252 +++++++++++++++++- app/Http/routes.php | 21 +- app/ModelSerializers/SerializerRegistry.php | 4 +- .../TrackTagGroupSerializer.php | 26 ++ .../Foundation/IOrderableEntity.php} | 27 +- .../Foundation/IRecalculateOrderStrategy.php | 29 ++ .../Foundation/RecalculateOrderStrategy.php | 53 ++++ .../Summit/DefaultTrackTagGroup.php | 142 ++++++++++ .../Summit/DefaultTrackTagGroupAllowedTag.php | 118 ++++++++ .../Summit/Factories/TrackTagGroupFactory.php | 53 ++++ .../Locations/SummitAbstractLocation.php | 3 +- .../IDefaultTrackTagGroupRepository.php | 22 ++ app/Models/Foundation/Summit/Summit.php | 111 ++++++-- .../Foundation/Summit/TrackTagGroup.php | 89 ++++--- .../Summit/TrackTagGroupAllowedTag.php | 2 +- app/Repositories/RepositoriesProvider.php | 9 + ...DoctrineDefaultTrackTagGroupRepository.php | 32 +++ app/Security/SummitScopes.php | 1 + .../Model/ISummitTrackTagGroupService.php | 59 ++++ .../Model/SummitTrackTagGroupService.php | 235 ++++++++++++++++ app/Services/ServicesProvider.php | 7 + database/seeds/ApiEndpointsSeeder.php | 52 ++++ database/seeds/ApiScopesSeeder.php | 5 + resources/lang/en/not_found_errors.php | 3 + resources/lang/en/validation_errors.php | 5 + ...2SummitTrackTagGroupsApiControllerTest.php | 48 ---- tests/OAuth2TrackTagGroupsApiTest.php | 209 +++++++++++++++ 27 files changed, 1493 insertions(+), 124 deletions(-) rename app/{ModelSerializers/Summit/Presentation/TrackTagGroupSerializer.php => Models/Foundation/IOrderableEntity.php} (52%) create mode 100644 app/Models/Foundation/IRecalculateOrderStrategy.php create mode 100644 app/Models/Foundation/RecalculateOrderStrategy.php create mode 100644 app/Models/Foundation/Summit/DefaultTrackTagGroup.php create mode 100644 app/Models/Foundation/Summit/DefaultTrackTagGroupAllowedTag.php create mode 100644 app/Models/Foundation/Summit/Factories/TrackTagGroupFactory.php create mode 100644 app/Models/Foundation/Summit/Repositories/IDefaultTrackTagGroupRepository.php create mode 100644 app/Repositories/Summit/DoctrineDefaultTrackTagGroupRepository.php create mode 100644 app/Services/Model/ISummitTrackTagGroupService.php create mode 100644 app/Services/Model/SummitTrackTagGroupService.php delete mode 100644 tests/OAuth2SummitTrackTagGroupsApiControllerTest.php create mode 100644 tests/OAuth2TrackTagGroupsApiTest.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTrackTagGroupsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTrackTagGroupsApiController.php index d909da1b..a3001a71 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTrackTagGroupsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTrackTagGroupsApiController.php @@ -12,9 +12,11 @@ * limitations under the License. **/ use App\Models\Foundation\Summit\Repositories\ITrackTagGroupAllowedTagsRepository; +use App\Services\Model\ISummitTrackTagGroupService; use models\oauth2\IResourceServerContext; use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Validator; +use ModelSerializers\SerializerRegistry; use utils\Filter; use utils\FilterParser; use utils\FilterParserException; @@ -25,6 +27,8 @@ use utils\PagingInfo; use models\exceptions\EntityNotFoundException; use models\exceptions\ValidationException; use models\summit\ISummitRepository; +use utils\PagingResponse; + /** * Class OAuth2SummitTrackTagGroupsApiController * @package App\Http\Controllers @@ -36,33 +40,87 @@ final class OAuth2SummitTrackTagGroupsApiController extends OAuth2ProtectedContr */ private $summit_repository; + /** + * @var ISummitTrackTagGroupService + */ + private $track_tag_group_service; + /** * OAuth2SummitTrackTagGroupsApiController constructor. * @param ISummitRepository $summit_repository * @param ITrackTagGroupAllowedTagsRepository $repository + * @param ISummitTrackTagGroupService $track_tag_group_service * @param IResourceServerContext $resource_server_context */ public function __construct ( ISummitRepository $summit_repository, ITrackTagGroupAllowedTagsRepository $repository, + ISummitTrackTagGroupService $track_tag_group_service, IResourceServerContext $resource_server_context ) { parent::__construct($resource_server_context); + $this->summit_repository = $summit_repository; + $this->track_tag_group_service = $track_tag_group_service; $this->repository = $repository; } + /** + * @param $summit_id + * @return mixed + */ + public function getTrackTagGroupsBySummit($summit_id){ + try { + + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $track_tag_groups = $summit->getTrackTagGroups()->toArray(); + + $response = new PagingResponse + ( + count($track_tag_groups), + count($track_tag_groups), + 1, + 1, + $track_tag_groups + ); + + return $this->ok($response->toArray($expand = Input::get('expand',''))); + } + + catch (EntityNotFoundException $ex1) { + Log::warning($ex1); + return $this->error404(); + } + catch (ValidationException $ex2) { + Log::warning($ex2); + return $this->error412($ex2->getMessages()); + } + catch(FilterParserException $ex3){ + Log::warning($ex3); + return $this->error412($ex3->getMessages()); + } + catch (\Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + /** + * @param $summit_id + * @return mixed + */ public function getAllowedTags($summit_id){ $values = Input::all(); - $rules = array - ( + $rules = [ 'page' => 'integer|min:1', 'per_page' => 'required_with:page|integer|min:5|max:100', - ); + ]; try { @@ -141,4 +199,192 @@ final class OAuth2SummitTrackTagGroupsApiController extends OAuth2ProtectedContr return $this->error500($ex); } } + + /** + * @param $summit_id + * @return mixed + */ + public function addTrackTagGroup($summit_id){ + try { + if(!Request::isJson()) return $this->error400(); + $data = Input::json(); + + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $rules = [ + 'name' => 'required|string|max:50', + 'label' => 'required|string|max:50', + 'is_mandatory' => 'required|boolean', + 'allowed_tags' => 'sometimes|string_array', + ]; + + // Creates a Validator instance and validates the data. + $validation = Validator::make($data->all(), $rules); + + if ($validation->fails()) { + $messages = $validation->messages()->toArray(); + + return $this->error412 + ( + $messages + ); + } + + $track_tag_group = $this->track_tag_group_service->addTrackTagGroup($summit, $data->all()); + + return $this->created(SerializerRegistry::getInstance()->getSerializer($track_tag_group)->serialize(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 (\Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + /** + * @param $summit_id + * @param $track_tag_group_id + * @return mixed + */ + public function updateTrackTagGroup($summit_id, $track_tag_group_id){ + try { + if(!Request::isJson()) return $this->error400(); + $data = Input::json(); + + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $rules = [ + 'name' => 'sometimes|string|max:50', + 'label' => 'sometimes|string|max:50', + 'is_mandatory' => 'sometimes|boolean', + 'order' => 'sometimes|integer|min:1', + 'allowed_tags' => 'sometimes|string_array', + ]; + + // Creates a Validator instance and validates the data. + $validation = Validator::make($data->all(), $rules); + + if ($validation->fails()) { + $messages = $validation->messages()->toArray(); + + return $this->error412 + ( + $messages + ); + } + + $track_tag_group = $this->track_tag_group_service->updateTrackTagGroup($summit, $track_tag_group_id, $data->all()); + + return $this->updated(SerializerRegistry::getInstance()->getSerializer($track_tag_group)->serialize(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 (\Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + /** + * @param $summit_id + * @param $track_tag_group_id + * @return mixed + */ + public function getTrackTagGroup($summit_id, $track_tag_group_id){ + try{ + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + $track_tag_group = $summit->getTrackTagGroup(intval($track_tag_group_id)); + if(is_null($track_tag_group)) + return $this->error404(); + + return $this->ok(SerializerRegistry::getInstance()->getSerializer($track_tag_group)->serialize(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 (\Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + /** + * @param $summit_id + * @param $track_tag_group_id + * @return mixed + */ + public function deleteTrackTagGroup($summit_id, $track_tag_group_id){ + try { + + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + $this->track_tag_group_service->deleteTrackTagGroup($summit, $track_tag_group_id); + + return $this->deleted(); + } + catch (ValidationException $ex1) { + Log::warning($ex1); + return $this->error412([$ex1->getMessage()]); + } + catch(EntityNotFoundException $ex2) + { + Log::warning($ex2); + return $this->error404(['message'=> $ex2->getMessage()]); + } + catch (\Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + /** + * @param $summit_id + * @return mixed + */ + public function seedDefaultTrackTagGroups($summit_id){ + try{ + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + $this->track_tag_group_service->seedDefaultTrackTagGroups($summit); + return $this->updated(); + } + catch (ValidationException $ex1) { + Log::warning($ex1); + return $this->error412([$ex1->getMessage()]); + } + catch(EntityNotFoundException $ex2) + { + Log::warning($ex2); + return $this->error404(['message'=> $ex2->getMessage()]); + } + catch (\Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } } \ No newline at end of file diff --git a/app/Http/routes.php b/app/Http/routes.php index e6f7b26f..6e9d2bc6 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -528,6 +528,26 @@ Route::group([ }); Route::group(['prefix' => 'track-tag-groups'], function(){ + + Route::get('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', + 'uses' => 'OAuth2SummitTrackTagGroupsApiController@getTrackTagGroupsBySummit']); + + Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', + 'uses' => 'OAuth2SummitTrackTagGroupsApiController@addTrackTagGroup']); + + Route::put('seed-defaults', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', + 'uses' => 'OAuth2SummitTrackTagGroupsApiController@seedDefaultTrackTagGroups']); + + Route::group(['prefix' => '{track_tag_group_id}'], function(){ + Route::get('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', + 'uses' => 'OAuth2SummitTrackTagGroupsApiController@getTrackTagGroup']); + Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', + 'uses' => 'OAuth2SummitTrackTagGroupsApiController@updateTrackTagGroup']); + Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', + 'uses' => 'OAuth2SummitTrackTagGroupsApiController@deleteTrackTagGroup']); + + }); + Route::group(['prefix' => 'all'], function(){ Route::group(['prefix' => 'allowed-tags'], function(){ Route::get('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', @@ -601,7 +621,6 @@ Route::group([ Route::put('/feedback', 'OAuth2SummitEventsApiController@updateEventFeedbackByMember'); }); }); - }); }); }); \ No newline at end of file diff --git a/app/ModelSerializers/SerializerRegistry.php b/app/ModelSerializers/SerializerRegistry.php index 8fcf78f1..0898c813 100644 --- a/app/ModelSerializers/SerializerRegistry.php +++ b/app/ModelSerializers/SerializerRegistry.php @@ -43,7 +43,6 @@ use App\ModelSerializers\Summit\Presentation\TrackQuestions\TrackDropDownQuestio use App\ModelSerializers\Summit\Presentation\TrackQuestions\TrackMultiValueQuestionTemplateSerializer; use App\ModelSerializers\Summit\Presentation\TrackQuestions\TrackQuestionValueTemplateSerializer; use App\ModelSerializers\Summit\Presentation\TrackQuestions\TrackSingleValueTemplateQuestionSerializer; -use App\ModelSerializers\Summit\Presentation\TrackTagGroupSerializer; use App\ModelSerializers\Summit\RSVP\Templates\RSVPDropDownQuestionTemplateSerializer; use App\ModelSerializers\Summit\RSVP\Templates\RSVPLiteralContentQuestionTemplateSerializer; use App\ModelSerializers\Summit\RSVP\Templates\RSVPMultiValueQuestionTemplateSerializer; @@ -54,6 +53,7 @@ use App\ModelSerializers\Summit\ScheduledSummitLocationBannerSerializer; use App\ModelSerializers\Summit\SelectionPlanSerializer; use App\ModelSerializers\Summit\SummitLocationBannerSerializer; use App\ModelSerializers\Summit\TrackTagGroups\TrackTagGroupAllowedTagSerializer; +use App\ModelSerializers\Summit\TrackTagGroups\TrackTagGroupSerializer; use Libs\ModelSerializers\IModelSerializer; use ModelSerializers\ChatTeams\ChatTeamInvitationSerializer; use ModelSerializers\ChatTeams\ChatTeamMemberSerializer; @@ -188,7 +188,7 @@ final class SerializerRegistry $this->registry['SummitLocationImage'] = SummitLocationImageSerializer::class; $this->registry['SummitLocationBanner'] = SummitLocationBannerSerializer::class; $this->registry['ScheduledSummitLocationBanner'] = ScheduledSummitLocationBannerSerializer::class; - // track tag grousp + // track tag groups $this->registry['TrackTagGroup'] = TrackTagGroupSerializer::class; $this->registry['TrackTagGroupAllowedTag'] = TrackTagGroupAllowedTagSerializer::class; diff --git a/app/ModelSerializers/Summit/TrackTagGroups/TrackTagGroupSerializer.php b/app/ModelSerializers/Summit/TrackTagGroups/TrackTagGroupSerializer.php index fb10298d..65805415 100644 --- a/app/ModelSerializers/Summit/TrackTagGroups/TrackTagGroupSerializer.php +++ b/app/ModelSerializers/Summit/TrackTagGroups/TrackTagGroupSerializer.php @@ -11,6 +11,8 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use App\Models\Foundation\Summit\TrackTagGroup; +use ModelSerializers\SerializerRegistry; use ModelSerializers\SilverStripeSerializer; /** @@ -38,6 +40,30 @@ final class TrackTagGroupSerializer extends SilverStripeSerializer { $values = parent::serialize($expand, $fields, $relations, $params); $track_tag_group = $this->object; + if (!$track_tag_group instanceof TrackTagGroup) return []; + $allowed_tags = []; + foreach($track_tag_group->getAllowedTags() as $allowed_tag){ + $allowed_tags[] = $allowed_tag->getId(); + } + $values['allowed_tags'] = $allowed_tags; + + if (!empty($expand)) { + $relations = explode(',', $expand); + foreach ($relations as $relation) { + switch (trim($relation)) { + + case 'allowed_tags':{ + unset($values['allowed_tags']); + $allowed_tags = []; + foreach($track_tag_group->getAllowedTags() as $allowed_tag){ + $allowed_tags[] = SerializerRegistry::getInstance()->getSerializer($allowed_tag)->serialize($expand); + } + $values['allowed_tags'] = $allowed_tags; + } + break; + } + } + } return $values; } } \ No newline at end of file diff --git a/app/ModelSerializers/Summit/Presentation/TrackTagGroupSerializer.php b/app/Models/Foundation/IOrderableEntity.php similarity index 52% rename from app/ModelSerializers/Summit/Presentation/TrackTagGroupSerializer.php rename to app/Models/Foundation/IOrderableEntity.php index fa2d00bf..f0f5797c 100644 --- a/app/ModelSerializers/Summit/Presentation/TrackTagGroupSerializer.php +++ b/app/Models/Foundation/IOrderableEntity.php @@ -1,4 +1,4 @@ - 'name:json_text', - 'Label' => 'label:json_text', - 'Mandatory' => 'is_mandatory:json_boolean', - 'Order' => 'order:json_int', - 'SummitId' => 'summit_id:json_int', - ); + /** + * @return int + */ + public function getOrder(); + + /** + * @param int $order + */ + public function setOrder($order); } \ No newline at end of file diff --git a/app/Models/Foundation/IRecalculateOrderStrategy.php b/app/Models/Foundation/IRecalculateOrderStrategy.php new file mode 100644 index 00000000..c5ec4a33 --- /dev/null +++ b/app/Models/Foundation/IRecalculateOrderStrategy.php @@ -0,0 +1,29 @@ +getOrder(); + + $collection = array_slice($collection,0, count($collection), false); + $max_order = count($collection); + + if($new_order > $max_order) + throw new ValidationException(sprintf("max order is %s", $max_order)); + + unset($collection[$former_order - 1]); + + $collection = array_merge + ( + array_slice($collection, 0, $new_order-1 , true) , + [$entity] , + array_slice($collection, $new_order -1 , count($collection), true) + ); + + $order = 1; + foreach($collection as $e){ + $e->setOrder($order); + $order++; + } + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/DefaultTrackTagGroup.php b/app/Models/Foundation/Summit/DefaultTrackTagGroup.php new file mode 100644 index 00000000..93a360e0 --- /dev/null +++ b/app/Models/Foundation/Summit/DefaultTrackTagGroup.php @@ -0,0 +1,142 @@ +name; + } + + /** + * @param string $name + */ + public function setName($name) + { + $this->name = $name; + } + + /** + * @return string + */ + public function getLabel() + { + return $this->label; + } + + /** + * @param string $label + */ + public function setLabel($label) + { + $this->label = $label; + } + + /** + * @return int + */ + public function getOrder() + { + return $this->order; + } + + /** + * @param int $order + */ + public function setOrder($order) + { + $this->order = $order; + } + + /** + * @return bool + */ + public function isMandatory() + { + return $this->is_mandatory; + } + + /** + * @param bool $is_mandatory + */ + public function setIsMandatory($is_mandatory) + { + $this->is_mandatory = $is_mandatory; + } + + /** + * @return DefaultTrackTagGroupAllowedTag[] + */ + public function getAllowedTags() + { + return $this->allowed_tags; + } + + /** + * @param DefaultTrackTagGroupAllowedTag[] $allowed_tags + */ + public function setAllowedTags($allowed_tags) + { + $this->allowed_tags = $allowed_tags; + } + + public function __construct() + { + parent::__construct(); + $this->allowed_tags = new ArrayCollection; + $this->is_mandatory = false; + } + +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/DefaultTrackTagGroupAllowedTag.php b/app/Models/Foundation/Summit/DefaultTrackTagGroupAllowedTag.php new file mode 100644 index 00000000..b57b133e --- /dev/null +++ b/app/Models/Foundation/Summit/DefaultTrackTagGroupAllowedTag.php @@ -0,0 +1,118 @@ +track_tag_group) ? 0 : $this->track_tag_group->getId(); + } + catch(\Exception $ex){ + return 0; + } + } + + /** + * @return int + */ + public function getTagId(){ + try { + return is_null($this->tag) ? 0 : $this->tag->getId(); + } + catch(\Exception $ex){ + return 0; + } + } + + + /** + * @return bool + */ + public function isDefault() + { + return $this->is_default; + } + + /** + * @param bool $is_default + */ + public function setIsDefault($is_default) + { + $this->is_default = $is_default; + } + + /** + * @return Tag + */ + public function getTag() + { + return $this->tag; + } + + /** + * @param Tag $tag + */ + public function setTag(Tag $tag) + { + $this->tag = $tag; + } + + /** + * @return DefaultTrackTagGroup + */ + public function getTrackTagGroup() + { + return $this->track_tag_group; + } + + /** + * @param DefaultTrackTagGroup $track_tag_group + */ + public function setTrackTagGroup(DefaultTrackTagGroup $track_tag_group) + { + $this->track_tag_group = $track_tag_group; + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Factories/TrackTagGroupFactory.php b/app/Models/Foundation/Summit/Factories/TrackTagGroupFactory.php new file mode 100644 index 00000000..7c19d03f --- /dev/null +++ b/app/Models/Foundation/Summit/Factories/TrackTagGroupFactory.php @@ -0,0 +1,53 @@ +setName(trim($data['name'])); + + if(isset($data['label'])) + $track_tag_group->setLabel(trim($data['label'])); + + if(isset($data['is_mandatory'])){ + $track_tag_group->setIsMandatory(boolval($data['is_mandatory'])); + } + + return $track_tag_group; + } +} \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php b/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php index 3fcbf80c..5e523ee4 100644 --- a/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php +++ b/app/Models/Foundation/Summit/Locations/SummitAbstractLocation.php @@ -11,6 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use App\Models\Foundation\IOrderableEntity; use App\Models\Foundation\Summit\Locations\Banners\ScheduledSummitLocationBanner; use App\Models\Foundation\Summit\Locations\Banners\SummitLocationBanner; use Doctrine\Common\Collections\ArrayCollection; @@ -37,7 +38,7 @@ use Doctrine\ORM\Mapping AS ORM; * Class SummitAbstractLocation * @package models\summit */ -class SummitAbstractLocation extends SilverstripeBaseModel +class SummitAbstractLocation extends SilverstripeBaseModel implements IOrderableEntity { const TypeExternal = 'External'; const TypeInternal = 'Internal'; diff --git a/app/Models/Foundation/Summit/Repositories/IDefaultTrackTagGroupRepository.php b/app/Models/Foundation/Summit/Repositories/IDefaultTrackTagGroupRepository.php new file mode 100644 index 00000000..1ef90a5e --- /dev/null +++ b/app/Models/Foundation/Summit/Repositories/IDefaultTrackTagGroupRepository.php @@ -0,0 +1,22 @@ +getOrder(); $criteria = Criteria::create(); $criteria->orderBy(['order'=> 'ASC']); $filtered_locations = []; @@ -1744,26 +1744,8 @@ SQL; $filtered_locations[] = $l; } - $filtered_locations = array_slice($filtered_locations,0, count($filtered_locations), false); - $max_order = count($filtered_locations); - - if($new_order > $max_order) - throw new ValidationException(sprintf("max order is %s", $max_order)); - - unset($filtered_locations[$former_order - 1]); - - $filtered_locations = array_merge - ( - array_slice($filtered_locations, 0, $new_order -1 , true) , - [$location] , - array_slice($filtered_locations, $new_order -1 , count($filtered_locations), true) - ); - - $order = 1; - foreach($filtered_locations as $l){ - $l->setOrder($order); - $order++; - } + $strategy = new RecalculateOrderStrategy(); + $strategy->recalculateOrder($filtered_locations, $location, $new_order); } /** @@ -2299,4 +2281,91 @@ SQL; $res = $native_query->getResult(); return count($res) > 0 ? $res[0] : null; } + + /** + * @param string $name + * @return null|TrackTagGroup + */ + public function getTrackTagGroupByName($name){ + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq('name', $name)); + $track_tag_group = $this->track_tag_groups->matching($criteria)->first(); + return !$track_tag_group ? null : $track_tag_group; + } + + /** + * @return TrackTagGroup[]|ArrayCollection + */ + public function getTrackTagGroups(){ + return $this->track_tag_groups; + } + + /** + * @param string $label + * @return null|TrackTagGroup + */ + public function getTrackTagGroupByLabel($label){ + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq('label', $label)); + $track_tag_group = $this->track_tag_groups->matching($criteria)->first(); + return !$track_tag_group ? null : $track_tag_group; + } + + /** + * @param TrackTagGroup $track_tag_group + * @return $this + */ + public function addTrackTagGroup(TrackTagGroup $track_tag_group) + { + if($this->track_tag_groups->contains($track_tag_group)) return $this; + $this->track_tag_groups->add($track_tag_group); + $track_tag_group->setSummit($this); + $track_tag_group->setOrder($this->getTrackTagGroupMaxOrder() + 1); + return $this; + } + + /** + * @param TrackTagGroup $track_tag_group + * @return $this + */ + public function removeTrackTagGroup(TrackTagGroup $track_tag_group){ + if(!$this->track_tag_groups->contains($track_tag_group)) return $this; + $this->track_tag_groups->removeElement($track_tag_group); + return $this; + } + + /** + * @return int + */ + private function getTrackTagGroupMaxOrder(){ + $criteria = Criteria::create(); + $criteria->orderBy(['order' => 'DESC']); + $group = $this->track_tag_groups->matching($criteria)->first(); + return $group === false ? 0 : $group->getOrder(); + } + + /** + * @param TrackTagGroup $track_tag_group + * @param int $new_order + * @throws ValidationException + */ + public function recalculateTrackTagGroupOrder(TrackTagGroup $track_tag_group, $new_order){ + + $criteria = Criteria::create(); + $criteria->orderBy(['order'=> 'ASC']); + $strategy = new RecalculateOrderStrategy(); + $strategy->recalculateOrder($this->track_tag_groups->matching($criteria)->toArray(), $track_tag_group, $new_order); + } + + /** + * @param int $track_tag_group_id + * @return TrackTagGroup|null + */ + public function getTrackTagGroup($track_tag_group_id) + { + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq('id', intval($track_tag_group_id))); + $track_tag_group = $this->track_tag_groups->matching($criteria)->first(); + return $track_tag_group === false ? null : $track_tag_group; + } } diff --git a/app/Models/Foundation/Summit/TrackTagGroup.php b/app/Models/Foundation/Summit/TrackTagGroup.php index a3f7c050..5cdaddc6 100644 --- a/app/Models/Foundation/Summit/TrackTagGroup.php +++ b/app/Models/Foundation/Summit/TrackTagGroup.php @@ -11,8 +11,10 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use App\Models\Foundation\IOrderableEntity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Cache; +use models\main\Tag; use models\summit\SummitOwned; use models\utils\SilverstripeBaseModel; use Doctrine\ORM\Mapping AS ORM; @@ -22,8 +24,40 @@ use Doctrine\ORM\Mapping AS ORM; * Class TrackTagGroup * @package models\summit\TrackTagGroup */ -class TrackTagGroup extends SilverstripeBaseModel +class TrackTagGroup extends SilverstripeBaseModel implements IOrderableEntity { + use SummitOwned; + + /** + * @ORM\Column(name="Name", type="string") + * @var string + */ + private $name; + + /** + * @ORM\Column(name="Label", type="string") + * @var string + */ + private $label; + + /** + * @ORM\Column(name="`Order`", type="integer") + * @var int + */ + private $order; + + /** + * @ORM\Column(name="Mandatory", type="boolean") + * @var boolean + */ + private $is_mandatory; + + /** + * @ORM\OneToMany(targetEntity="TrackTagGroupAllowedTag", mappedBy="track_tag_group", cascade={"persist"}, orphanRemoval=true) + * @var TrackTagGroupAllowedTag[] + */ + private $allowed_tags; + /** * @return string */ @@ -104,42 +138,29 @@ class TrackTagGroup extends SilverstripeBaseModel $this->allowed_tags = $allowed_tags; } - use SummitOwned; - - /** - * @ORM\Column(name="Name", type="string") - * @var string - */ - private $name; - - /** - * @ORM\Column(name="Label", type="string") - * @var string - */ - private $label; - - /** - * @ORM\Column(name="Order", type="integer") - * @var int - */ - private $order; - - /** - * @ORM\Column(name="Mandatory", type="boolean") - * @var boolean - */ - private $is_mandatory; - - /** - * @ORM\OneToMany(targetEntity="TrackTagGroupAllowedTag", mappedBy="track_tag_group", cascade={"persist"}, orphanRemoval=true) - * @var TrackTagGroupAllowedTag[] - */ - private $allowed_tags; - - public function __construct() { + parent::__construct(); $this->allowed_tags = new ArrayCollection; + $this->is_mandatory = false; + } + + public function clearAllowedTags() + { + $this->allowed_tags->clear(); + } + + /** + * @param Tag $tag + * @param bool $is_default + */ + public function addTag(Tag $tag, $is_default = false) + { + $allowed_tag = new TrackTagGroupAllowedTag(); + $allowed_tag->setTag($tag); + $allowed_tag->setTrackTagGroup($this); + $allowed_tag->setIsDefault($is_default); + $this->allowed_tags->add($allowed_tag); } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/TrackTagGroupAllowedTag.php b/app/Models/Foundation/Summit/TrackTagGroupAllowedTag.php index 79c17c43..9564a67a 100644 --- a/app/Models/Foundation/Summit/TrackTagGroupAllowedTag.php +++ b/app/Models/Foundation/Summit/TrackTagGroupAllowedTag.php @@ -32,7 +32,7 @@ class TrackTagGroupAllowedTag extends BaseEntity private $is_default; /** - * @ORM\ManyToOne(targetEntity="models\main\Tag") + * @ORM\ManyToOne(targetEntity="models\main\Tag", cascade={"persist"}) * @ORM\JoinColumn(name="TagID", referencedColumnName="ID") * @var Tag */ diff --git a/app/Repositories/RepositoriesProvider.php b/app/Repositories/RepositoriesProvider.php index 866ca2d8..dd61cc3c 100644 --- a/app/Repositories/RepositoriesProvider.php +++ b/app/Repositories/RepositoriesProvider.php @@ -12,9 +12,11 @@ * limitations under the License. **/ use App\Models\Foundation\Summit\Defaults\DefaultSummitEventType; +use App\Models\Foundation\Summit\DefaultTrackTagGroup; 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\IDefaultTrackTagGroupRepository; use App\Models\Foundation\Summit\Repositories\IPresentationCategoryGroupRepository; use App\Models\Foundation\Summit\Repositories\IPresentationSpeakerSummitAssistanceConfirmationRequestRepository; use App\Models\Foundation\Summit\Repositories\IRSVPTemplateRepository; @@ -346,5 +348,12 @@ final class RepositoriesProvider extends ServiceProvider } ); + App::singleton( + IDefaultTrackTagGroupRepository::class, + function(){ + return EntityManager::getRepository(DefaultTrackTagGroup::class); + } + ); + } } \ No newline at end of file diff --git a/app/Repositories/Summit/DoctrineDefaultTrackTagGroupRepository.php b/app/Repositories/Summit/DoctrineDefaultTrackTagGroupRepository.php new file mode 100644 index 00000000..453f2e0f --- /dev/null +++ b/app/Repositories/Summit/DoctrineDefaultTrackTagGroupRepository.php @@ -0,0 +1,32 @@ +tag_repository = $tag_repository; + $this->default_track_tag_group_repository = $default_track_tag_group_repository; + } + + /** + * @param Summit $summit + * @param array $data + * @return TrackTagGroup + * @throws EntityNotFoundException + * @throws ValidationException + * @throws \Exception + */ + public function addTrackTagGroup(Summit $summit, array $data) + { + return $this->tx_service->transaction(function() use($summit, $data) { + + if(isset($data['label'])){ + $former_group = $summit->getTrackTagGroupByLabel(trim($data['label'])); + if(!is_null($former_group)){ + throw new ValidationException(trans + ( + 'validation_errors.SummitTrackTagGroupService.addTrackTagGroup.TrackTagGroupLabelAlreadyExists', + [ + 'summit_id' => $summit->getId() + ] + )); + } + } + + if(isset($data['name'])){ + $former_group = $summit->getTrackTagGroupByName(trim($data['name'])); + if(!is_null($former_group)){ + throw new ValidationException(trans + ( + 'validation_errors.SummitTrackTagGroupService.addTrackTagGroup.TrackTagGroupNameAlreadyExists', + [ + 'summit_id' => $summit->getId() + ] + )); + } + } + + $track_tag_group = TrackTagGroupFactory::build($summit, $data); + + if (isset($data['allowed_tags'])) { + $track_tag_group->clearAllowedTags(); + foreach ($data['allowed_tags'] as $str_tag) { + $tag = $this->tag_repository->getByTag($str_tag); + if($tag == null) $tag = new Tag($str_tag); + $track_tag_group->addTag($tag); + } + } + + $summit->addTrackTagGroup($track_tag_group); + + return $track_tag_group; + }); + } + + /** + * @param Summit $summit + * @param int $track_tag_group_id + * @param array $data + * @return TrackTagGroup + * @throws EntityNotFoundException + * @throws ValidationException + */ + public function updateTrackTagGroup(Summit $summit, $track_tag_group_id, array $data) + { + return $this->tx_service->transaction(function() use($summit, $track_tag_group_id, $data) { + + if(isset($data['label'])){ + $former_group = $summit->getTrackTagGroupByLabel(trim($data['label'])); + if(!is_null($former_group) && $former_group->getId() != $track_tag_group_id ){ + throw new ValidationException(trans + ( + 'validation_errors.SummitTrackTagGroupService.updateTrackTagGroup.TrackTagGroupLabelAlreadyExists', + [ + 'summit_id' => $summit->getId() + ] + )); + } + } + + if(isset($data['name'])){ + $former_group = $summit->getTrackTagGroupByName(trim($data['name'])); + if(!is_null($former_group) && $former_group->getId() != $track_tag_group_id ){ + throw new ValidationException(trans + ( + 'validation_errors.SummitTrackTagGroupService.updateTrackTagGroup.TrackTagGroupNameAlreadyExists', + [ + 'summit_id' => $summit->getId() + ] + )); + } + } + + $track_tag_group = $summit->getTrackTagGroup($track_tag_group_id); + + if(is_null($track_tag_group)){ + throw new EntityNotFoundException + ( + trans("not_found_errors.SummitTrackTagGroupService.updateTrackTagGroup.TrackTagGroupNotFound", [ + 'summit_id' => $summit->getId(), + 'track_tag_group_id' => $track_tag_group_id, + ]) + ); + } + + if (isset($data['allowed_tags'])) { + $track_tag_group->clearAllowedTags(); + foreach ($data['allowed_tags'] as $str_tag) { + $tag = $this->tag_repository->getByTag($str_tag); + if($tag == null) $tag = new Tag($str_tag); + $track_tag_group->addTag($tag); + } + } + + if (isset($data['order']) && intval($data['order']) != $track_tag_group->getOrder()) { + // request to update order + $summit->recalculateTrackTagGroupOrder($track_tag_group, intval($data['order'])); + } + + return $track_tag_group; + }); + } + + /** + * @param Summit $summit + * @param int $track_tag_group_id + * @return void + * @throws EntityNotFoundException + * @throws ValidationException + */ + public function deleteTrackTagGroup(Summit $summit, $track_tag_group_id) + { + $this->tx_service->transaction(function() use($summit, $track_tag_group_id) { + $track_tag_group = $summit->getTrackTagGroup($track_tag_group_id); + + if(is_null($track_tag_group)){ + throw new EntityNotFoundException + ( + trans("not_found_errors.SummitTrackTagGroupService.deleteTrackTagGroup.TrackTagGroupNotFound", [ + 'summit_id' => $summit->getId(), + 'track_tag_group_id' => $track_tag_group_id, + ]) + ); + } + + $summit->removeTrackTagGroup($track_tag_group); + }); + } + + /** + * @param Summit $summit + * @return void + */ + public function seedDefaultTrackTagGroups(Summit $summit) + { + $this->tx_service->transaction(function() use($summit) { + $default_groups = $this->default_track_tag_group_repository->getAll(); + foreach($default_groups as $default_track_tag_group){ + // if already exists ... + if($summit->getTrackTagGroupByLabel($default_track_tag_group->getLabel())) + continue; + + $new_group = new TrackTagGroup(); + $new_group->setName($default_track_tag_group->getName()); + $new_group->setLabel($default_track_tag_group->getLabel()); + $new_group->setOrder($default_track_tag_group->getOrder()); + $new_group->setIsMandatory($default_track_tag_group->isMandatory()); + $summit->addTrackTagGroup($new_group); + + foreach ($default_track_tag_group->getAllowedTags() as $default_allowed_tag){ + $new_group->addTag($default_allowed_tag->getTag()); + } + } + }); + } +} \ No newline at end of file diff --git a/app/Services/ServicesProvider.php b/app/Services/ServicesProvider.php index 1be212a1..f0bc90e2 100644 --- a/app/Services/ServicesProvider.php +++ b/app/Services/ServicesProvider.php @@ -30,6 +30,7 @@ use App\Services\Model\ISummitPushNotificationService; use App\Services\Model\ISummitSelectionPlanService; use App\Services\Model\ISummitTicketTypeService; use App\Services\Model\ISummitTrackService; +use App\Services\Model\ISummitTrackTagGroupService; use App\Services\Model\OrganizationService; use App\Services\Model\PresentationCategoryGroupService; use App\Services\Model\SummitLocationService; @@ -40,6 +41,7 @@ use App\Services\Model\SummitPushNotificationService; use App\Services\Model\SummitSelectionPlanService; use App\Services\Model\SummitTicketTypeService; use App\Services\Model\SummitTrackService; +use App\Services\Model\SummitTrackTagGroupService; use App\Services\SummitEventTypeService; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Config; @@ -243,5 +245,10 @@ final class ServicesProvider extends ServiceProvider IOrganizationService::class, OrganizationService::class ); + + App::singleton( + ISummitTrackTagGroupService::class, + SummitTrackTagGroupService::class + ); } } \ No newline at end of file diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index cccb6096..791c65fa 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -1758,6 +1758,14 @@ class ApiEndpointsSeeder extends Seeder ], ], // track tag groups + [ + 'name' => 'get-track-tag-groups', + 'route' => '/api/v1/summits/{id}/track-tag-groups', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadAllSummitData, $current_realm) + ], + ], [ 'name' => 'get-track-tag-groups-allowed-tags', 'route' => '/api/v1/summits/{id}/track-tag-groups/all/allowed-tags', @@ -1765,6 +1773,50 @@ class ApiEndpointsSeeder extends Seeder 'scopes' => [ sprintf(SummitScopes::ReadAllSummitData, $current_realm) ], + ], + [ + 'name' => 'get-track-tag-group', + 'route' => '/api/v1/summits/{id}/track-tag-groups/{track_tag_group_id}', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadAllSummitData, $current_realm) + ], + ], + [ + 'name' => 'seed-default-track-tag-groups', + 'route' => '/api/v1/summits/{id}/track-tag-groups/seed-defaults', + 'http_method' => 'PUT', + 'scopes' => [ + sprintf(SummitScopes::WriteSummitData, $current_realm), + sprintf(SummitScopes::WriteTrackTagGroupsData, $current_realm) + ], + ], + [ + 'name' => 'add-track-tag-group', + 'route' => '/api/v1/summits/{id}/track-tag-groups', + 'http_method' => 'POST', + 'scopes' => [ + sprintf(SummitScopes::WriteSummitData, $current_realm), + sprintf(SummitScopes::WriteTrackTagGroupsData, $current_realm) + ], + ], + [ + 'name' => 'update-track-tag-group', + 'route' => '/api/v1/summits/{id}/track-tag-groups/{track_tag_group_id}', + 'http_method' => 'PUT', + 'scopes' => [ + sprintf(SummitScopes::WriteSummitData, $current_realm), + sprintf(SummitScopes::WriteTrackTagGroupsData, $current_realm) + ] + ], + [ + 'name' => 'delete-track-tag-group', + 'route' => '/api/v1/summits/{id}/track-tag-groups/{track_tag_group_id}', + 'http_method' => 'DELETE', + 'scopes' => [ + sprintf(SummitScopes::WriteSummitData, $current_realm), + sprintf(SummitScopes::WriteTrackTagGroupsData, $current_realm) + ] ] ]); } diff --git a/database/seeds/ApiScopesSeeder.php b/database/seeds/ApiScopesSeeder.php index 08354ae4..aa38315c 100644 --- a/database/seeds/ApiScopesSeeder.php +++ b/database/seeds/ApiScopesSeeder.php @@ -145,6 +145,11 @@ final class ApiScopesSeeder extends Seeder 'short_description' => 'Write Summit Location Banners Data', 'description' => 'Grants write access for Summit Location Banners Data', ], + [ + 'name' => sprintf(SummitScopes::WriteTrackTagGroupsData, $current_realm), + 'short_description' => 'Write Summit Track Tag Groups Data', + 'description' => 'Grants write access for Summit Track Tag Groups Data', + ], ]; foreach ($scopes as $scope_info) { diff --git a/resources/lang/en/not_found_errors.php b/resources/lang/en/not_found_errors.php index 924788a8..4e194885 100644 --- a/resources/lang/en/not_found_errors.php +++ b/resources/lang/en/not_found_errors.php @@ -87,4 +87,7 @@ return [ 'PresentationService.saveOrUpdatePresentation.trackNotFound' => 'track :track_id not found.', 'PresentationService.submitPresentation.eventTypeNotFound' => 'event type :type_id not found.', 'PresentationService.saveOrUpdatePresentation.trackQuestionNotFound' => 'extra question :question_id not found.', + // track tag groups + 'SummitTrackTagGroupService.updateTrackTagGroup.TrackTagGroupNotFound' => 'track tag group :track_tag_group_id not found on summit :summit_id', + 'SummitTrackTagGroupService.deleteTrackTagGroup.TrackTagGroupNotFound' => 'track tag group :track_tag_group_id not found on summit :summit_id' ]; \ No newline at end of file diff --git a/resources/lang/en/validation_errors.php b/resources/lang/en/validation_errors.php index 710adecf..6ef82e48 100644 --- a/resources/lang/en/validation_errors.php +++ b/resources/lang/en/validation_errors.php @@ -85,4 +85,9 @@ return [ 'PresentationService.submitPresentation.limitReached' => 'You reached the limit :limit of presentations.', // organizations 'OrganizationService.addOrganization.alreadyExistName' => 'Organization name :name already exists!', + // track tag groups + 'SummitTrackTagGroupService.addTrackTagGroup.TrackTagGroupLabelAlreadyExists' => 'track tag group label already exist on summit :summit_id', + 'SummitTrackTagGroupService.addTrackTagGroup.TrackTagGroupNameAlreadyExists' => 'track tag group name already exist on summit :summit_id', + 'SummitTrackTagGroupService.updateTrackTagGroup.TrackTagGroupLabelAlreadyExists' => 'track tag group label already exist on summit :summit_id', + 'SummitTrackTagGroupService.updateTrackTagGroup.TrackTagGroupNameAlreadyExists' => 'track tag group name already exist on summit :summit_id', ]; \ No newline at end of file diff --git a/tests/OAuth2SummitTrackTagGroupsApiControllerTest.php b/tests/OAuth2SummitTrackTagGroupsApiControllerTest.php deleted file mode 100644 index 2e03979c..00000000 --- a/tests/OAuth2SummitTrackTagGroupsApiControllerTest.php +++ /dev/null @@ -1,48 +0,0 @@ - $summit_id, - //AND FILTER - 'filter' => ['tag=@101'], - 'order' => '+id', - 'expand' => 'tag,track_tag_group' - ]; - - $headers = ["HTTP_Authorization" => " Bearer " . $this->access_token]; - $response = $this->action( - "GET", - "OAuth2SummitTrackTagGroupsApiController@getAllowedTags", - $params, - [], - [], - [], - $headers - ); - - $content = $response->getContent(); - $tags = json_decode($content); - $this->assertTrue(!is_null($tags)); - $this->assertResponseStatus(200); - } - -} \ No newline at end of file diff --git a/tests/OAuth2TrackTagGroupsApiTest.php b/tests/OAuth2TrackTagGroupsApiTest.php new file mode 100644 index 00000000..53da0baf --- /dev/null +++ b/tests/OAuth2TrackTagGroupsApiTest.php @@ -0,0 +1,209 @@ + $summit_id, + 'expand' => 'allowed_tags,tag', + ]; + + $headers = ["HTTP_Authorization" => " Bearer " . $this->access_token]; + $response = $this->action( + "GET", + "OAuth2SummitTrackTagGroupsApiController@getTrackTagGroupsBySummit", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $groups = json_decode($content); + $this->assertTrue(!is_null($groups)); + $this->assertResponseStatus(200); + } + + /** + * @param int $summit_id + * @return mixed + */ + public function testAddTrackTagGroup($summit_id = 25){ + $params = [ + 'id' => $summit_id, + 'expand' => 'allowed_tags,tag' + ]; + + $name = str_random(16).'_track_tag_group_name'; + $label = str_random(16).'_track_tag_group_label'; + $data = [ + 'name' => $name, + 'label' => $label, + 'is_mandatory' => false, + 'allowed_tags' => ['101','Case Study', 'Demo'], + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "POST", + "OAuth2SummitTrackTagGroupsApiController@addTrackTagGroup", + $params, + [], + [], + [], + $headers, + json_encode($data) + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $track_tag_group = json_decode($content); + $this->assertTrue(!is_null($track_tag_group)); + return $track_tag_group; + } + + /** + * @param int $summit_id + * @return mixed + */ + public function testUpdateTrackTagGroup($summit_id = 25){ + $new_track_tag_group = $this->testAddTrackTagGroup($summit_id); + $params = [ + 'id' => $summit_id, + 'track_tag_group_id' => $new_track_tag_group->id, + 'expand' => 'allowed_tags,tag' + ]; + + $name = str_random(16).'_track_tag_group_name_update'; + $label = str_random(16).'_track_tag_group_label_update'; + $data = [ + 'name' => $name, + 'label' => $label, + 'order' => 1, + 'allowed_tags' => ['101','Case Study', 'Demo', 'Demo2'], + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "PUT", + "OAuth2SummitTrackTagGroupsApiController@updateTrackTagGroup", + $params, + [], + [], + [], + $headers, + json_encode($data) + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $track_tag_group = json_decode($content); + $this->assertTrue(!is_null($track_tag_group)); + $this->assertTrue($track_tag_group->order == 1); + return $track_tag_group; + } + + public function testDeleteTrackTagGroup($summit_id = 25){ + $new_track_tag_group = $this->testAddTrackTagGroup($summit_id); + $params = [ + 'id' => $summit_id, + 'track_tag_group_id' => $new_track_tag_group->id, + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "DELETE", + "OAuth2SummitTrackTagGroupsApiController@deleteTrackTagGroup", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(204); + } + + public function testGetTrackTagGroupById($summit_id = 25){ + $new_track_tag_group = $this->testAddTrackTagGroup($summit_id); + $params = [ + 'id' => $summit_id, + 'track_tag_group_id' => $new_track_tag_group->id, + 'expand' => 'allowed_tags,tag' + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "GET", + "OAuth2SummitTrackTagGroupsApiController@getTrackTagGroup", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + } + + public function testGetTags($summit_id = 25) + { + + $params = [ + 'id' => $summit_id, + //AND FILTER + 'filter' => ['tag=@101'], + 'order' => '+id', + 'expand' => 'tag,track_tag_group' + ]; + + $headers = ["HTTP_Authorization" => " Bearer " . $this->access_token]; + $response = $this->action( + "GET", + "OAuth2SummitTrackTagGroupsApiController@getAllowedTags", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $tags = json_decode($content); + $this->assertTrue(!is_null($tags)); + $this->assertResponseStatus(200); + } +} \ No newline at end of file