Added enpoints to CRUD bookable rooms

Add bookable room to summit

POST /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms

payload

time_slot_cost: required|numeric
currency:required|iso_currency_code(USD,EUR)
capacity:required|integer
floor_id:sometimes|integer
name:sometimes|string|max:255
description:sometimes|string
order:sometimes|integer|min:1

update bookable room per summit

PUT /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}

payload

time_slot_cost: required|numeric
currency:required|iso_currency_code(USD,EUR)
capacity:required|integer
floor_id:sometimes|integer
name:sometimes|string|max:255
description:sometimes|string
order:sometimes|integer|min:1

delete bookable room

DELETE /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}

add attribute value to bookable room

PUT /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}

delete attribute value from bookable room

DELETE /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}

Added missing endpoints to CRUD bookable rooms attributes
per summit

Get all bookable rooms attribute types

GET /api/v1/summits/{id}/bookable-room-attribute-types

Get bookable room attribute type by id

GET /api/v1/summits/{id}/bookable-room-attribute-types/{type_id}

Add bookable room attribute type

POST /api/v1/summits/{id}/bookable-room-attribute-types

payload

type [required|string]

Update bookable room attribute type

PUT /api/v1/summits/{id}/bookable-room-attribute-types/{type_id}

payload

type [required|string]

delete attribute type by id

DELETE /api/v1/summits/{id}/bookable-room-attribute-types/{type_id}

get all attribute values by attribute type

GET /api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values

add attribute value to attribute type

POST /api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values

payload

value [required|string]

update attribute value

PUT /api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values/{value_id}

payload

value [required|string]

delete attribute value by id

DELETE /api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values/{value_id}

refund endpoint (admin only)

DELETE /api/v1/summits/{id}/bookable-rooms/{room_id}/reservations/{reservation_id}/refund

payload

amount [numeric|required]

get all reservations by summit (admin)

GET /api/v1/summits/{id}/locations/bookable-rooms/all/reservations

query params

page:integer|min:1
per_page:required_with:page|integer|min:1|max:100
filter:

allowed filters

summit_id: ['==']
room_name: ['==', '=@']
room_id: ['==']
owner_id: ['==']
status:  ['==']
start_datetime: ['>', '<', '<=', '>=', '==']
end_datetime:  ['>', '<', '<=', '>=', '==']

order

allowed ordering

id,start_datetime,end_datetime

Change-Id: Ic7f6ed7defaf20b8799a7d94beb0a82103b206f0
This commit is contained in:
smarcet 2019-06-17 17:34:51 -03:00
parent 3312f91d1b
commit a1b8c46273
40 changed files with 3169 additions and 194 deletions

View File

@ -0,0 +1,44 @@
<?php namespace App\Events;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use Illuminate\Queue\SerializesModels;
/**
* Class BookableRoomReservationAction
* @package App\Events
*/
abstract class BookableRoomReservationAction
{
use SerializesModels;
/**
* @var int
*/
private $reservation_id;
/**
* BookableRoomReservationAction constructor.
* @param int $reservation_id
*/
public function __construct(int $reservation_id)
{
$this->reservation_id = $reservation_id;
}
/**
* @return int
*/
public function getReservationId(): int
{
return $this->reservation_id;
}
}

View File

@ -0,0 +1,22 @@
<?php namespace App\Events;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
/**
* Class BookableRoomReservationRefundAccepted
* @package App\Events
*/
final class BookableRoomReservationRefundAccepted extends BookableRoomReservationAction
{
}

View File

@ -0,0 +1,22 @@
<?php namespace App\Events;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
/**
* Class CreatedBookableRoomReservation
* @package App\Events
*/
final class CreatedBookableRoomReservation extends BookableRoomReservationAction
{
}

View File

@ -0,0 +1,22 @@
<?php namespace App\Events;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
/**
* Class PaymentBookableRoomReservationConfirmed
* @package App\Events
*/
final class PaymentBookableRoomReservationConfirmed extends BookableRoomReservationAction
{
}

View File

@ -0,0 +1,22 @@
<?php namespace App\Events;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
/**
* Class RequestedBookableRoomReservationRefund
* @package App\Events
*/
final class RequestedBookableRoomReservationRefund extends BookableRoomReservationAction
{
}

View File

@ -14,6 +14,7 @@
use App\Models\Foundation\Summit\Locations\SummitLocationConstants;
use models\exceptions\ValidationException;
use models\summit\SummitAirport;
use models\summit\SummitBookableVenueRoom;
use models\summit\SummitExternalLocation;
use models\summit\SummitHotel;
use models\summit\SummitVenue;
@ -59,6 +60,10 @@ final class SummitLocationValidationRulesFactory
return array_merge($base_rules, SummitVenueRoomValidationRulesFactory::build($data, $update));
}
break;
case SummitBookableVenueRoom::ClassName: {
return array_merge($base_rules, SummitVenueBookableRoomValidationRulesFactory::build($data, $update));
}
break;
default:{
throw new ValidationException('invalid class_name param');
}

View File

@ -41,6 +41,10 @@ final class SummitValidationRulesFactory
'secondary_registration_link' => 'sometimes|url',
'secondary_registration_label' => 'sometimes|string',
'slug' => 'nullable|string',
'meeting_room_booking_start_time' => 'nullable|date_format:U',
'meeting_room_booking_end_time' => 'nullable|required_with:meeting_room_booking_end_time|date_format:U|after_or_equal:meeting_room_booking_end_time',
'meeting_room_booking_slot_length' => 'nullable|integer',
'meeting_room_booking_max_allowed' => 'nullable|integer|min:1',
];
}
@ -65,6 +69,10 @@ final class SummitValidationRulesFactory
'secondary_registration_link' => 'sometimes|url',
'secondary_registration_label' => 'sometimes|string',
'slug' => 'nullable|string',
'meeting_room_booking_start_time' => 'nullable|date_format:U',
'meeting_room_booking_end_time' => 'nullable|required_with:meeting_room_booking_end_time|date_format:U|after_or_equal:meeting_room_booking_end_time',
'meeting_room_booking_slot_length' => 'nullable|integer',
'meeting_room_booking_max_allowed' => 'nullable|integer|min:1',
];
}
}

View File

@ -0,0 +1,36 @@
<?php namespace App\Http\Controllers;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
/**
* Class SummitVenueBookableRoomValidationRulesFactory
* @package App\Http\Controllers
*/
final class SummitVenueBookableRoomValidationRulesFactory
{
/**
* @param array $data
* @param bool $update
* @return array
*/
public static function build(array $data, $update = false){
$rules = SummitVenueRoomValidationRulesFactory::build($data, $update);
return array_merge([
'capacity' => 'required|integer:min:0',
'time_slot_cost' => 'required|numeric',
'currency' => 'required|string|currency_iso',
], $rules);
}
}

View File

