From 9a360b00b158c5aa9de9f623f3375705ae9d4067 Mon Sep 17 00:00:00 2001 From: Sebastian Marcet Date: Wed, 21 Mar 2018 18:45:57 -0300 Subject: [PATCH] Added get ticket types endpoints GET /api/v1/summits/{id}/ticket-types GET /api/v1/summits/{id}/ticket-types/csv Filters * name (=@, ==) * description (=@, ==) * external_id (=@, ==) Order * id * name * external_id Change-Id: I0988947da1d9913b7507d9b30912d47f38773a64 --- .../OAuth2SummitsEventTypesApiController.php | 85 +++--- .../OAuth2SummitsTicketTypesApiController.php | 262 ++++++++++++++++++ app/Http/routes.php | 6 + .../Summit/SummitTicketTypeSerializer.php | 9 +- .../ISummitTicketTypeRepository.php | 19 +- .../Foundation/Summit/SummitTicketType.php | 31 ++- .../DoctrineSummitEventTypeRepository.php | 1 - .../DoctrineSummitTicketTypeRepository.php | 83 ++++++ app/Services/Model/AbstractService.php | 34 +++ app/Services/Model/AttendeeService.php | 12 +- app/Services/Model/FolderService.php | 11 +- .../Model/ISummitTicketTypeService.php | 18 ++ app/Services/Model/MemberService.php | 10 +- app/Services/Model/PresentationService.php | 12 +- app/Services/Model/RSVPTemplateService.php | 11 +- app/Services/Model/SpeakerService.php | 13 +- app/Services/Model/SummitEventTypeService.php | 13 +- app/Services/Model/SummitLocationService.php | 11 +- app/Services/Model/SummitPromoCodeService.php | 11 +- app/Services/Model/SummitService.php | 11 +- .../Model/SummitTicketTypeService.php | 24 ++ app/Services/Model/SummitTrackService.php | 11 +- app/Services/ServicesProvider.php | 9 +- database/seeds/ApiEndpointsSeeder.php | 19 ++ tests/OAuth2TicketTypesApiTest.php | 52 ++++ 25 files changed, 642 insertions(+), 136 deletions(-) create mode 100644 app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php create mode 100644 app/Services/Model/AbstractService.php create mode 100644 app/Services/Model/ISummitTicketTypeService.php create mode 100644 app/Services/Model/SummitTicketTypeService.php create mode 100644 tests/OAuth2TicketTypesApiTest.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php index 237f2319..f7cadc86 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php @@ -69,21 +69,6 @@ final class OAuth2SummitsEventTypesApiController extends OAuth2ProtectedControll $this->event_type_service = $event_type_service; } - /** - * @param $filter_element - * @return bool - */ - private function validateClassName($filter_element){ - if($filter_element instanceof FilterElement){ - return in_array($filter_element->getValue(), SummitEventTypeConstants::$valid_class_names); - } - $valid = true; - foreach($filter_element[0] as $elem){ - $valid = $valid && in_array($elem->getValue(), SummitEventTypeConstants::$valid_class_names); - } - return $valid; - } - /** * @param $summit_id * @return mixed @@ -136,6 +121,29 @@ final class OAuth2SummitsEventTypesApiController extends OAuth2ProtectedControll ]); } + if(is_null($filter)) $filter = new Filter(); + + $filter->validate([ + 'class_name' => sprintf('sometimes|in:%s',implode(',', SummitEventTypeConstants::$valid_class_names)), + 'name' => 'sometimes|string', + 'is_default' => 'sometimes|boolean', + 'black_out_times' => 'sometimes|boolean', + 'use_sponsors' => 'sometimes|boolean', + 'are_sponsors_mandatory' => 'sometimes|boolean', + 'allows_attachment' => 'sometimes|boolean', + 'use_speakers' => 'sometimes|boolean', + 'are_speakers_mandatory' => 'sometimes|boolean', + 'use_moderator' => 'sometimes|boolean', + 'is_moderator_mandatory' => 'sometimes|boolean', + 'should_be_available_on_cfp' => 'sometimes|boolean', + ], [ + 'class_name.in' => sprintf + ( + ":attribute has an invalid value ( valid values are %s )", + implode(", ", SummitEventTypeConstants::$valid_class_names) + ), + ]); + $order = null; if (Input::has('order')) @@ -147,18 +155,6 @@ final class OAuth2SummitsEventTypesApiController extends OAuth2ProtectedControll ]); } - if(is_null($filter)) $filter = new Filter(); - - if($filter->hasFilter("class_name") && !$this->validateClassName($filter->getFilter("class_name"))){ - throw new ValidationException( - sprintf - ( - "class_name filter has an invalid value ( valid values are %s", - implode(", ", SummitEventTypeConstants::$valid_class_names) - ) - ); - } - $data = $this->repository->getBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); return $this->ok @@ -242,6 +238,29 @@ final class OAuth2SummitsEventTypesApiController extends OAuth2ProtectedControll ]); } + if(is_null($filter)) $filter = new Filter(); + + $filter->validate([ + 'class_name' => sprintf('sometimes|in:%s',implode(',', SummitEventTypeConstants::$valid_class_names)), + 'name' => 'sometimes|string', + 'is_default' => 'sometimes|boolean', + 'black_out_times' => 'sometimes|boolean', + 'use_sponsors' => 'sometimes|boolean', + 'are_sponsors_mandatory' => 'sometimes|boolean', + 'allows_attachment' => 'sometimes|boolean', + 'use_speakers' => 'sometimes|boolean', + 'are_speakers_mandatory' => 'sometimes|boolean', + 'use_moderator' => 'sometimes|boolean', + 'is_moderator_mandatory' => 'sometimes|boolean', + 'should_be_available_on_cfp' => 'sometimes|boolean', + ], [ + 'class_name.in' => sprintf + ( + ":attribute has an invalid value ( valid values are %s )", + implode(", ", SummitEventTypeConstants::$valid_class_names) + ), + ]); + $order = null; if (Input::has('order')) @@ -253,18 +272,6 @@ final class OAuth2SummitsEventTypesApiController extends OAuth2ProtectedControll ]); } - if(is_null($filter)) $filter = new Filter(); - - if($filter->hasFilter("class_name") && !$this->validateClassName($filter->getFilter("class_name"))){ - throw new ValidationException( - sprintf - ( - "class_name filter has an invalid value ( valid values are %s", - implode(", ", SummitEventTypeConstants::$valid_class_names) - ) - ); - } - $data = $this->repository->getBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); $filename = "event-types-" . date('Ymd'); diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php new file mode 100644 index 00000000..ab00f6f0 --- /dev/null +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsTicketTypesApiController.php @@ -0,0 +1,262 @@ +repository = $repository; + $this->summit_repository = $summit_repository; + $this->ticket_type_service = $ticket_type_service; + } + + /** + * @param $summit_id + * @return mixed + */ + public function getAllBySummit($summit_id){ + $values = Input::all(); + $rules = [ + + 'page' => 'integer|min:1', + 'per_page' => 'required_with:page|integer|min:5|max:100', + ]; + + 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 = 5; + + 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' => ['=@', '=='], + 'external_id' => ['=@', '=='], + ]); + } + + if(is_null($filter)) $filter = new Filter(); + + $filter->validate([ + 'name' => 'sometimes|string', + 'description' => 'sometimes|string', + 'external_id' => 'sometimes|string', + ]); + + $order = null; + + if (Input::has('order')) + { + $order = OrderParser::parse(Input::get('order'), [ + 'id', + 'name', + 'external_id' + ]); + } + + $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(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); + } + } + + /** + * @param $summit_id + * @return mixed + */ + public function getAllBySummitCSV($summit_id){ + $values = Input::all(); + $rules = [ + ]; + + 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 = 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' => ['=@', '=='], + 'external_id' => ['=@', '=='], + ]); + } + + + if(is_null($filter)) $filter = new Filter(); + + $filter->validate([ + 'name' => 'sometimes|string', + 'description' => 'sometimes|string', + 'external_id' => 'sometimes|string', + ]); + + $order = null; + + if (Input::has('order')) + { + $order = OrderParser::parse(Input::get('order'), [ + 'id', + 'name', + 'external_id' + ]); + } + + $data = $this->repository->getBySummit($summit, new PagingInfo($page, $per_page), $filter, $order); + + $filename = "ticket-types-" . 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/routes.php b/app/Http/routes.php index b90f2b06..0240a9c7 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -421,6 +421,12 @@ Route::group([ }); }); + // ticket types + Route::group(['prefix' => 'ticket-types'], function () { + Route::get('', 'OAuth2SummitsTicketTypesApiController@getAllBySummit'); + Route::get('csv', 'OAuth2SummitsTicketTypesApiController@getAllBySummitCSV'); + }); + // external orders Route::group(['prefix' => 'external-orders'], function () { Route::get('{external_order_id}', 'OAuth2SummitApiController@getExternalOrder'); diff --git a/app/ModelSerializers/Summit/SummitTicketTypeSerializer.php b/app/ModelSerializers/Summit/SummitTicketTypeSerializer.php index e5cf0529..6bf2b2a2 100644 --- a/app/ModelSerializers/Summit/SummitTicketTypeSerializer.php +++ b/app/ModelSerializers/Summit/SummitTicketTypeSerializer.php @@ -16,13 +16,14 @@ * Class SummitTicketTypeSerializer * @package ModelSerializers */ -class SummitTicketTypeSerializer extends SilverStripeSerializer +final class SummitTicketTypeSerializer extends SilverStripeSerializer { - protected static $array_mappings = array - ( + protected static $array_mappings = [ 'Name' => 'name:json_string', 'Description' => 'description:json_string', - ); + 'ExternalId' => 'external_id:json_string', + 'SummitId' => 'summit_id:json_int', + ]; /** * @param null $expand diff --git a/app/Models/Foundation/Summit/Repositories/ISummitTicketTypeRepository.php b/app/Models/Foundation/Summit/Repositories/ISummitTicketTypeRepository.php index 6e41083c..20484b92 100644 --- a/app/Models/Foundation/Summit/Repositories/ISummitTicketTypeRepository.php +++ b/app/Models/Foundation/Summit/Repositories/ISummitTicketTypeRepository.php @@ -12,11 +12,28 @@ * limitations under the License. **/ use models\utils\IBaseRepository; +use utils\Filter; +use utils\Order; +use utils\PagingInfo; +use utils\PagingResponse; /** * Interface ISummitTicketTypeRepository * @package models\summit */ interface ISummitTicketTypeRepository extends IBaseRepository { - + /** + * @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 + ); } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/SummitTicketType.php b/app/Models/Foundation/Summit/SummitTicketType.php index 60df9610..5e13c527 100644 --- a/app/Models/Foundation/Summit/SummitTicketType.php +++ b/app/Models/Foundation/Summit/SummitTicketType.php @@ -30,6 +30,18 @@ class SummitTicketType extends SilverstripeBaseModel */ private $name; + /** + * @ORM\Column(name="Description", type="string") + * @var string + */ + private $description; + + /** + * @ORM\Column(name="ExternalId", type="string") + * @var string + */ + private $external_id; + /** * @return string */ @@ -62,23 +74,18 @@ class SummitTicketType extends SilverstripeBaseModel $this->description = $description; } - /** - * @ORM\Column(name="Description", type="string") - * @var string - */ - private $description; - - /** - * @ORM\Column(name="ExternalId", type="string") - * @var string - */ - private $external_id; - /** * @return string */ public function getExternalId(){return $this->external_id; } + /** + * @param string $external_id + */ + public function setExternalId($external_id) + { + $this->external_id = $external_id; + } public function __construct() { diff --git a/app/Repositories/Summit/DoctrineSummitEventTypeRepository.php b/app/Repositories/Summit/DoctrineSummitEventTypeRepository.php index 06cdf190..8a9b29c2 100644 --- a/app/Repositories/Summit/DoctrineSummitEventTypeRepository.php +++ b/app/Repositories/Summit/DoctrineSummitEventTypeRepository.php @@ -22,7 +22,6 @@ use utils\Filter; use utils\Order; use utils\PagingInfo; use utils\PagingResponse; - /** * Class DoctrineSummitEventTypeRepository * @package App\Repositories\Summit diff --git a/app/Repositories/Summit/DoctrineSummitTicketTypeRepository.php b/app/Repositories/Summit/DoctrineSummitTicketTypeRepository.php index 68386460..55b7ff94 100644 --- a/app/Repositories/Summit/DoctrineSummitTicketTypeRepository.php +++ b/app/Repositories/Summit/DoctrineSummitTicketTypeRepository.php @@ -12,8 +12,14 @@ * limitations under the License. **/ use App\Repositories\SilverStripeDoctrineRepository; +use Doctrine\ORM\Tools\Pagination\Paginator; use models\summit\ISummitTicketTypeRepository; +use models\summit\Summit; use models\summit\SummitTicketType; +use utils\Filter; +use utils\Order; +use utils\PagingInfo; +use utils\PagingResponse; /** * Class DoctrineSummitTicketTypeRepository * @package App\Repositories\Summit @@ -29,4 +35,81 @@ final class DoctrineSummitTicketTypeRepository { return SummitTicketType::class; } + + protected function getFilterMappings() + { + return [ + 'name' => 'tt.name:json_string', + 'description' => 'tt.description:json_string', + 'external_id' => 'tt.external_id:json_string', + ]; + } + + /** + * @return array + */ + protected function getOrderMappings() + { + return [ + 'name' => 'tt.name', + 'id' => 'tt.id', + 'external_id' => 'tt.external_id', + ]; + } + + /** + * @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("tt") + ->from(SummitTicketType::class, "tt") + ->leftJoin('tt.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("tt.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/AbstractService.php b/app/Services/Model/AbstractService.php new file mode 100644 index 00000000..496e2c45 --- /dev/null +++ b/app/Services/Model/AbstractService.php @@ -0,0 +1,34 @@ +tx_service = $tx_service; + } +} \ No newline at end of file diff --git a/app/Services/Model/AttendeeService.php b/app/Services/Model/AttendeeService.php index e480802e..0a60f730 100644 --- a/app/Services/Model/AttendeeService.php +++ b/app/Services/Model/AttendeeService.php @@ -25,12 +25,13 @@ use models\summit\Summit; use models\summit\SummitAttendee; use models\summit\SummitAttendeeTicket; use services\apis\IEventbriteAPI; - /** * Class AttendeeService * @package App\Services\Model */ -final class AttendeeService implements IAttendeeService +final class AttendeeService + extends AbstractService + implements IAttendeeService { /** @@ -53,11 +54,6 @@ final class AttendeeService implements IAttendeeService */ private $ticket_repository; - /** - * @var ITransactionService - */ - private $tx_service; - /** * @var IEventbriteAPI */ @@ -74,12 +70,12 @@ final class AttendeeService implements IAttendeeService ITransactionService $tx_service ) { + parent::__construct($tx_service); $this->attendee_repository = $attendee_repository; $this->ticket_repository = $ticket_repository; $this->member_repository = $member_repository; $this->ticket_type_repository = $ticket_type_repository; $this->eventbrite_api = $eventbrite_api; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/FolderService.php b/app/Services/Model/FolderService.php index 1b98414b..f6f59442 100644 --- a/app/Services/Model/FolderService.php +++ b/app/Services/Model/FolderService.php @@ -18,7 +18,9 @@ use models\main\IFolderRepository; * Class FolderService * @package App\Services\Model */ -final class FolderService implements IFolderService +final class FolderService + extends AbstractService + implements IFolderService { /** @@ -26,11 +28,6 @@ final class FolderService implements IFolderService */ private $folder_repository; - /** - * @var ITransactionService - */ - private $tx_service; - /** * FolderService constructor. * @param IFolderRepository $folder_repository @@ -38,8 +35,8 @@ final class FolderService implements IFolderService */ public function __construct(IFolderRepository $folder_repository, ITransactionService $tx_service) { + parent::__construct($tx_service); $this->folder_repository = $folder_repository; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/ISummitTicketTypeService.php b/app/Services/Model/ISummitTicketTypeService.php new file mode 100644 index 00000000..d0186e64 --- /dev/null +++ b/app/Services/Model/ISummitTicketTypeService.php @@ -0,0 +1,18 @@ +organization_repository = $organization_repository; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/PresentationService.php b/app/Services/Model/PresentationService.php index 2d3731d5..06382cb1 100644 --- a/app/Services/Model/PresentationService.php +++ b/app/Services/Model/PresentationService.php @@ -14,6 +14,7 @@ use App\Events\PresentationMaterialDeleted; use App\Events\PresentationMaterialUpdated; +use App\Services\Model\AbstractService; use Illuminate\Support\Facades\Event; use models\exceptions\EntityNotFoundException; use models\exceptions\ValidationException; @@ -27,18 +28,15 @@ use libs\utils\ITransactionService; * Class PresentationService * @package services\model */ -final class PresentationService implements IPresentationService +final class PresentationService + extends AbstractService + implements IPresentationService { /** * @var ISummitEventRepository */ private $presentation_repository; - /** - * @var ITransactionService - */ - private $tx_service; - /** * @var IPresentationVideoFactory */ @@ -51,9 +49,9 @@ final class PresentationService implements IPresentationService ITransactionService $tx_service ) { + parent::__construct($tx_service); $this->presentation_repository = $presentation_repository; $this->video_factory = $video_factory; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/RSVPTemplateService.php b/app/Services/Model/RSVPTemplateService.php index f85daf2a..b2e5cb3b 100644 --- a/app/Services/Model/RSVPTemplateService.php +++ b/app/Services/Model/RSVPTemplateService.php @@ -25,18 +25,15 @@ use models\summit\Summit; * Class RSVPTemplateService * @package App\Services\Model */ -final class RSVPTemplateService implements IRSVPTemplateService +final class RSVPTemplateService + extends AbstractService + implements IRSVPTemplateService { /** * @var IRSVPTemplateRepository */ private $rsvp_template_repository; - /** - * @var ITransactionService - */ - private $tx_service; - /** * RSVPTemplateService constructor. * @param IRSVPTemplateRepository $rsvp_template_repository @@ -44,8 +41,8 @@ final class RSVPTemplateService implements IRSVPTemplateService */ public function __construct(IRSVPTemplateRepository $rsvp_template_repository, ITransactionService $tx_service) { + parent::__construct($tx_service); $this->rsvp_template_repository = $rsvp_template_repository; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/SpeakerService.php b/app/Services/Model/SpeakerService.php index e95cd825..244d35a1 100644 --- a/app/Services/Model/SpeakerService.php +++ b/app/Services/Model/SpeakerService.php @@ -13,6 +13,7 @@ **/ use App\Models\Foundation\Summit\Factories\PresentationSpeakerSummitAssistanceConfirmationRequestFactory; use App\Models\Foundation\Summit\Repositories\IPresentationSpeakerSummitAssistanceConfirmationRequestRepository; +use App\Services\Model\AbstractService; use App\Services\Model\IFolderService; use Illuminate\Http\UploadedFile; use libs\utils\ITransactionService; @@ -39,7 +40,9 @@ use App\Http\Utils\FileUploader; * Class SpeakerService * @package services\model */ -final class SpeakerService implements ISpeakerService +final class SpeakerService + extends AbstractService + implements ISpeakerService { /** * @var ISpeakerRepository @@ -71,17 +74,11 @@ final class SpeakerService implements ISpeakerService */ private $email_creation_request_repository; - /** - * @var ITransactionService - */ - private $tx_service; - /** * @var IPresentationSpeakerSummitAssistanceConfirmationRequestRepository */ private $speakers_assistance_repository; - /** * SpeakerService constructor. * @param ISpeakerRepository $speaker_repository @@ -105,6 +102,7 @@ final class SpeakerService implements ISpeakerService ITransactionService $tx_service ) { + parent::__construct($tx_service); $this->speaker_repository = $speaker_repository; $this->member_repository = $member_repository; $this->folder_service = $folder_service; @@ -112,7 +110,6 @@ final class SpeakerService implements ISpeakerService $this->registration_code_repository = $registration_code_repository; $this->email_creation_request_repository = $email_creation_request_repository; $this->speakers_assistance_repository = $speakers_assistance_repository; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/SummitEventTypeService.php b/app/Services/Model/SummitEventTypeService.php index 42d0a030..4c67bcd2 100644 --- a/app/Services/Model/SummitEventTypeService.php +++ b/app/Services/Model/SummitEventTypeService.php @@ -17,6 +17,7 @@ use App\Events\SummitEventTypeUpdated; use App\Models\Foundation\Summit\Factories\SummitEventTypeFactory; use App\Models\Foundation\Summit\Repositories\IDefaultSummitEventTypeRepository; use App\Models\Foundation\Summit\Repositories\ISummitEventTypeRepository; +use App\Services\Model\AbstractService; use App\Services\Model\ISummitEventTypeService; use Illuminate\Support\Facades\Event; use libs\utils\ITransactionService; @@ -28,14 +29,10 @@ use models\summit\SummitEventType; * Class SummitEventTypeService * @package App\Services */ -final class SummitEventTypeService implements ISummitEventTypeService +final class SummitEventTypeService + extends AbstractService + implements ISummitEventTypeService { - - /** - * @var ITransactionService - */ - private $tx_service; - /** * @var ISummitEventTypeRepository */ @@ -59,7 +56,7 @@ final class SummitEventTypeService implements ISummitEventTypeService ITransactionService $tx_service ) { - $this->tx_service = $tx_service; + parent::__construct($tx_service); $this->repository = $repository; $this->default_event_types_repository = $default_event_types_repository; } diff --git a/app/Services/Model/SummitLocationService.php b/app/Services/Model/SummitLocationService.php index eb0398b4..33f4ae08 100644 --- a/app/Services/Model/SummitLocationService.php +++ b/app/Services/Model/SummitLocationService.php @@ -51,18 +51,15 @@ use models\summit\SummitVenueRoom; * Class SummitLocationService * @package App\Services\Model */ -final class SummitLocationService implements ILocationService +final class SummitLocationService + extends AbstractService + implements ILocationService { /** * @var ISummitLocationRepository */ private $location_repository; - /** - * @var ITransactionService - */ - private $tx_service; - /** * @var IGeoCodingAPI */ @@ -88,10 +85,10 @@ final class SummitLocationService implements ILocationService ITransactionService $tx_service ) { + parent::__construct($tx_service); $this->location_repository = $location_repository; $this->geo_coding_api = $geo_coding_api; $this->folder_service = $folder_service; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/SummitPromoCodeService.php b/app/Services/Model/SummitPromoCodeService.php index f3efe3d0..a6ad0322 100644 --- a/app/Services/Model/SummitPromoCodeService.php +++ b/app/Services/Model/SummitPromoCodeService.php @@ -32,7 +32,9 @@ use services\model\ISummitPromoCodeService; * Class SummitPromoCodeService * @package App\Services\Model */ -final class SummitPromoCodeService implements ISummitPromoCodeService +final class SummitPromoCodeService + extends AbstractService + implements ISummitPromoCodeService { /** * @var ISummitRegistrationPromoCodeRepository @@ -59,11 +61,6 @@ final class SummitPromoCodeService implements ISummitPromoCodeService */ private $email_creation_request_repository; - /** - * @var ITransactionService - */ - private $tx_service; - /** * SummitPromoCodeService constructor. * @param ISummitRegistrationPromoCodeRepository $promo_code_repository @@ -83,12 +80,12 @@ final class SummitPromoCodeService implements ISummitPromoCodeService ITransactionService $tx_service ) { + parent::__construct($tx_service); $this->promo_code_repository = $promo_code_repository; $this->member_repository = $member_repository; $this->company_repository = $company_repository; $this->speaker_repository = $speaker_repository; $this->email_creation_request_repository = $email_creation_request_repository; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/SummitService.php b/app/Services/Model/SummitService.php index 3e099c4c..9718ec23 100644 --- a/app/Services/Model/SummitService.php +++ b/app/Services/Model/SummitService.php @@ -17,6 +17,7 @@ use App\Events\MyScheduleAdd; use App\Events\MyScheduleRemove; use App\Http\Utils\FileUploader; use App\Models\Utils\IntervalParser; +use App\Services\Model\AbstractService; use App\Services\Model\IFolderService; use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use GuzzleHttp\Exception\ClientException; @@ -71,7 +72,9 @@ use DateInterval; * Class SummitService * @package services\model */ -final class SummitService implements ISummitService +final class SummitService + extends AbstractService + implements ISummitService { /** @@ -79,10 +82,6 @@ final class SummitService implements ISummitService */ const MIN_EVENT_MINUTES = 5; - /** - * @var ITransactionService - */ - private $tx_service; /** * @var ISummitEventRepository @@ -184,6 +183,7 @@ final class SummitService implements ISummitService ITransactionService $tx_service ) { + parent::__construct($tx_service); $this->event_repository = $event_repository; $this->speaker_repository = $speaker_repository; $this->entity_events_repository = $entity_events_repository; @@ -197,7 +197,6 @@ final class SummitService implements ISummitService $this->folder_service = $folder_service; $this->company_repository = $company_repository; $this->group_repository = $group_repository; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/Model/SummitTicketTypeService.php b/app/Services/Model/SummitTicketTypeService.php new file mode 100644 index 00000000..47f1a812 --- /dev/null +++ b/app/Services/Model/SummitTicketTypeService.php @@ -0,0 +1,24 @@ +repository = $repository; - $this->tx_service = $tx_service; } /** diff --git a/app/Services/ServicesProvider.php b/app/Services/ServicesProvider.php index ddeabd48..03aa496b 100644 --- a/app/Services/ServicesProvider.php +++ b/app/Services/ServicesProvider.php @@ -21,11 +21,13 @@ use App\Services\Model\ILocationService; use App\Services\Model\IMemberService; use App\Services\Model\IRSVPTemplateService; use App\Services\Model\ISummitEventTypeService; +use App\Services\Model\ISummitTicketTypeService; use App\Services\Model\ISummitTrackService; use App\Services\Model\SummitLocationService; use App\Services\Model\MemberService; use App\Services\Model\RSVPTemplateService; use App\Services\Model\SummitPromoCodeService; +use App\Services\Model\SummitTicketTypeService; use App\Services\Model\SummitTrackService; use App\Services\SummitEventTypeService; use Illuminate\Support\Facades\App; @@ -46,7 +48,6 @@ use services\model\PresentationService; use services\model\SpeakerService; use services\model\SummitService; use services\utils\RedisCacheService; - /*** * Class ServicesProvider * @package services @@ -189,6 +190,12 @@ final class ServicesProvider extends ServiceProvider RSVPTemplateService::class ); + App::singleton + ( + ISummitTicketTypeService::class, + SummitTicketTypeService::class + ); + App::singleton(IGeoCodingAPI::class, function(){ return new GoogleGeoCodingAPI ( diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index 99b60295..da65d970 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -1104,6 +1104,25 @@ class ApiEndpointsSeeder extends Seeder sprintf(SummitScopes::WriteSummitData, $current_realm) ], ], + // ticket types + [ + 'name' => 'get-ticket-types', + 'route' => '/api/v1/summits/{id}/ticket-types', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadSummitData, $current_realm), + sprintf(SummitScopes::ReadAllSummitData, $current_realm) + ], + ], + [ + 'name' => 'get-ticket-types-csv', + 'route' => '/api/v1/summits/{id}/ticket-types/csv', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(SummitScopes::ReadSummitData, $current_realm), + sprintf(SummitScopes::ReadAllSummitData, $current_realm) + ], + ], // track groups array( 'name' => 'get-track-groups', diff --git a/tests/OAuth2TicketTypesApiTest.php b/tests/OAuth2TicketTypesApiTest.php new file mode 100644 index 00000000..7f43b09e --- /dev/null +++ b/tests/OAuth2TicketTypesApiTest.php @@ -0,0 +1,52 @@ + $summit_id, + 'page' => 1, + 'per_page' => 10, + 'order' => '+name' + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "GET", + "OAuth2SummitsTicketTypesApiController@getAllBySummit", + $params, + [], + [], + [], + $headers + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + $ticket_types = json_decode($content); + $this->assertTrue(!is_null($ticket_types)); + return $ticket_types; + } + +} \ No newline at end of file