Skip to content

Commit 88fa6bc

Browse files
committed
feat: new locations endpoints
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
1 parent 61477ce commit 88fa6bc

File tree

5 files changed

+170
-5
lines changed

5 files changed

+170
-5
lines changed

app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,56 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) {
281281
);
282282
}
283283

284+
public function getAllVenuesRooms($summit_id){
285+
286+
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
287+
if (is_null($summit)) return $this->error404();
288+
289+
return $this->_getAll(
290+
function () {
291+
return [
292+
'name' => ['==', '=@','@@'],
293+
'floor_name' =>['==', '=@','@@'],
294+
'venue_name' =>['==', '=@','@@'],
295+
'description' => ['=@','@@'],
296+
];
297+
},
298+
function () {
299+
return [
300+
'name' => 'sometimes|string',
301+
'floor_name' => 'sometimes|string',
302+
'venue_name' => 'sometimes|string',
303+
'description' => 'sometimes|string',
304+
];
305+
},
306+
function () {
307+
return [
308+
'id',
309+
'name',
310+
'order',
311+
'venue_name',
312+
'floor_name',
313+
];
314+
},
315+
function ($filter) {
316+
return $filter;
317+
},
318+
function () {
319+
return SerializerRegistry::SerializerType_Public;
320+
},
321+
null,
322+
null,
323+
function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) {
324+
return $this->location_repository->getAllVenueRoomsBySummit
325+
(
326+
$summit,
327+
new PagingInfo($page, $per_page),
328+
call_user_func($applyExtraFilters, $filter),
329+
$order
330+
);
331+
}
332+
);
333+
}
284334
/**
285335
* @param $summit_id
286336
* @return mixed

app/Models/Foundation/Summit/Repositories/ISummitLocationRepository.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
* limitations under the License.
1313
**/
1414
use models\summit\Summit;
15+
use utils\Filter;
16+
use utils\Order;
17+
use utils\PagingInfo;
18+
use utils\PagingResponse;
19+
1520
/**
1621
* Interface ISummitLocationRepository
1722
* @package App\Models\Foundation\Summit\Repositories
@@ -30,4 +35,19 @@ public function getMetadata(Summit $summit);
3035
* @throws \Doctrine\DBAL\Driver\Exception
3136
*/
3237
public function deleteAllBySummit(int $summit_id):bool;
38+
39+
/**
40+
* @param Summit $summit
41+
* @param PagingInfo $paging_info
42+
* @param Filter|null $filter
43+
* @param Order|null $order
44+
* @return PagingResponse
45+
*/
46+
public function getAllVenueRoomsBySummit
47+
(
48+
Summit $summit,
49+
PagingInfo $paging_info,
50+
Filter $filter = null,
51+
Order $order = null
52+
):PagingResponse;
3353
}

app/Repositories/Summit/DoctrineSummitLocationRepository.php

Lines changed: 77 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public function getBySummit
128128
->from(SummitAbstractLocation::class, "al")
129129
->leftJoin(SummitGeoLocatedLocation::class, 'gll', 'WITH', 'gll.id = al.id')
130130
->leftJoin(SummitVenue::class, 'v', 'WITH', 'v.id = gll.id')
131-
->leftJoin(SummitVenueRoom::class, 'vr', 'WITH', 'v.id = gll.id')
131+
->leftJoin(SummitExternalLocation::class, 'el', 'WITH', 'el.id = gll.id')
132132
->leftJoin(SummitHotel::class, 'h', 'WITH', 'h.id = el.id')
133133
->leftJoin(SummitAirport::class, 'ap', 'WITH', 'ap.id = el.id')
134134
->leftJoin(SummitVenueRoom::class, 'r', 'WITH', 'r.id = al.id')
@@ -160,17 +160,17 @@ public function getBySummit
160160
$query = $query->addOrderBy("al.id",'ASC');
161161
}
162162