@ -0,0 +1,592 @@
<?php namespace App\Http\Controllers;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use App\Http\Utils\PagingConstants;
use App\Models\Foundation\Summit\Repositories\ISummitBookableVenueRoomAttributeTypeRepository;
use App\Models\Foundation\Summit\Repositories\ISummitBookableVenueRoomAttributeValueRepository;
use App\Services\Model\ILocationService;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Validator;
use models\exceptions\EntityNotFoundException;
use models\exceptions\ValidationException;
use models\oauth2\IResourceServerContext;
use models\summit\ISummitRepository;
use ModelSerializers\SerializerRegistry;
use services\model\ISummitService;
use utils\Filter;
use utils\FilterElement;
use utils\FilterParser;
use utils\OrderParser;
use utils\PagingInfo;
use Exception;
/**
* Class OAuth2SummitBookableRoomsAttributeTypeApiController
* @package App\Http\Controllers
*/
final class OAuth2SummitBookableRoomsAttributeTypeApiController extends OAuth2ProtectedController
{
/**
* @var ISummitRepository
*/
private $summit_repository;
/**
* @var ISummitBookableVenueRoomAttributeTypeRepository
*/
private $attribute_type_repository;
/**
* @var ISummitBookableVenueRoomAttributeValueRepository
*/
private $attribute_value_repository;
/**
* @var ISummitService
*/
private $summit_service;
/**
* OAuth2SummitBookableRoomsAttributeTypeApiController constructor.
* @param ISummitBookableVenueRoomAttributeTypeRepository $attribute_type_repository
* @param ISummitBookableVenueRoomAttributeValueRepository $attribute_value_repository
* @param ISummitRepository $summit_repository
* @param ISummitService $summit_service
* @param IResourceServerContext $resource_server_context
*/
public function __construct
(
ISummitBookableVenueRoomAttributeTypeRepository $attribute_type_repository,
ISummitBookableVenueRoomAttributeValueRepository $attribute_value_repository,
ISummitRepository $summit_repository,
ISummitService $summit_service,
IResourceServerContext $resource_server_context
)
{
parent::__construct($resource_server_context);
$this->attribute_type_repository = $attribute_type_repository;
$this->attribute_value_repository = $attribute_value_repository;
$this->summit_repository = $summit_repository;
$this->summit_service = $summit_service;
}
/**
* @param $summit_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function getAllBookableRoomAttributeTypes($summit_id){
$values = Input::all();
$rules = [
'page' => 'integer|min:1',
'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, 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'), [
'type' => ['==', '=@'],
'summit_id' => ['=='],
]);
}
if(is_null($filter)) $filter = new Filter();
$filter->validate([
'type' => 'sometimes|string',
'summit_id' => 'sometimes|integer',
]);
$order = null;
if (Input::has('order'))
{
$order = OrderParser::parse(Input::get('order'), [
'id',
'type',
]);
}
$filter->addFilterCondition(FilterElement::makeEqual("summit_id", $summit->getId()));
$data = $this->attribute_type_repository->getAllByPage(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 \Illuminate\Http\JsonResponse|mixed
*/
public function addBookableRoomAttributeType($summit_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$rules = [
'type' => 'required|string',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$attr = $this->summit_service->addBookableRoomAttribute($summit, $payload);
return $this->created(SerializerRegistry::getInstance()->getSerializer($attr)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $type_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function getBookableRoomAttributeType($summit_id, $type_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$attr = $summit->getBookableAttributeTypeById($type_id);
if (is_null($attr)) return $this->error404();
return $this->ok(SerializerRegistry::getInstance()->getSerializer($attr)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $type_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function updateBookableRoomAttributeType($summit_id, $type_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$rules = [
'type' => 'required|string',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$attr = $this->summit_service->updateBookableRoomAttribute($summit, $type_id, $payload);
return $this->updated(SerializerRegistry::getInstance()->getSerializer($attr)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $type_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function deleteBookableRoomAttributeType($summit_id, $type_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$this->summit_service->deleteBookableRoomAttribute($summit, $type_id);
return $this->deleted();
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
// values
/**
* @param $summit_id
* @param $type_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function getAllBookableRoomAttributeValues($summit_id, $type_id){
$values = Input::all();
$rules = [
'page' => 'integer|min:1',
'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize),
];
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$attr = $summit->getBookableAttributeTypeById($type_id);
if (is_null($attr)) 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'), [
'value' => ['==', '=@'],
'summit_id' => ['=='],
'type_id' => ['=='],
]);
}
if(is_null($filter)) $filter = new Filter();
$filter->validate([
'value' => 'sometimes|string',
'summit_id' => 'sometimes|integer',
'type_id' => 'sometimes|integer',
]);
$order = null;
if (Input::has('order'))
{
$order = OrderParser::parse(Input::get('order'), [
'id',
'value',
]);
}
$filter->addFilterCondition(FilterElement::makeEqual("summit_id", $summit->getId()));
$filter->addFilterCondition(FilterElement::makeEqual("type_id", $attr->getId()));
$data = $this->attribute_value_repository->getAllByPage(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
* @param $type_id
* @param $value_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function getBookableRoomAttributeValue($summit_id, $type_id, $value_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$attr = $summit->getBookableAttributeTypeById($type_id);
if (is_null($attr)) return $this->error404();
$value = $attr->getValueById($value_id);
if (is_null($value)) return $this->error404();
return $this->ok(SerializerRegistry::getInstance()->getSerializer($value)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $type_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function addBookableRoomAttributeValue($summit_id, $type_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$rules = [
'value' => 'required|string',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$value = $this->summit_service->addBookableRoomAttributeValue($summit, $type_id, $payload);
return $this->created(SerializerRegistry::getInstance()->getSerializer($value)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $type_id
* @param $value_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function updateBookableRoomAttributeValue($summit_id, $type_id, $value_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$rules = [
'value' => 'required|string',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$value = $this->summit_service->updateBookableRoomAttributeValue($summit, $type_id, $value_id, $payload);
return $this->updated(SerializerRegistry::getInstance()->getSerializer($value)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $type_id
* @param $value_id
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function deleteBookableRoomAttributeValue($summit_id, $type_id, $value_id){
try {
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$this->summit_service->deleteBookableRoomAttributeValue($summit, $type_id, $value_id);
return $this->deleted();
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
}

View File

@ -16,6 +16,7 @@ use App\Models\Foundation\Summit\Locations\Banners\SummitLocationBannerConstants
use App\Models\Foundation\Summit\Locations\SummitLocationConstants;
use App\Models\Foundation\Summit\Repositories\ISummitLocationBannerRepository;
use App\Models\Foundation\Summit\Repositories\ISummitLocationRepository;
use App\Models\Foundation\Summit\Repositories\ISummitRoomReservationRepository;
use App\Services\Apis\IPaymentGatewayAPI;
use App\Services\Model\ILocationService;
use Exception;
@ -99,6 +100,11 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController
*/
private $payment_gateway;
/**
* @var ISummitRoomReservationRepository
*/
private $reservation_repository;
/**
* OAuth2SummitLocationsApiController constructor.
* @param ISummitRepository $summit_repository
@ -108,6 +114,7 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController
* @param ISummitLocationRepository $location_repository
* @param ISummitLocationBannerRepository $location_banners_repository
* @param IMemberRepository $member_repository
* @param ISummitRoomReservationRepository $reservation_repository
* @param ISummitService $summit_service
* @param ILocationService $location_service
* @param IPaymentGatewayAPI $payment_gateway
@ -122,6 +129,7 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController
ISummitLocationRepository $location_repository,
ISummitLocationBannerRepository $location_banners_repository,
IMemberRepository $member_repository,
ISummitRoomReservationRepository $reservation_repository,
ISummitService $summit_service,
ILocationService $location_service,
IPaymentGatewayAPI $payment_gateway,
@ -138,6 +146,7 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController
$this->location_service = $location_service;
$this->summit_service = $summit_service;
$this->payment_gateway = $payment_gateway;
$this->reservation_repository = $reservation_repository;
}
/**
@ -656,7 +665,6 @@ final class OAuth2SummitLocationsApiController extends OAuth2ProtectedController
return $this->error404();
}
$room = $venue->getRoom($room_id);
if (is_null($room)) {

View File

@ -21,8 +21,11 @@ use models\exceptions\EntityNotFoundException;
use models\exceptions\ValidationException;
use models\summit\SummitBookableVenueRoom;
use models\summit\SummitBookableVenueRoomAvailableSlot;
use models\summit\SummitRoomReservation;
use models\summit\SummitVenue;
use ModelSerializers\SerializerRegistry;
use utils\Filter;
use utils\FilterElement;
use utils\FilterParser;
use utils\OrderParser;
use utils\PagingInfo;
@ -134,8 +137,163 @@ trait SummitBookableVenueRoomApi
}
}
public function getBookableVenueRoom($summit_id, $room_id){
/**
* @param $summit_id
* @return mixed
*/
public function getAllReservationsBySummit($summit_id){
$values = Input::all();
$rules = [
'page' => 'integer|min:1',
'per_page' => sprintf('required_with:page|integer|min:%s|max:%s', PagingConstants::MinPageSize, PagingConstants::MaxPageSize),
];
try {
$summit = SummitFinderStrategyFactory::build($this->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'), [
'summit_id' => ['=='],
'room_name' => ['==', '=@'],
'room_id' => ['=='],
'owner_id' => ['=='],
'status' => ['=='],
'start_datetime' => ['>', '<', '<=', '>=', '=='],
'end_datetime' => ['>', '<', '<=', '>=', '=='],
]);
}
if(is_null($filter)) $filter = new Filter();
$filter->validate([
'status' => sprintf('sometimes|in:%s',implode(',', SummitRoomReservation::$valid_status)),
'room_name' => 'sometimes|string',
'summit_id' => 'sometimes|integer',
'room_id' => 'sometimes|integer',
'owner_id' => 'sometimes|string',
'start_datetime' => 'sometimes|required|date_format:U',
'end_datetime' => 'sometimes|required_with:start_datetime|date_format:U|after:start_datetime',
], [
'status.in' => sprintf
(
":attribute has an invalid value ( valid values are %s )",
implode(", ", SummitRoomReservation::$valid_status)
)
]);
$order = null;
if (Input::has('order'))
{
$order = OrderParser::parse(Input::get('order'), [
'id',
'start_datetime',
'end_datetime',
]);
}
$data = $this->reservation_repository->getAllBySummitByPage($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
* @param $venue_id
* @param $room_id
* @return mixed
*/
public function getBookableVenueRoom($summit_id, $venue_id, $room_id){
try {
$expand = Request::input('expand', '');
$relations = Request::input('relations', '');
$relations = !empty($relations) ? explode(',', $relations) : [];
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$venue = $summit->getLocation($venue_id);
if (is_null($venue)) {
return $this->error404();
}
if (!$venue instanceof SummitVenue) {
return $this->error404();
}
$room = $venue->getRoom($room_id);
if (is_null($room) || !$room instanceof SummitBookableVenueRoom) {
return $this->error404();
}
return $this->ok(SerializerRegistry::getInstance()->getSerializer($room)->serialize($expand,[], $relations));
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
@ -337,9 +495,9 @@ trait SummitBookableVenueRoomApi
if(is_null($member))
return $this->error403();
$this->location_service->cancelReservation($summit, $member, $reservation_id);
$reservation = $this->location_service->cancelReservation($summit, $member, $reservation_id);
return $this->deleted();
return $this->updated(SerializerRegistry::getInstance()->getSerializer($reservation)->serialize());
}
catch (ValidationException $ex1)
{
@ -382,4 +540,323 @@ trait SummitBookableVenueRoomApi
}
return $this->error400(["error" => 'invalid event type']);
}
/**
* @param $summit_id
* @param $venue_id
* @param $room_id
* @return mixed
*/
public function updateVenueBookableRoom($summit_id, $venue_id, $room_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$payload['class_name'] = SummitBookableVenueRoom::ClassName;
$rules = SummitLocationValidationRulesFactory::build($payload, true);
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$room = $this->location_service->updateVenueBookableRoom($summit, $venue_id, $room_id, $payload);
return $this->created(SerializerRegistry::getInstance()->getSerializer($room)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $venue_id
* @param $floor_id
* @param $room_id
* @return mixed
*/
public function updateVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $room_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$payload['class_name'] = SummitBookableVenueRoom::ClassName;
$rules = SummitLocationValidationRulesFactory::build($payload, true);
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
if(!isset($payload['floor_id']))
$payload['floor_id'] = intval($floor_id);
$room = $this->location_service->updateVenueBookableRoom($summit, $venue_id, $room_id, $payload);
return $this->created(SerializerRegistry::getInstance()->getSerializer($room)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
public function deleteVenueBookableRoom($summit_id, $venue_id, $room_id){
try {
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$this->location_service->deleteVenueBookableRoom($summit, $venue_id, $room_id);
return $this->deleted();
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $venue_id
* @return mixed
*/
public function addVenueBookableRoom($summit_id, $venue_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$payload['class_name'] = SummitBookableVenueRoom::ClassName;
$rules = SummitLocationValidationRulesFactory::build($payload);
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$room = $this->location_service->addVenueBookableRoom($summit, $venue_id, $payload);
return $this->created(SerializerRegistry::getInstance()->getSerializer($room)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $venue_id
* @return mixed
*/
public function addVenueFloorBookableRoom($summit_id, $venue_id, $floor_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$payload['class_name'] = SummitBookableVenueRoom::ClassName;
$rules = SummitLocationValidationRulesFactory::build($payload);
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$payload['floor_id'] = intval($floor_id);
$room = $this->location_service->addVenueBookableRoom($summit, $venue_id, $payload);
return $this->created(SerializerRegistry::getInstance()->getSerializer($room)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $venue_id
* @param $room_id
* @param $attribute_id
* @return mixed
*/
public function addVenueBookableRoomAttribute($summit_id, $venue_id, $room_id, $attribute_id){
try {
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$room = $this->location_service->addVenueBookableRoomAttribute($summit, $venue_id, $room_id, $attribute_id);
return $this->created(SerializerRegistry::getInstance()->getSerializer($room)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
/**
* @param $summit_id
* @param $venue_id
* @param $room_id
* @param $attribute_id
* @return mixed
*/
public function deleteVenueBookableRoomAttribute($summit_id, $venue_id, $room_id, $attribute_id){
try {
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$room = $this->location_service->deleteVenueBookableRoomAttribute($summit, $venue_id, $room_id, $attribute_id);
return $this->deleted(SerializerRegistry::getInstance()->getSerializer($room)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
public function refundBookableVenueRoomReservation($summit_id, $room_id, $reservation_id){
try {
if(!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$rules = [
'amount' => 'required|numeric',
];
// Creates a Validator instance and validates the data.
$validation = Validator::make($payload, $rules);
if ($validation->fails()) {
$messages = $validation->messages()->toArray();
return $this->error412
(
$messages
);
}
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$room = $summit->getLocation($room_id);
if (is_null($room)) return $this->error404();
if (!$room instanceof SummitBookableVenueRoom) return $this->error404();
$amount = intval($payload['amount']);
$reservation = $this->location_service->refundReservation($room, $reservation_id, $amount);
return $this->updateVenueBookableRoom(SerializerRegistry::getInstance()->getSerializer($reservation)->serialize());
}
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 (Exception $ex) {
Log::error($ex);
return $this->error500($ex);
}
}
}

View File

@ -11,10 +11,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
/**
* Class DoctrineJoinFilterMapping
* @package utils

View File

@ -319,15 +319,17 @@ Route::group([
// bookable-rooms
Route::group(['prefix' => 'bookable-rooms'], function () {
// GET /api/v1/summits/{id}/bookable-rooms
// GET /api/v1/summits/{id}/locations/bookable-rooms
Route::get('', 'OAuth2SummitLocationsApiController@getBookableVenueRooms');
Route::group(['prefix' => 'all'], function () {
Route::group(['prefix' => 'reservations'], function () {
// GET /api/v1/summits/{id}/bookable-rooms/all/reservations/me
// GET /api/v1/summits/{id}/locations/bookable-rooms/all/reservations
Route::get('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@getAllReservationsBySummit']);
// GET /api/v1/summits/{id}/locations/bookable-rooms/all/reservations/me
Route::get('me', 'OAuth2SummitLocationsApiController@getMyBookableVenueRoomReservations');
Route::group(['prefix' => '{reservation_id}'], function () {
// DELETE /api/v1/summits/{id}/bookable-rooms/all/reservations/{reservation_id}
// DELETE /api/v1/summits/{id}/locations/bookable-rooms/all/reservations/{reservation_id}
Route::delete('', 'OAuth2SummitLocationsApiController@cancelMyBookableVenueRoomReservation');
});
});
@ -338,9 +340,17 @@ Route::group([
Route::get('', 'OAuth2SummitLocationsApiController@getBookableVenueRoom');
// GET /api/v1/summits/{id}/locations/bookable-rooms/{room_id}/availability/{day}
Route::get('availability/{day}', 'OAuth2SummitLocationsApiController@getBookableVenueRoomAvailability');
Route::group(['prefix' => 'reservations'], function () {
// POST /api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations
Route::post('', 'OAuth2SummitLocationsApiController@createBookableVenueRoomReservation');
Route::group(['prefix' => '{reservation_id}'], function () {
// GET /api/v1/summits/{id}/bookable-rooms/{room_id}/reservations/{reservation_id}
Route::get('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@getBookableVenueRoomReservation']);
// DELETE /api/v1/summits/{id}/bookable-rooms/{room_id}/reservations/{reservation_id}/refund
Route::delete('refund', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@refundBookableVenueRoomReservation']);
});
});
});
@ -368,14 +378,25 @@ Route::group([
// bookable-rooms
Route::group(['prefix' => 'bookable-rooms'], function () {
// POST /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms
Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@addBookableVenueRoom']);
Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@addVenueBookableRoom']);
Route::group(['prefix' => '{room_id}'], function () {
// GET /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}
Route::get('', 'OAuth2SummitLocationsApiController@getBookableVenueRoom');
// PUT /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}
Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@updateBookableVenueRoom']);
Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@updateVenueBookableRoom']);
// DELETE /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}
Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@deleteBookableVenueRoom']);
Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@deleteVenueBookableRoom']);
// attributes
Route::group(['prefix' => 'attributes'], function () {
Route::group(['prefix' => '{attribute_id}'], function () {
// PUT /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}
Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@addVenueBookableRoomAttribute']);
// DELETE /api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}
Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitLocationsApiController@deleteVenueBookableRoomAttribute']);
});
});
});
});
@ -460,6 +481,26 @@ Route::group([
});
});
// bookable rooms attributes
Route::group(['prefix' => 'bookable-room-attribute-types'], function () {
Route::get('', 'OAuth2SummitBookableRoomsAttributeTypeApiController@getAllBookableRoomAttributeTypes');
Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitBookableRoomsAttributeTypeApiController@addBookableRoomAttributeType']);
Route::group(['prefix' => '{type_id}'], function () {
Route::get('', 'OAuth2SummitLocationsApiController@getBookableRoomAttributeType');
Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitBookableRoomsAttributeTypeApiController@updateBookableRoomAttributeType']);
Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitBookableRoomsAttributeTypeApiController@deleteBookableRoomAttributeType']);
Route::group(['prefix' => 'values'], function () {
Route::get('', 'OAuth2SummitBookableRoomsAttributeTypeApiController@getAllBookableRoomAttributeValues');
Route::post('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitBookableRoomsAttributeTypeApiController@addBookableRoomAttributeValue']);
Route::group(['prefix' => '{value_id}'], function () {
Route::get('', 'OAuth2SummitLocationsApiController@getBookableRoomAttributeValue');
Route::put('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitBookableRoomsAttributeTypeApiController@updateBookableRoomAttributeValue']);
Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitBookableRoomsAttributeTypeApiController@udeleteBookableRoomAttributeValue']);
});
});
});
});
// event types
Route::group(['prefix' => 'event-types'], function () {
Route::get('', 'OAuth2SummitsEventTypesApiController@getAllBySummit');

View File

@ -11,6 +11,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use models\summit\SummitBookableVenueRoomAttributeType;
use ModelSerializers\SerializerRegistry;
use ModelSerializers\SilverStripeSerializer;
/**
* Class SummitBookableVenueRoomAttributeTypeSerializer
@ -22,4 +24,36 @@ class SummitBookableVenueRoomAttributeTypeSerializer extends SilverStripeSeriali
'Type' => 'type:json_string',
'SummitId' => 'summit_id:json_int',
];
public function serialize($expand = null, array $fields = array(), array $relations = array(), array $params = array() )
{
$attr_type = $this->object;
if(!$attr_type instanceof SummitBookableVenueRoomAttributeType)
return [];
$values = parent::serialize($expand, $fields, $relations, $params);
$attr_values = [];
foreach ($attr_type->getValues() as $attr_val){
$attr_values[] = $attr_val->getId();
}
$values['values'] = $attr_values;
if (!empty($expand)) {
$exp_expand = explode(',', $expand);
foreach ($exp_expand as $relation) {
switch (trim($relation)) {
case 'values': {
unset($values['values']);
$attr_values = [];
foreach ($attr_type->getValues() as $attr_val){
$attr_values[] = SerializerRegistry::getInstance()->getSerializer($attr_val)->serialize();
}
$values['values'] = $attr_values;
}
break;
}
}
}
return $values;
}
}

View File

@ -52,6 +52,7 @@ class SummitSerializer extends SilverStripeSerializer
'SecondaryRegistrationLink' => 'secondary_registration_link:json_string',
'SecondaryRegistrationLabel' => 'secondary_registration_label:json_string',
'RawSlug' => 'slug:json_string',
// Bookable rooms attributes
'MeetingRoomBookingStartTime' => 'meeting_room_booking_start_time:datetime_epoch',
'MeetingRoomBookingEndTime' => 'meeting_room_booking_end_time:datetime_epoch',
'MeetingRoomBookingSlotLength' => 'meeting_room_booking_slot_length:json_int',

View File

@ -1150,6 +1150,17 @@ SQL;
return $this->reservations;
}
/**
* @param Summit $summit
* @return int
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function getReservationsCountBySummit(Summit $summit):int{
$query = $this->createQuery("SELECT count(rv.id) from models\summit\SummitRoomReservation rv JOIN rv.room r JOIN r.venue v JOIN v.summit s WHERE s.id = :summit_id");
return $query->setParameter('summit_id', $summit->getId())->getSingleResult();
}
/**
* @param int $reservation_id
* @return SummitRoomReservation

View File

@ -149,6 +149,30 @@ final class SummitFactory
$summit->setSecondaryRegistrationLabel(trim($data['secondary_registration_label']));
}
if(isset($data['meeting_room_booking_start_time']) ){
// no need to convert to UTC, its only relative time
$meeting_room_booking_start_time = intval($data['meeting_room_booking_start_time']);
$meeting_room_booking_start_time = new \DateTime("@$meeting_room_booking_start_time");
$summit->setMeetingRoomBookingStartTime($meeting_room_booking_start_time);
}
if(isset($data['meeting_room_booking_end_time']) ){
// no need to convert to UTC, its only relative time
$meeting_room_booking_end_time = intval($data['meeting_room_booking_end_time']);
$meeting_room_booking_end_time = new \DateTime("@$meeting_room_booking_end_time");
$summit->setMeetingRoomBookingEndTime($meeting_room_booking_end_time);
}
if(isset($data['meeting_room_booking_slot_length']) ){
// minutes
$summit->setMeetingRoomBookingSlotLength(intval($data['meeting_room_booking_slot_length']));
}
if(isset($data['meeting_room_booking_max_allowed']) ){
// maximun books per user
$summit->setMeetingRoomBookingMaxAllowed(intval($data['meeting_room_booking_max_allowed']));
}
return $summit;
}
}

View File

@ -14,12 +14,12 @@
use models\exceptions\ValidationException;
use models\summit\SummitAbstractLocation;
use models\summit\SummitAirport;
use models\summit\SummitBookableVenueRoom;
use models\summit\SummitExternalLocation;
use models\summit\SummitGeoLocatedLocation;
use models\summit\SummitHotel;
use models\summit\SummitVenue;
use models\summit\SummitVenueRoom;
/**
* Class SummitLocationFactory
* @package App\Models\Foundation\Summit\Factories
@ -50,6 +50,11 @@ final class SummitLocationFactory
case SummitAirport::ClassName :{
$location = self::populateSummitAirport(new SummitAirport, $data);
}
break;
case SummitBookableVenueRoom::ClassName :{
$location = self::populateSummitVenueBookableRoom(new SummitBookableVenueRoom, $data);
}
break;
case SummitVenueRoom::ClassName :{
$location = self::populateSummitVenueRoom(new SummitVenueRoom, $data);
}
@ -207,6 +212,11 @@ final class SummitLocationFactory
return $airport;
}
/**
* @param SummitVenueRoom $room
* @param array $data
* @return SummitVenueRoom
*/
public static function populateSummitVenueRoom(SummitVenueRoom $room, array $data){
self::populateSummitAbstractLocation($room, $data);
@ -220,6 +230,25 @@ final class SummitLocationFactory
return $room;
}
/**
* @param SummitBookableVenueRoom $room
* @param array $data
* @return SummitBookableVenueRoom
*/
public static function populateSummitVenueBookableRoom(SummitBookableVenueRoom $room, array $data){
self::populateSummitVenueRoom($room, $data);
if(isset($data['time_slot_cost']))
$room->setTimeSlotCost(floatval($data['time_slot_cost']));
if(isset($data['currency']))
$room->setCurrency(trim($data['currency']));
return $room;
}
/**
* @param SummitAbstractLocation $location
* @param array $data
@ -238,6 +267,9 @@ final class SummitLocationFactory
if($location instanceof SummitExternalLocation){
return self::populateSummitExternalLocation($location, $data);
}
if($location instanceof SummitBookableVenueRoom){
return self::populateSummitVenueBookableRoom($location, $data);
}
if($location instanceof SummitVenueRoom){
return self::populateSummitVenueRoom($location, $data);
}

View File

@ -66,6 +66,7 @@ class SummitBookableVenueRoom extends SummitVenueRoom
* @throws ValidationException
*/
public function addReservation(SummitRoomReservation $reservation){
$criteria = Criteria::create();
$start_date = $reservation->getStartDatetime();
@ -87,7 +88,7 @@ class SummitBookableVenueRoom extends SummitVenueRoom
if($this->reservations->matching($criteria)->count() > 0)
throw new ValidationException(sprintf("reservation overlaps an existent reservation"));
$summit = $this->summit;
$summit = $this->summit;
$local_start_date = $summit->convertDateFromUTC2TimeZone($start_date);
$local_end_date = $summit->convertDateFromUTC2TimeZone($end_date);
@ -96,6 +97,7 @@ class SummitBookableVenueRoom extends SummitVenueRoom
if(!$summit->isTimeFrameInsideSummitDuration($local_start_date, $local_end_date))
throw new ValidationException("requested reservation period does not belong to summit period");
$local_start_time = new \DateTime("now", $this->summit->getTimeZone());
$local_start_time->setTime(
intval($start_time->format("H")),
@ -162,6 +164,17 @@ class SummitBookableVenueRoom extends SummitVenueRoom
return $this->reservations;
}
/**
* @param int $id
* @return SummitRoomReservation|null
*/
public function getReservationById(int $id):?SummitRoomReservation{
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('id', intval($id)));
$reservation = $this->reservations->matching($criteria)->first();
return $reservation === false ? null : $reservation;
}
public function clearReservations(){
$this->reservations->clear();
}
@ -276,5 +289,20 @@ class SummitBookableVenueRoom extends SummitVenueRoom
return $this->attributes;
}
/**
* @param SummitBookableVenueRoomAttributeValue $attribute
*/
public function addAttribute(SummitBookableVenueRoomAttributeValue $attribute){
if($this->attributes->contains($attribute)) return;
$this->attributes->add($attribute);
}
/**
* @param SummitBookableVenueRoomAttributeValue $attribute
*/
public function removeAttribute(SummitBookableVenueRoomAttributeValue $attribute){
if(!$this->attributes->contains($attribute)) return;
$this->attributes->removeElement($attribute);
}
}

View File

@ -18,7 +18,7 @@ use models\exceptions\ValidationException;
use models\summit\SummitOwned;
use models\utils\SilverstripeBaseModel;
/**
* @ORM\Entity
* @ORM\Entity(repositoryClass="App\Repositories\Summit\DoctrineSummitBookableVenueRoomAttributeTypeRepository")
* @ORM\Table(name="SummitBookableVenueRoomAttributeType")
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride(
@ -67,19 +67,45 @@ class SummitBookableVenueRoomAttributeType extends SilverstripeBaseModel
$this->type = $type;
}
/**
* @return ArrayCollection
*/
public function getValues(): ArrayCollection
public function getValues()
{
return $this->values;
}
/**
* @param ArrayCollection $values
*/
public function setValues(ArrayCollection $values): void
{
$this->values = $values;
public function addValue(SummitBookableVenueRoomAttributeValue $value){
if($this->values->contains($value)) return;
$this->values->add($value);
$value->setType($this);
}
public function removeValue(SummitBookableVenueRoomAttributeValue $value){
if(!$this->values->contains($value)) return;
$this->values->removeElement($value);
}
/**
* @param int $id
* @return SummitBookableVenueRoomAttributeValue|null
*/
public function getValueById(int $id):?SummitBookableVenueRoomAttributeValue
{
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('id', intval($id)));
$value = $this->values->matching($criteria)->first();
return $value === false ? null : $value;
}
/**
* @param string $value
* @return SummitBookableVenueRoomAttributeValue|null
*/
public function getValueByValue(string $value):?SummitBookableVenueRoomAttributeValue
{
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('value', trim($value)));
$value = $this->values->matching($criteria)->first();
return $value === false ? null : $value;
}
}

View File

@ -17,7 +17,7 @@ use Doctrine\ORM\Mapping AS ORM;
use models\exceptions\ValidationException;
use models\utils\SilverstripeBaseModel;
/**
* @ORM\Entity
* @ORM\Entity(repositoryClass="App\Repositories\Summit\DoctrineSummitBookableVenueRoomAttributeValueRepository")
* @ORM\Table(name="SummitBookableVenueRoomAttributeValue")
* Class SummitBookableVenueRoomAttributeValue
* @package models\summit

View File

@ -12,11 +12,11 @@
* limitations under the License.
**/
use models\summit\SummitAirport;
use models\summit\SummitBookableVenueRoom;
use models\summit\SummitExternalLocation;
use models\summit\SummitHotel;
use models\summit\SummitVenue;
use models\summit\SummitVenueRoom;
/**
* Class SummitLocationConstants
* @package App\Models\Foundation\Summit\Locations
@ -28,6 +28,7 @@ final class SummitLocationConstants
SummitAirport::ClassName,
SummitHotel::ClassName,
SummitExternalLocation::ClassName,
SummitVenueRoom::ClassName
SummitVenueRoom::ClassName,
SummitBookableVenueRoom::ClassName
];
}

View File

@ -325,5 +325,4 @@ class SummitRoomReservation extends SilverstripeBaseModel
}
}
}

View File

@ -0,0 +1,22 @@
<?php namespace App\Models\Foundation\Summit\Repositories;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use models\utils\IBaseRepository;
/**
* Interface ISummitBookableVenueRoomAttributeTypeRepository
* @package App\Models\Foundation\Summit\Repositories
*/
interface ISummitBookableVenueRoomAttributeTypeRepository extends IBaseRepository
{
}

View File

@ -0,0 +1,22 @@
<?php namespace App\Models\Foundation\Summit\Repositories;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use models\utils\IBaseRepository;
/**
* Interface ISummitBookableVenueRoomAttributeValueRepository
* @package App\Models\Foundation\Summit\Repositories
*/
interface ISummitBookableVenueRoomAttributeValueRepository extends IBaseRepository
{
}

View File

@ -11,8 +11,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use models\summit\Summit;
use models\summit\SummitRoomReservation;
use models\utils\IBaseRepository;
use utils\Filter;
use utils\Order;
use utils\PagingInfo;
use utils\PagingResponse;
/**
* Interface ISummitRoomReservationRepository
* @package App\Models\Foundation\Summit\Repositories
@ -21,7 +28,16 @@ interface ISummitRoomReservationRepository extends IBaseRepository
{
/**
* @param string $payment_gateway_cart_id
* @return SummitRoomReservation
* @return SummitRoomReservation|null
*/
public function getByPaymentGatewayCartId(string $payment_gateway_cart_id):SummitRoomReservation;
public function getByPaymentGatewayCartId(string $payment_gateway_cart_id): ?SummitRoomReservation;
/**
* @param Summit $summit
* @param PagingInfo $paging_info
* @param Filter|null $filter
* @param Order|null $order
* @return PagingResponse
*/
public function getAllBySummitByPage(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null): PagingResponse;
}

View File

@ -2534,6 +2534,47 @@ SQL;
return $this->meeting_booking_room_allowed_attributes;
}
/**
* @param SummitBookableVenueRoomAttributeType $type
*/
public function addMeetingBookingRoomAllowedAttribute(SummitBookableVenueRoomAttributeType $type){
if($this->meeting_booking_room_allowed_attributes->contains($type)) return;
$this->meeting_booking_room_allowed_attributes->add($type);
$type->setSummit($this);
}
/**
* @param SummitBookableVenueRoomAttributeType $type
*/
public function removeMeetingBookingRoomAllowedAttribute(SummitBookableVenueRoomAttributeType $type){
if(!$this->meeting_booking_room_allowed_attributes->contains($type)) return;
$this->meeting_booking_room_allowed_attributes->removeElement($type);
}
/**
* @param int $id
* @return SummitBookableVenueRoomAttributeType|null
*/
public function getBookableAttributeTypeById(int $id):?SummitBookableVenueRoomAttributeType
{
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('id', intval($id)));
$attr = $this->meeting_booking_room_allowed_attributes->matching($criteria)->first();
return $attr === false ? null : $attr;
}
/**
* @param string $type
* @return SummitBookableVenueRoomAttributeType|null
*/
public function getBookableAttributeTypeByTypeName(string $type):?SummitBookableVenueRoomAttributeType
{
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('type', trim($type)));
$attr = $this->meeting_booking_room_allowed_attributes->matching($criteria)->first();
return $attr === false ? null : $attr;
}
public function getMaxReservationsPerDay():int {
$interval = $this->meeting_room_booking_end_time->diff( $this->meeting_room_booking_start_time);
$minutes = $interval->days * 24 * 60;
@ -2542,4 +2583,15 @@ SQL;
return intval ($minutes / $this->meeting_room_booking_slot_length);
}
/**
* @param int $id
* @return SummitBookableVenueRoomAttributeValue|null
*/
public function getMeetingBookingRoomAllowedAttributeValueById(int $id):?SummitBookableVenueRoomAttributeValue{
foreach($this->meeting_booking_room_allowed_attributes as $attribute_type){
$value = $attribute_type->getValueById($id);
if(!is_null($value)) return $value;
}
return null;
}
}

View File

@ -41,6 +41,9 @@ use App\Factories\EntityEvents\TrackGroupActionActionEntityEventFactory;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\App;
use LaravelDoctrine\ORM\Facades\EntityManager;
use models\summit\SummitRoomReservation;
/**
* Class EventServiceProvider
* @package App\Providers
@ -317,5 +320,27 @@ final class EventServiceProvider extends ServiceProvider
{
EntityEventPersister::persist(SummitActionEntityEventFactory::build($event, 'DELETE'));
});
// bookable rooms events
Event::listen(\App\Events\BookableRoomReservationRefundAccepted::class, function($event)
{
$repository = EntityManager::getRepository(SummitRoomReservation::class);
});
Event::listen(\App\Events\CreatedBookableRoomReservation::class, function($event)
{
$repository = EntityManager::getRepository(SummitRoomReservation::class);
});
Event::listen(\App\Events\PaymentBookableRoomReservationConfirmed::class, function($event)
{
$repository = EntityManager::getRepository(SummitRoomReservation::class);
});
Event::listen(\App\Events\RequestedBookableRoomReservationRefund::class, function($event)
{
$repository = EntityManager::getRepository(SummitRoomReservation::class);
});
}
}

View File

@ -27,6 +27,8 @@ use App\Models\Foundation\Summit\Repositories\ISelectionPlanRepository;
use App\Models\Foundation\Summit\Repositories\ISpeakerActiveInvolvementRepository;
use App\Models\Foundation\Summit\Repositories\ISpeakerEditPermissionRequestRepository;
use App\Models\Foundation\Summit\Repositories\ISpeakerOrganizationalRoleRepository;
use App\Models\Foundation\Summit\Repositories\ISummitBookableVenueRoomAttributeTypeRepository;
use App\Models\Foundation\Summit\Repositories\ISummitBookableVenueRoomAttributeValueRepository;
use App\Models\Foundation\Summit\Repositories\ISummitEventTypeRepository;
use App\Models\Foundation\Summit\Repositories\ISummitLocationBannerRepository;
use App\Models\Foundation\Summit\Repositories\ISummitLocationRepository;
@ -57,6 +59,8 @@ use models\summit\SpeakerOrganizationalRole;
use models\summit\SpeakerRegistrationRequest;
use models\summit\SpeakerSummitRegistrationPromoCode;
use models\summit\SummitAbstractLocation;
use models\summit\SummitBookableVenueRoomAttributeType;
use models\summit\SummitBookableVenueRoomAttributeValue;
use models\summit\SummitEventType;
use models\summit\SummitRegistrationPromoCode;
use models\summit\SummitRoomReservation;
@ -410,5 +414,19 @@ final class RepositoriesProvider extends ServiceProvider
}
);
App::singleton(
ISummitBookableVenueRoomAttributeTypeRepository::class,
function(){
return EntityManager::getRepository(SummitBookableVenueRoomAttributeType::class);
}
);
App::singleton(
ISummitBookableVenueRoomAttributeValueRepository::class,
function(){
return EntityManager::getRepository(SummitBookableVenueRoomAttributeValue::class);
}
);
}
}

View File

@ -24,7 +24,6 @@ use LaravelDoctrine\ORM\Facades\Registry;
abstract class SilverStripeDoctrineRepository extends DoctrineRepository
{
/**
* Initializes a new <tt>EntityRepository</tt>.
*

View File

@ -0,0 +1,62 @@
<?php namespace App\Repositories\Summit;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use App\Models\Foundation\Summit\Repositories\ISummitBookableVenueRoomAttributeTypeRepository;
use App\Repositories\SilverStripeDoctrineRepository;
use models\summit\SummitBookableVenueRoomAttributeType;
use utils\DoctrineJoinFilterMapping;
/**
* Class DoctrineSummitBookableVenueRoomAttributeTypeRepository
* @package App\Repositories\Summit
*/
final class DoctrineSummitBookableVenueRoomAttributeTypeRepository
extends SilverStripeDoctrineRepository implements ISummitBookableVenueRoomAttributeTypeRepository
{
/**
* @return array
*/
protected function getFilterMappings()
{
return
[
'type' => 'e.type:json_string',
'summit_id' => new DoctrineJoinFilterMapping
(
'e.summit',
's',
"s.id :operator ':value'"
),
];
}
/**
* @return array
*/
protected function getOrderMappings()
{
return [
'id' => 'e.id',
'type' => 'e.type',
];
}
/**
* @return string
*/
protected function getBaseEntity()
{
return SummitBookableVenueRoomAttributeType::class;
}
}

View File

@ -0,0 +1,67 @@
<?php namespace App\Repositories\Summit;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use App\Models\Foundation\Summit\Repositories\ISummitBookableVenueRoomAttributeValueRepository;
use App\Repositories\SilverStripeDoctrineRepository;
use models\summit\SummitBookableVenueRoomAttributeValue;
use utils\DoctrineJoinFilterMapping;
/**
* Class DoctrineSummitBookableVenueRoomAttributeValueRepository
* @package App\Repositories\Summit
*/
final class DoctrineSummitBookableVenueRoomAttributeValueRepository
extends SilverStripeDoctrineRepository implements ISummitBookableVenueRoomAttributeValueRepository
{
/**
* @return array
*/
protected function getFilterMappings()
{
return
[
'value' => 'e.value:json_string',
'summit_id' => new DoctrineJoinFilterMapping
(
'e.summit',
's',
"s.id :operator ':value'"
),
'type_id' => new DoctrineJoinFilterMapping
(
'e.type',
't',
"t.id :operator ':value'"
),
];
}
/**
* @return array
*/
protected function getOrderMappings()
{
return [
'id' => 'e.id',
'value' => 'e.value',
];
}
/**
* @return string
*/
protected function getBaseEntity()
{
return SummitBookableVenueRoomAttributeValue::class;
}
}

View File

@ -13,7 +13,16 @@
**/
use App\Models\Foundation\Summit\Repositories\ISummitRoomReservationRepository;
use App\Repositories\SilverStripeDoctrineRepository;
use Doctrine\ORM\Tools\Pagination\Paginator;
use models\summit\Summit;
use models\summit\SummitRoomReservation;
use utils\DoctrineFilterMapping;
use utils\DoctrineJoinFilterMapping;
use utils\Filter;
use utils\Order;
use utils\PagingInfo;
use utils\PagingResponse;
/**
* Class DoctrineSummitRoomReservationRepository
* @package App\Repositories\Summit
@ -32,11 +41,105 @@ class DoctrineSummitRoomReservationRepository
}
/**
* @param string $payment_gateway_cart_id
* @return SummitRoomReservation
* @return array
*/
public function getByPaymentGatewayCartId(string $payment_gateway_cart_id): SummitRoomReservation
protected function getFilterMappings()
{
return [
'status' => 'e.status:json_string',
'start_datetime' => 'e.start_datetime:datetime_epoch',
'end_datetime' => 'e.end_datetime:datetime_epoch',
'room_id' => new DoctrineJoinFilterMapping
(
'e.room',
'r',
"r.id :operator :value"
),
'venue_id' => new DoctrineJoinFilterMapping
(
'r.venue',
'v',
"v.id :operator :value"
),
'owner_id' => new DoctrineJoinFilterMapping
(
'e.owner',
'o',
"o.id :operator :value"
),
];
}
/**
* @param Summit $summit
* @param PagingInfo $paging_info
* @param Filter|null $filter
* @param Order|null $order
* @return PagingResponse
*/
public function getAllBySummitByPage(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null):PagingResponse{
$query = $this->getEntityManager()
->createQueryBuilder()
->select("e")
->from($this->getBaseEntity(), "e")
->join("e.room","r1")
->join("r1.venue", "v1")
->join("v1.summit", "s1")
->where("s1.id = ".$summit->getId())
;
$query = $this->applyExtraFilters($query);
if(!is_null($filter)){
$filter->apply2Query($query, $this->getFilterMappings());
}
if(!is_null($order)){
$order->apply2Query($query, $this->getOrderMappings());
}
$query = $query
->setFirstResult($paging_info->getOffset())
->setMaxResults($paging_info->getPerPage());
$paginator = new Paginator($query, $fetchJoinCollection = true);
$total = $paginator->count();
$data = array();
foreach($paginator as $entity)
array_push($data, $entity);
return new PagingResponse
(
$total,
$paging_info->getPerPage(),
$paging_info->getCurrentPage(),
$paging_info->getLastPage($total),
$data
);
}
/**
* @return array
*/
protected function getOrderMappings()
{
return [
'id' => 'e.id',
'start_datetime' => 'e.start_datetime',
'end_datetime' => 'e.end_datetime',
];
}
/**
* @param string $payment_gateway_cart_id
* @return SummitRoomReservation|null
*/
public function getByPaymentGatewayCartId(string $payment_gateway_cart_id):?SummitRoomReservation
{
return $this->findOneBy(["payment_gateway_cart_id" => trim($payment_gateway_cart_id)]);
}
}

View File

@ -13,6 +13,7 @@
**/
use App\Models\Foundation\Summit\Locations\Banners\SummitLocationBanner;
use models\main\Member;
use models\summit\SummitBookableVenueRoom;
use models\summit\SummitLocationImage;
use models\summit\SummitRoomReservation;
use models\summit\SummitVenueRoom;
@ -232,13 +233,77 @@ interface ILocationService
*/
public function processBookableRoomPayment(array $payload):void;
/**
* @param Summit $sumit
* @param Member $owner
* @param int $reservation_id
* @return SummitRoomReservation
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function cancelReservation(Summit $sumit, Member $owner, int $reservation_id):void;
public function cancelReservation(Summit $sumit, Member $owner, int $reservation_id):SummitRoomReservation;
/**
* @param SummitBookableVenueRoom $room
* @param int $reservation_id
* @param int $amount
* @return SummitRoomReservation
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function refundReservation(SummitBookableVenueRoom $room, int $reservation_id, int $amount):SummitRoomReservation;
/**
* @param Summit $summit
* @param int $venue_id
* @param int $room_id
* @return void
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function deleteVenueBookableRoom(Summit $summit, $venue_id, $room_id);
/**
* @param Summit $summit
* @param $venue_id
* @param array $data
* @return SummitVenueRoom
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function addVenueBookableRoom(Summit $summit, $venue_id, array $data);
/**
* @param Summit $summit
* @param int $venue_id
* @param int $room_id
* @param array $data
* @return SummitVenueRoom
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function updateVenueBookableRoom(Summit $summit, $venue_id, $room_id, array $data);
/**
* @param Summit $summit
* @param int $venue_id
* @param int $room_id
* @param int $attribute_id
* @return SummitBookableVenueRoom
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function addVenueBookableRoomAttribute(Summit $summit, int $venue_id, int $room_id, int $attribute_id):SummitBookableVenueRoom;
/**
* @param Summit $summit
* @param int $venue_id
* @param int $room_id
* @param int $attribute_id
* @return SummitBookableVenueRoom
* @throws EntityNotFoundException
* @throws ValidationException
*/
public function deleteVenueBookableRoomAttribute(Summit $summit, int $venue_id, int $room_id, int $attribute_id):SummitBookableVenueRoom;
}

View File

@ -19,6 +19,8 @@ use models\main\Member;
use models\summit\ConfirmationExternalOrderRequest;
use models\summit\Summit;
use models\summit\SummitAttendee;
use models\summit\SummitBookableVenueRoomAttributeType;
use models\summit\SummitBookableVenueRoomAttributeValue;
use models\summit\SummitEvent;
use models\summit\SummitEventFeedback;
use models\summit\SummitScheduleEmptySpot;
@ -273,4 +275,64 @@ interface ISummitService
*/
public function cloneEvent(Summit $summit, int $event_id):SummitEvent;
// bookable room attribute types
/**
* @param Summit $summit
* @param array $payload
* @return SummitBookableVenueRoomAttributeType
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function addBookableRoomAttribute(Summit $summit, array $payload):SummitBookableVenueRoomAttributeType;
/**
* @param Summit $summit
* @param int $type_id
* @param array $payload
* @return SummitBookableVenueRoomAttributeType
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function updateBookableRoomAttribute(Summit $summit, int $type_id, array $payload):SummitBookableVenueRoomAttributeType;
/**
* @param Summit $summit
* @param int $type_id
* @return void
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function deleteBookableRoomAttribute(Summit $summit, int $type_id):void;
/**
* @param Summit $summit
* @param int $type_id
* @param array $payload
* @return SummitBookableVenueRoomAttributeValue
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function addBookableRoomAttributeValue(Summit $summit, int $type_id, array $payload):SummitBookableVenueRoomAttributeValue;
/**
* @param Summit $summit
* @param int $type_id
* @param int $value_id
* @param array $payload
* @return SummitBookableVenueRoomAttributeValue
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function updateBookableRoomAttributeValue(Summit $summit, int $type_id, int $value_id, array $payload):SummitBookableVenueRoomAttributeValue;
/**
* @param Summit $summit
* @param int $type_id
* @param int $value_id
* @return void
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function deleteBookableRoomAttributeValue(Summit $summit, int $type_id, int $value_id):void;
}

File diff suppressed because it is too large Load Diff

View File

@ -55,6 +55,8 @@ use models\summit\PresentationType;
use models\summit\Summit;
use models\summit\SummitAttendee;
use models\summit\SummitAttendeeTicket;
use models\summit\SummitBookableVenueRoomAttributeType;
use models\summit\SummitBookableVenueRoomAttributeValue;
use models\summit\SummitEvent;
use models\summit\SummitEventFactory;
use models\summit\SummitEventFeedback;
@ -1891,4 +1893,163 @@ final class SummitService extends AbstractService implements ISummitService
});
}
/**
* @param Summit $summit
* @param array $payload
* @return SummitBookableVenueRoomAttributeType
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function addBookableRoomAttribute(Summit $summit, array $payload): SummitBookableVenueRoomAttributeType
{
return $this->tx_service->transaction(function () use ($summit, $payload) {
$type_name = trim($payload['type']);
$former_type = $summit->getBookableAttributeTypeByTypeName($type_name);
if(!is_null($former_type))
throw new ValidationException(sprintf("bookable room attr type %s already exists on summit %s", $type_name, $summit->getId()));
$type = new SummitBookableVenueRoomAttributeType();
$type->setType($type_name);
$summit->addMeetingBookingRoomAllowedAttribute($type);
return $type;
});
}
/**
* @param Summit $summit
* @param int $type_id
* @param array $payload
* @return SummitBookableVenueRoomAttributeType
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function updateBookableRoomAttribute(Summit $summit, int $type_id, array $payload): SummitBookableVenueRoomAttributeType
{
return $this->tx_service->transaction(function () use ($summit, $type_id, $payload) {
$type = $summit->getBookableAttributeTypeById($type_id);
if(is_null($type))
throw new EntityNotFoundException();
$type_name = trim($payload['type']);
$former_type = $summit->getBookableAttributeTypeByTypeName($type_name);
if(!is_null($former_type) && $type_id != $former_type->getId())
throw new ValidationException(sprintf("bookable room attr type %s already exists on summit %s", $type_name, $summit->getId()));
$type->setType($type_name);
return $type;
});
}
/**
* @param Summit $summit
* @param int $type_id
* @return void
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function deleteBookableRoomAttribute(Summit $summit, int $type_id): void
{
$this->tx_service->transaction(function () use ($summit, $type_id) {
$type = $summit->getBookableAttributeTypeById($type_id);
if(is_null($type))
throw new EntityNotFoundException();
$summit->removeMeetingBookingRoomAllowedAttribute($type);
});
}
/**
* @param Summit $summit
* @param int $type_id
* @param array $payload
* @return SummitBookableVenueRoomAttributeValue
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function addBookableRoomAttributeValue(Summit $summit, int $type_id, array $payload): SummitBookableVenueRoomAttributeValue
{
return $this->tx_service->transaction(function () use ($summit, $type_id, $payload) {
$type = $summit->getBookableAttributeTypeById($type_id);
if (is_null($type))
throw new EntityNotFoundException();
$value_name = trim($payload['value']);
$former_value = $type->getValueByValue($value_name);
if (!is_null($former_value))
throw new ValidationException(sprintf("bookable room attr value %s already exists on summit %s", $value_name, $summit->getId()));
$value = new SummitBookableVenueRoomAttributeValue();
$value->setValue($value_name);
$type->addValue($value);
return $value;
});
}
/**
* @param Summit $summit
* @param int $type_id
* @param int $value_id
* @param array $payload
* @return SummitBookableVenueRoomAttributeValue
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function updateBookableRoomAttributeValue(Summit $summit, int $type_id, int $value_id, array $payload): SummitBookableVenueRoomAttributeValue
{
return $this->tx_service->transaction(function () use ($summit, $type_id, $value_id, $payload) {
$type = $summit->getBookableAttributeTypeById($type_id);
if (is_null($type))
throw new EntityNotFoundException();
$value = $type->getValueById($value_id);
if (is_null($value))
throw new EntityNotFoundException();
$value_name = trim($payload['value']);
$former_value = $type->getValueByValue($value_name);
if (!is_null($former_value) && $value_id != $former_value->getId())
throw new ValidationException(sprintf("bookable room attr value %s already exists on summit %s", $value_name, $summit->getId()));
$value->setValue($value_name);
return $value;
});
}
/**
* @param Summit $summit
* @param int $type_id
* @param int $value_id
* @return void
* @throws ValidationException
* @throws EntityNotFoundException
*/
public function deleteBookableRoomAttributeValue(Summit $summit, int $type_id, int $value_id): void
{
$this->tx_service->transaction(function () use ($summit, $type_id, $value_id) {
$type = $summit->getBookableAttributeTypeById($type_id);
if (is_null($type))
throw new EntityNotFoundException();
$value = $type->getValueById($value_id);
if (is_null($value))
throw new EntityNotFoundException();
$type->removeValue($value);
});
}
}

View File

@ -152,6 +152,91 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
// bookable rooms attributes types
[
'name' => 'get-summit-bookable-room-attribute-types',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadSummitData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'get-summit-bookable-room-attribute-types-by-id',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadSummitData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'update-summit-bookable-room-attribute-type',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}',
'http_method' => 'PUT',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
],
],
[
'name' => 'delete-summit-bookable-room-attribute-type',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}',
'http_method' => 'DELETE',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
],
],
[
'name' => 'add-summit-bookable-room-attribute-type',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types',
'http_method' => 'POST',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
],
],
[
'name' => 'get-summit-bookable-room-attribute-type-values',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadSummitData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'add-summit-bookable-room-attribute-type-values',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values',
'http_method' => 'POST',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
],
],
[
'name' => 'get-summit-bookable-room-attribute-type-value',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values/{value_id}',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadSummitData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'update-summit-bookable-room-attribute-type-value',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values/{value_id}',
'http_method' => 'PUT',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
],
],
[
'name' => 'delete-summit-bookable-room-attribute-type-value',
'route' => '/api/v1/summits/{id}/bookable-room-attribute-types/{type_id}/values/{value_id}',
'http_method' => 'DELETE',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
],
],
// attendees
[
'name' => 'get-attendees',
@ -1103,6 +1188,33 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::WriteMyBookableRoomsReservationData, $current_realm),
],
],
[
'name' => 'refund-bookable-venue-room-reservation',
'route' => '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/refund',
'http_method' => 'DELETE',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
sprintf(SummitScopes::WriteBookableRoomsData, $current_realm),
],
],
[
'name' => 'get-bookable-venue-room-reservations-by-summit',
'route' => '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadAllSummitData, $current_realm),
sprintf(SummitScopes::ReadSummitData, $current_realm),
],
],
[
'name' => 'get-bookable-venue-room-reservation',
'route' => '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadAllSummitData, $current_realm),
sprintf(SummitScopes::ReadSummitData, $current_realm),
],
],
[
'name' => 'create-bookable-venue-room-reservation',
'route' => '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations',
@ -1138,6 +1250,25 @@ class ApiEndpointsSeeder extends Seeder
sprintf(SummitScopes::WriteBookableRoomsData, $current_realm),
],
],
// bookable room attributes
[
'name' => 'add-bookable-venue-room-attribute',
'route' => '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}',
'http_method' => 'PUT',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
sprintf(SummitScopes::WriteBookableRoomsData, $current_realm),
],
],
[
'name' => 'remove-bookable-venue-room-attribute',
'route' => '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}',
'http_method' => 'DELETE',
'scopes' => [
sprintf(SummitScopes::WriteSummitData, $current_realm),
sprintf(SummitScopes::WriteBookableRoomsData, $current_realm),
],
],
// floor rooms
[
'name' => 'get-venue-floor-room',

View File

@ -0,0 +1,117 @@
<?php namespace Tests;
/**
* Copyright 2019 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
/**
* Class OAuth2BookableRoomAttributeTypesApiTest
* @package Tests
*/
final class OAuth2BookableRoomAttributeTypesApiTest extends \ProtectedApiTest
{
public function testGetBookableAttributeTypesBySummit($summit_id = 27){
$params = [
'id' => $summit_id,
'page' => 1 ,
'per_page' => 10,
'expand' => 'values'
];
$headers = array("HTTP_Authorization" => " Bearer " .$this->access_token);
$response = $this->action(
"GET",
"OAuth2SummitBookableRoomsAttributeTypeApiController@getAllBookableRoomAttributeTypes",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$attributes = json_decode($content);
$this->assertResponseStatus(200);
$this->assertTrue(count($attributes->data) > 0);
}
public function testAddAttributeType($summit_id = 27){
$params = [
'id' => $summit_id,
];
$type = str_random(16).'_attribute_type';
$data = [
'type' => $type
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"POST",
"OAuth2SummitBookableRoomsAttributeTypeApiController@addBookableRoomAttributeType",
$params,
[],
[],
[],
$headers,
json_encode($data)
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$attribute_type = json_decode($content);
$this->assertTrue(!is_null($attribute_type));
return $attribute_type;
}
public function testAddAttributeValue($summit_id = 27){
$type = $this->testAddAttributeType($summit_id);
$params = [
'id' => $summit_id,
'type_id' => $type->id,
];
$val = str_random(16).'_attribute_value';
$data = [
'value' => $val
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"POST",
"OAuth2SummitBookableRoomsAttributeTypeApiController@addBookableRoomAttributeValue",
$params,
[],
[],
[],
$headers,
json_encode($data)
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$attribute_value = json_decode($content);
$this->assertTrue(!is_null($attribute_value));
return $attribute_value;
}
}

View File

@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use LaravelDoctrine\ORM\Facades\EntityManager;
/**
* Class OAuth2SummitLocationsApiTest
*/
@ -1527,4 +1527,185 @@ final class OAuth2SummitLocationsApiTest extends ProtectedApiTest
$this->assertTrue(!is_null($reservations));
}
/**
* @param int $summit_id
*/
public function testAddBookableRoom($summit_id = 27){
$summit_repository = EntityManager::getRepository(\models\summit\Summit::class);
$summit = $summit_repository->getById($summit_id);
$this->assertTrue(!is_null($summit));
if(!$summit instanceof \models\summit\Summit) return;
$venues = $summit->getVenues();
$this->assertTrue($venues->count() > 0 );
$venue = $venues->first();
$params = [
'id' => $summit_id,
'venue_id' => $venue->getId()
];
$name = str_random(16).'_bookable_room';
$data = [
'name' => $name,
'capacity' => 10,
'description' => 'test bookable room',
'time_slot_cost' => 200,
'currency' => 'USD',
];
$headers =
[
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action
(
"POST",
"OAuth2SummitLocationsApiController@addVenueBookableRoom",
$params,
[],
[],
[],
$headers,
json_encode($data)
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$bookable_room = json_decode($content);
$this->assertTrue(!is_null($bookable_room));
$this->assertTrue($bookable_room->name == $name);
return $bookable_room;
}
public function testUpdateBookableRooms($summit_id = 27){
$bookable_room = $this->testAddBookableRoom($summit_id);
$this->assertTrue(!is_null($bookable_room));
$params = [
'id' => $summit_id,
'venue_id' => $bookable_room->venue_id,
'room_id' => $bookable_room->id,
];
$name = str_random(16).'_bookable_room_update';
$data = [
'name' => $name,
'capacity' => 14,
'time_slot_cost' => 250,
];
$headers =
[
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action
(
"PUT",
"OAuth2SummitLocationsApiController@updateVenueBookableRoom",
$params,
[],
[],
[],
$headers,
json_encode($data)
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$bookable_room = json_decode($content);
$this->assertTrue(!is_null($bookable_room));
$this->assertTrue($bookable_room->name == $name);
return $bookable_room;
}
/**
* @param int $summit_id
*/
public function testAddBookableRoomAttributeValue($summit_id = 27){
$summit_repository = EntityManager::getRepository(\models\summit\Summit::class);
$summit = $summit_repository->getById($summit_id);
$this->assertTrue(!is_null($summit));
if(!$summit instanceof \models\summit\Summit) return;
$rooms = $summit->getBookableRooms();
$room = $rooms->first();
$attributes = $summit->getMeetingBookingRoomAllowedAttributes();
$attribute = $attributes->last();
$values = $attribute->getValues();
$value = $values->first();
$params = [
'id' => $summit_id,
'venue_id' => $room->getVenueId(),
'room_id' => $room->getId(),
'attribute_id' => $value->getId()
];
$headers =
[
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action
(
"PUT",
"OAuth2SummitLocationsApiController@addVenueBookableRoomAttribute",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$bookable_room = json_decode($content);
$this->assertTrue(!is_null($bookable_room));
}
public function testGetAllReservationsBySummit($summit_id =27){
$params = [
'id' => $summit_id,
'filter' => 'status==Reserved,room_id==1'
];
$headers =
[
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action
(
"GET",
"OAuth2SummitLocationsApiController@getAllReservationsBySummit",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(200);
$reservations = json_decode($content);
$this->assertTrue(!is_null($reservations));
}
}