Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions api/v1/navigations/PKPNavigationController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?php

/**
* @file api/v1/navigations/PKPNavigationController.php
*
* Copyright (c) 2023-2025 Simon Fraser University
* Copyright (c) 2023-2025 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class PKPNavigationController
*
* @ingroup api_v1_navigation
*
* @brief Handle API requests for navigation operations.
*
*/

namespace PKP\API\v1\navigations;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Route;
use PKP\API\v1\navigations\resources\NavigationResource;
use PKP\core\PKPBaseController;
use PKP\navigationMenu\models\NavigationMenu;

class PKPNavigationController extends PKPBaseController
{
/** @var array Routes that can be accessed without user authentication */
public array $publicAccessRoutes = [
'get', // Allow public access to navigation endpoint
];


/**
* @copydoc \PKP\core\PKPBaseController::getHandlerPath()
*/
public function getHandlerPath(): string
{
return 'navigations';
}

/**
* @copydoc \PKP\core\PKPBaseController::getRouteGroupMiddleware()
*/
public function getRouteGroupMiddleware(): array
{
return [
'has.context',
];
}

/**
* @copydoc \PKP\core\PKPBaseController::getGroupRoutes()
*/
public function getGroupRoutes(): void
{
Route::get('{areaName}/public', $this->getPublic(...))
->name('navigation.get')
->where('areaName', '[0-9]+|[a-zA-Z0-9\-_]+');
}

/**
* Get navigation menu by ID with formatted menu items and nesting
*/
public function getPublic(Request $illuminateRequest): JsonResponse
{
$navigationMenu = NavigationMenu::where('area_name', $illuminateRequest->route('areaName'))
->where('context_id', $this->getRequest()->getContext()->getId())->first();

if (!$navigationMenu) {
return response()->json([
'error' => 'Navigation menu not found'
], Response::HTTP_NOT_FOUND);
}

return response()->json(
(new NavigationResource($navigationMenu))->toArray($illuminateRequest),
Response::HTTP_OK
);
}

}
53 changes: 53 additions & 0 deletions api/v1/navigations/resources/NavigationMenuItemResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

/**
* @file api/v1/navigations/resources/NavigationMenuItemResource.php
*
* Copyright (c) 2014-2025 Simon Fraser University
* Copyright (c) 2003-2025 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class NavigationMenuItemResource
*
* @brief Transforms the API response of navigation menu items into the desired format
*
*/

namespace PKP\API\v1\navigations\resources;

use APP\core\Application;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use PKP\core\traits\ResourceWithData;
use PKP\facades\Locale;

class NavigationMenuItemResource extends JsonResource
{
use ResourceWithData;

public function toArray(Request $request): array
{
$context = Application::get()->getRequest()->getContext();
$titleData = [];
if ($this->titleLocaleKey) {
foreach ($context->getSupportedLocales() as $locale) {
$titleData[$locale] = Locale::get($this->titleLocaleKey, [], $locale);
}
}

return [
'id' => $this->id,
'path' => $this->path,
'type' => $this->type,
'title' => $titleData
];
}

/**
* @inheritDoc
*/
protected static function requiredKeys(): array
{
return [];
}
}
45 changes: 45 additions & 0 deletions api/v1/navigations/resources/NavigationResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

/**
* @file api/v1/navigations/resources/NavigationResource.php
*
* Copyright (c) 2014-2025 Simon Fraser University
* Copyright (c) 2003-2025 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class NavigationResource
*
* @brief Transforms the API response of the navigation menu into the desired format
*
*/

namespace PKP\API\v1\navigations\resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use PKP\core\traits\ResourceWithData;

class NavigationResource extends JsonResource
{
use ResourceWithData;

public function toArray(Request $request): array
{

return [
'id' => $this->id,
'title' => $this->title,
'area_name' => $this->area_name,
'context_id' => $this->context_id,
'items' => NavigationMenuItemResource::collection($this->menuItems ?? collect(), $this->data ?? []),
];
}

/**
* @inheritDoc
*/
protected static function requiredKeys(): array
{
return [];
}
}
Loading