163-
if($filter->hasFilter("rooms_name") || $filter->hasFilter("rooms_floor_name")){
163+
if(!is_null($filter) && ($filter->hasFilter("rooms_name") || $filter->hasFilter("rooms_floor_name"))){
164164
$query = $query->leftJoin('v.rooms', 'v_rooms');
165165
if($filter->hasFilter("rooms_floor_name")){
166166
$query = $query->leftJoin('v_rooms.floor', 'v_rooms_floor');
167167
}
168168
}
169-
if($filter->hasFilter("floors_name")){
169+
if(!is_null($filter) && $filter->hasFilter("floors_name")){
170170
$query = $query->leftJoin('v.floors', 'v_floors');
171171
}
172172

173-
if($filter->hasFilter("availability_day")){
173+
if(!is_null($filter) && $filter->hasFilter("availability_day")){
174174
// special case, we need to figure if each room has available slots
175175
$res = $query->getQuery()->execute();
176176
$rooms = [];
@@ -249,5 +249,78 @@ public function deleteAllBySummit(int $summit_id):bool{
249249
{
250250
Log::error($ex);
251251
}
252+
return true;
253+
}
254+
255+
/**
256+
* @param Summit $summit
257+
* @param PagingInfo $paging_info
258+
* @param Filter|null $filter
259+
* @param Order|null $order
260+
* @return PagingResponse
261+
*/
262+
public function getAllVenueRoomsBySummit(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null): PagingResponse
263+
{
264+
$query = $this->getEntityManager()
265+
->createQueryBuilder()
266+
->select("al")
267+
->from(SummitAbstractLocation::class, "al")
268+
->leftJoin(SummitVenueRoom::class, 'r', 'WITH', 'al.id = r.id')
269+
->leftJoin('al.summit', 's')
270+
->where("s.id = :summit_id");
271+
272+
if((!is_null($filter) &&$filter->hasFilter("floor_name")) ||
273+
(!is_null($order) && $order->hasOrder("floor_name"))){
274+
$query = $query->leftJoin('r.floor', 'f');
275+
}
276+
277+
if((!is_null($filter) && $filter->hasFilter("venue_name")) ||
278+
(!is_null($order) && $order->hasOrder("venue_name"))){
279+
$query = $query->leftJoin('r.venue', 'v');
280+
}
281+
282+
$query->setParameter("summit_id", $summit->getId());
283+
284+
if(!is_null($filter)){
285+
$filter->apply2Query($query, [
286+
'name' => 'al.name:json_string',
287+
'floor_name' => 'f.name:json_string',
288+
'description' => 'al.description:json_string',
289+
'venue_name' => 'v.name:json_string',
290+
]);
291+
}
292+
293+
if (!is_null($order)) {
294+
$order->apply2Query($query, [
295+
'id' => 'al.id',
296+
'name' => 'al.name',
297+
'order' => 'al.order',
298+
'venue_name' => 'v.name',
299+
'floor_name' => 'f.name',
300+
]);
301+
} else {
302+
//default order
303+
$query = $query->addOrderBy("al.id",'ASC');
304+
}
305+
306+
$query = $query
307+
->setFirstResult($paging_info->getOffset())
308+
->setMaxResults($paging_info->getPerPage());
309+
310+
$paginator = new Paginator($query, $fetchJoinCollection = true);
311+
$total = $paginator->count();
312+
$data = [];
313+
314+
foreach($paginator as $entity)
315+
$data[] = $entity;
316+
317+
return new PagingResponse
318+
(
319+
$total,
320+
$paging_info->getPerPage(),
321+
$paging_info->getCurrentPage(),
322+
$paging_info->getLastPage($total),
323+
$data
324+
);
252325
}
253326
}

database/seeders/ApiEndpointsSeeder.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4505,6 +4505,15 @@ private function seedSummitEndpoints()
45054505
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
45064506
],
45074507
],
4508+
[
4509+
'name' => 'get-all-venues-rooms',
4510+
'route' => '/api/v1/summits/{id}/locations/venues/all/rooms',
4511+
'http_method' => 'GET',
4512+
'scopes' => [
4513+
sprintf(SummitScopes::ReadSummitData, $current_realm),
4514+
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
4515+
],
4516+
],
45084517
[
45094518
'name' => 'add-venue',
45104519
'route' => '/api/v1/summits/{id}/locations/venues',
@@ -4869,6 +4878,15 @@ private function seedSummitEndpoints()
48694878
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
48704879
],
48714880
],
4881+
[
4882+
'name' => 'get-all-bookable-venue-rooms',
4883+
'route' => '/api/v1/summits/{id}/locations/all/bookable-rooms',
4884+
'http_method' => 'GET',
4885+
'scopes' => [
4886+
sprintf(SummitScopes::ReadBookableRoomsData, $current_realm),
4887+
sprintf(SummitScopes::ReadAllSummitData, $current_realm)
4888+
],
4889+
],
48724890
[
48734891
'name' => 'get-bookable-venue-room',
48744892
'route' => '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}',

routes/api_v1.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,11 @@
874874

875875
Route::get('', 'OAuth2SummitLocationsApiController@getVenues');
876876
Route::post('', ['middleware' => 'auth.user', 'uses' => 'OAuth2SummitLocationsApiController@addVenue']);
877-
877+
Route::group(['prefix' => 'all'], function () {
878+
Route::group(['prefix' => 'rooms'], function () {
879+
Route::get('', 'OAuth2SummitLocationsApiController@getAllVenuesRooms');
880+
});
881+
});
878882
Route::group(['prefix' => '{venue_id}'], function () {
879883
Route::put('', ['middleware' => 'auth.user', 'uses' => 'OAuth2SummitLocationsApiController@updateVenue']);
880884

0 commit comments

Comments
 (0)