Skip to content

Commit d89e098

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 d89e098

5 files changed

Lines changed: 162 additions & 5 deletions

File tree

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: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
* limitations under the License.
1313
**/
1414
use models\summit\Summit;
15+
use utils\Filter;
16+
use utils\Order;
17+
use utils\PagingInfo;
18+
1519
/**
1620
* Interface ISummitLocationRepository
1721
* @package App\Models\Foundation\Summit\Repositories
@@ -30,4 +34,19 @@ public function getMetadata(Summit $summit);
3034
* @throws \Doctrine\DBAL\Driver\Exception
3135
*/
3236
public function deleteAllBySummit(int $summit_id):bool;
37+
38+
/**
39+
* @param Summit $summit
40+
* @param PagingInfo $paging_info
41+
* @param Filter|null $filter
42+
* @param Order|null $order
43+
* @return PagingInfo
44+
*/
45+
public function getAllVenueRoomsBySummit
46+
(
47+
Summit $summit,
48+
PagingInfo $paging_info,
49+
Filter $filter = null,
50+
Order $order = null
51+
):PagingInfo;
3352
}

app/Repositories/Summit/DoctrineSummitLocationRepository.php

Lines changed: 70 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,71 @@ public function deleteAllBySummit(int $summit_id):bool{
249249
{
250250
Log::error($ex);
251251
}
252+
return true;
253+
}
254+
255+
public function getAllVenueRoomsBySummit(Summit $summit, PagingInfo $paging_info, Filter $filter = null, Order $order = null): PagingInfo
256+
{
257+
$query = $this->getEntityManager()
258+
->createQueryBuilder()
259+
->select("al")
260+
->from(SummitAbstractLocation::class, "al")
261+
->leftJoin(SummitVenueRoom::class, 'r', 'WITH', 'al.id = r.id')
262+
->leftJoin('al.summit', 's')
263+
->where("s.id = :summit_id");
264+
265+
if((!is_null($filter) &&$filter->hasFilter("floor_name")) ||
266+
(!is_null($order) && $order->hasOrder("floor_name"))){
267+
$query = $query->leftJoin('r.floor', 'f');
268+
}
269+
270+
if((!is_null($filter) && $filter->hasFilter("venue_name")) ||
271+
(!is_null($order) && $order->hasOrder("venue_name"))){
272+
$query = $query->leftJoin('r.venue', 'v');
273+
}
274+
275+
$query->setParameter("summit_id", $summit->getId());
276+
277+
if(!is_null($filter)){
278+
$filter->apply2Query($query, [
279+
'name' => 'al.name:json_string',
280+
'floor_name' => 'f.name:json_string',
281+
'description' => 'al.description:json_string',
282+
'venue_name' => 'v.name:json_string',
283+
]);
284+
}
285+
286+
if (!is_null($order)) {
287+
$order->apply2Query($query, [
288+
'id' => 'al.id',
289+
'name' => 'al.name',
290+
'order' => 'al.order',
291+
'venue_name' => 'v.name',
292+
'floor_name' => 'f.name',
293+
]);
294+
} else {
295+
//default order
296+
$query = $query->addOrderBy("al.id",'ASC');
297+
}
298+
299+
$query = $query
300+
->setFirstResult($paging_info->getOffset())
301+
->setMaxResults($paging_info->getPerPage());
302+
303+
$paginator = new Paginator($query, $fetchJoinCollection = true);
304+
$total = $paginator->count();
305+
$data = [];
306+
307+
foreach($paginator as $entity)
308+
$data[] = $entity;
309+
310+
return new PagingResponse
311+
(
312+
$total,
313+
$paging_info->getPerPage(),
314+
$paging_info->getCurrentPage(),
315+
$paging_info->getLastPage($total),
316+
$data
317+
);
252318
}
253319
}

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)