Skip to content

Commit

Permalink
feat: new locations endpoints
Browse files Browse the repository at this point in the history
GET api/v1/summits/{id}/locations/venues/all/rooms

filters:
name
floor_name
venue_name
description

orders

id
name
order
venue_name
floor_name

new alias

GET api/v1/summits/{id}/locations/all/bookable-rooms
  • Loading branch information
smarcet committed Feb 3, 2025
1 parent 61477ce commit 88fa6bc
Show file tree
Hide file tree
Showing 5 changed files with 170 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,56 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) {
);
}

public function getAllVenuesRooms($summit_id){

$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();

return $this->_getAll(
function () {
return [
'name' => ['==', '=@','@@'],
'floor_name' =>['==', '=@','@@'],
'venue_name' =>['==', '=@','@@'],
'description' => ['=@','@@'],
];
},
function () {
return [
'name' => 'sometimes|string',
'floor_name' => 'sometimes|string',
'venue_name' => 'sometimes|string',
'description' => 'sometimes|string',
];
},
function () {
return [
'id',
'name',
'order',
'venue_name',
'floor_name',
];
},
function ($filter) {
return $filter;
},
function () {
return SerializerRegistry::SerializerType_Public;
},
null,
null,
function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) {
return $this->location_repository->getAllVenueRoomsBySummit
(
$summit,
new PagingInfo($page, $per_page),
call_user_func($applyExtraFilters, $filter),
$order
);
}
);
}
/**
* @param $summit_id
* @return mixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
* limitations under the License.
**/
use models\summit\Summit;
use utils\Filter;
use utils\Order;
use utils\PagingInfo;
use utils\PagingResponse;

/**
* Interface ISummitLocationRepository
* @package App\Models\Foundation\Summit\Repositories
Expand All @@ -30,4 +35,19 @@ public function getMetadata(Summit $summit);
* @throws \Doctrine\DBAL\Driver\Exception
*/
public function deleteAllBySummit(int $summit_id):bool;

/**
* @param Summit $summit
* @param PagingInfo $paging_info
* @param Filter|null $filter
* @param Order|null $order
* @return PagingResponse
*/
public function getAllVenueRoomsBySummit
(
Summit $summit,
PagingInfo $paging_info,
Filter $filter = null,
Order $order = null
):PagingResponse;
}
81 changes: 77 additions & 4 deletions app/Repositories/Summit/DoctrineSummitLocationRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public function getBySummit
->from(SummitAbstractLocation::class, "al")
->leftJoin(SummitGeoLocatedLocation::class, 'gll', 'WITH', 'gll.id = al.id')
->leftJoin(SummitVenue::class, 'v', 'WITH', 'v.id = gll.id')
->leftJoin(SummitVenueRoom::class, 'vr', 'WITH', 'v.id = gll.id')
->leftJoin(SummitExternalLocation::class, 'el', 'WITH', 'el.id = gll.id')
->leftJoin(SummitHotel::class, 'h', 'WITH', 'h.id = el.id')
->leftJoin(SummitAirport::class, 'ap', 'WITH', 'ap.id = el.id')
->leftJoin(SummitVenueRoom::class, 'r', 'WITH', 'r.id = al.id')
Expand Down Expand Up @@ -160,17 +160,17 @@ public function getBySummit
$query = $query->addOrderBy("al.id",'ASC');
}

if($filter->hasFilter("rooms_name") || $filter->hasFilter("rooms_floor_name")){
if(!is_null($filter) && ($filter->hasFilter("rooms_name") || $filter->hasFilter("rooms_floor_name"))){
$query = $query->leftJoin('v.rooms', 'v_rooms');
if($filter->hasFilter("rooms_floor_name")){
$query = $query->leftJoin('v_rooms.floor', 'v_rooms_floor');
}
}
if($filter->hasFilter("floors_name")){
if(!is_null($filter) && $filter->hasFilter("floors_name")){
$query = $query->leftJoin('v.floors', 'v_floors');
}

if($filter->hasFilter("availability_day")){
if(!is_null($filter) && $filter->hasFilter("availability_day")){
// special case, we need to figure if each room has available slots
$res = $query->getQuery()->execute();
$rooms = [];
Expand Down Expand Up @@ -249,5 +249,78 @@ public function deleteAllBySummit(int $summit_id):bool{
{
Log::error($ex);
}
return true;
}

/**
* @param Summit $summit
* @param PagingInfo $paging_info
* @param Filter|null $filter
* @param Order|null $order
* @return PagingResponse
*/
public function getAllVenueRoomsBySummit(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null): PagingResponse
{
$query = $this->getEntityManager()
->createQueryBuilder()
->select("al")
->from(SummitAbstractLocation::class, "al")
->leftJoin(SummitVenueRoom::class, 'r', 'WITH', 'al.id = r.id')
->leftJoin('al.summit', 's')
->where("s.id = :summit_id");

if((!is_null($filter) &&$filter->hasFilter("floor_name")) ||
(!is_null($order) && $order->hasOrder("floor_name"))){
$query = $query->leftJoin('r.floor', 'f');
}

if((!is_null($filter) && $filter->hasFilter("venue_name")) ||
(!is_null($order) && $order->hasOrder("venue_name"))){
$query = $query->leftJoin('r.venue', 'v');
}

$query->setParameter("summit_id", $summit->getId());

if(!is_null($filter)){
$filter->apply2Query($query, [
'name' => 'al.name:json_string',
'floor_name' => 'f.name:json_string',
'description' => 'al.description:json_string',
'venue_name' => 'v.name:json_string',
]);
}

if (!is_null($order)) {
$order->apply2Query($query, [
'id' => 'al.id',
'name' => 'al.name',
'order' => 'al.order',
'venue_name' => 'v.name',
'floor_name' => 'f.name',
]);
} else {
//default order
$query = $query->addOrderBy("al.id",'ASC');
}

$query = $query
->setFirstResult($paging_info->getOffset())
->setMaxResults($paging_info->getPerPage());

$paginator = new Paginator($query, $fetchJoinCollection = true);
$total = $paginator->count();
$data = [];

foreach($paginator as $entity)
$data[] = $entity;

return new PagingResponse
(
$total,
$paging_info->getPerPage(),
$paging_info->getCurrentPage(),
$paging_info->getLastPage($total),
$data
);
}
}
18 changes: 18 additions & 0 deletions database/seeders/ApiEndpointsSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -4505,6 +4505,15 @@ private function seedSummitEndpoints()
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'get-all-venues-rooms',
'route' => '/api/v1/summits/{id}/locations/venues/all/rooms',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadSummitData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'add-venue',
'route' => '/api/v1/summits/{id}/locations/venues',
Expand Down Expand Up @@ -4869,6 +4878,15 @@ private function seedSummitEndpoints()
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'get-all-bookable-venue-rooms',
'route' => '/api/v1/summits/{id}/locations/all/bookable-rooms',
'http_method' => 'GET',
'scopes' => [
sprintf(SummitScopes::ReadBookableRoomsData, $current_realm),
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
],
],
[
'name' => 'get-bookable-venue-room',
'route' => '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}',
Expand Down
6 changes: 5 additions & 1 deletion routes/api_v1.php
Original file line number Diff line number Diff line change
Expand Up @@ -874,7 +874,11 @@

Route::get('', 'OAuth2SummitLocationsApiController@getVenues');
Route::post('', ['middleware' => 'auth.user', 'uses' => 'OAuth2SummitLocationsApiController@addVenue']);

Route::group(['prefix' => 'all'], function () {
Route::group(['prefix' => 'rooms'], function () {
Route::get('', 'OAuth2SummitLocationsApiController@getAllVenuesRooms');
});
});
Route::group(['prefix' => '{venue_id}'], function () {
Route::put('', ['middleware' => 'auth.user', 'uses' => 'OAuth2SummitLocationsApiController@updateVenue']);

Expand Down

0 comments on commit 88fa6bc

Please sign in to comment.