181 lines
6.4 KiB
PHP
181 lines
6.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file classes/observers/events/UsageEvent.php
|
|
*
|
|
* Copyright (c) 2022 Simon Fraser University
|
|
* Copyright (c) 2022 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class UsageEvent
|
|
*
|
|
* @ingroup observers_events
|
|
*
|
|
* @brief Base class for the usage event used to record usage logs.
|
|
*/
|
|
|
|
namespace PKP\observers\events;
|
|
|
|
use APP\core\Application;
|
|
use APP\core\PageRouter;
|
|
use APP\core\Request;
|
|
use APP\submission\Submission;
|
|
use Exception;
|
|
use Illuminate\Foundation\Events\Dispatchable;
|
|
use PKP\config\Config;
|
|
use PKP\context\Context;
|
|
use PKP\core\Core;
|
|
use PKP\core\Registry;
|
|
use PKP\submission\Representation;
|
|
use PKP\submissionFile\SubmissionFile;
|
|
|
|
abstract class UsageEvent
|
|
{
|
|
use Dispatchable;
|
|
|
|
/** Current time */
|
|
public string $time;
|
|
|
|
/** Viewed/downloaded object, one of the Application::ASSOC_TYPE_... constants */
|
|
public int $assocType;
|
|
|
|
/** Canonical URL for the pub object */
|
|
public string $canonicalUrl;
|
|
|
|
public Request $request;
|
|
|
|
public Context $context;
|
|
|
|
public ?Submission $submission;
|
|
|
|
/** Representation (galley or publication format) */
|
|
public ?Representation $representation;
|
|
|
|
public ?SubmissionFile $submissionFile;
|
|
|
|
/** Application's complete version string */
|
|
public string $version;
|
|
|
|
/**
|
|
* Create a new usage event instance.
|
|
*/
|
|
public function __construct(
|
|
int $assocType,
|
|
Context $context,
|
|
Submission $submission = null,
|
|
Representation $representation = null,
|
|
SubmissionFile $submissionFile = null
|
|
) {
|
|
$this->time = Core::getCurrentDate();
|
|
$this->assocType = $assocType;
|
|
$this->context = $context;
|
|
$this->submission = $submission;
|
|
$this->representation = $representation;
|
|
$this->submissionFile = $submissionFile;
|
|
$this->version = Registry::get('appVersion');
|
|
$this->request = Application::get()->getRequest();
|
|
$this->canonicalUrl = $this->getCanonicalUrl();
|
|
}
|
|
|
|
/**
|
|
* Get the canonical URL for the usage object
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
protected function getCanonicalUrl(): string
|
|
{
|
|
$canonicalUrlPage = $canonicalUrlOp = null;
|
|
$canonicalUrlParams = [];
|
|
|
|
switch ($this->assocType) {
|
|
case Application::ASSOC_TYPE_SUBMISSION_FILE_COUNTER_OTHER:
|
|
case Application::ASSOC_TYPE_SUBMISSION_FILE:
|
|
$canonicalUrlOp = 'download';
|
|
$canonicalUrlParams = [$this->submission->getId()];
|
|
$router = $this->request->getRouter(); /** @var PageRouter $router */
|
|
$op = $router->getRequestedOp($this->request);
|
|
$args = $router->getRequestedArgs($this->request);
|
|
if ($op == 'download' && count($args) > 1) {
|
|
if ($args[1] == 'version' && count($args) == 5) {
|
|
$publicationId = (int) $args[2];
|
|
$canonicalUrlParams[] = 'version';
|
|
$canonicalUrlParams[] = $publicationId;
|
|
}
|
|
}
|
|
$canonicalUrlParams[] = $this->representation->getId();
|
|
$canonicalUrlParams[] = $this->submissionFile->getId();
|
|
break;
|
|
case Application::ASSOC_TYPE_SUBMISSION:
|
|
$canonicalUrlOp = 'view';
|
|
if (Application::get()->getName() == 'omp') {
|
|
$canonicalUrlOp = 'book';
|
|
}
|
|
$canonicalUrlParams = [$this->submission->getId()];
|
|
$router = $this->request->getRouter(); /** @var PageRouter $router */
|
|
$op = $router->getRequestedOp($this->request);
|
|
$args = $router->getRequestedArgs($this->request);
|
|
if ($op == $canonicalUrlOp && count($args) > 1) {
|
|
if ($args[1] == 'version' && count($args) == 3) {
|
|
$publicationId = (int) $args[2];
|
|
$canonicalUrlParams[] = 'version';
|
|
$canonicalUrlParams[] = $publicationId;
|
|
}
|
|
}
|
|
break;
|
|
case Application::getContextAssocType():
|
|
$canonicalUrlOp = '';
|
|
$canonicalUrlPage = 'index';
|
|
break;
|
|
default:
|
|
throw new Exception('Not recognized assoc type that we can create the canonical URL for.');
|
|
}
|
|
$canonicalUrl = $this->getRouterCanonicalUrl($this->request, $canonicalUrlPage, $canonicalUrlOp, $canonicalUrlParams);
|
|
return $canonicalUrl;
|
|
}
|
|
|
|
/**
|
|
* Construct the URL from page, op, and params
|
|
*/
|
|
protected function getRouterCanonicalUrl(Request $request, string $canonicalUrlPage = null, string $canonicalUrlOp = null, array $canonicalUrlParams = null): string
|
|
{
|
|
$router = $request->getRouter(); /** @var PageRouter $router */
|
|
$context = $router->getContext($request);
|
|
|
|
if (!isset($canonicalUrlPage)) {
|
|
$canonicalUrlPage = $router->getRequestedPage($request);
|
|
}
|
|
if (!isset($canonicalUrlOp)) {
|
|
$canonicalUrlOp = $router->getRequestedOp($request);
|
|
}
|
|
if (!isset($canonicalUrlParams)) {
|
|
$canonicalUrlParams = $router->getRequestedArgs($request);
|
|
}
|
|
|
|
$canonicalUrl = $router->url(
|
|
$request,
|
|
null,
|
|
$canonicalUrlPage,
|
|
$canonicalUrlOp,
|
|
$canonicalUrlParams
|
|
);
|
|
|
|
// Make sure we log the server name and not aliases.
|
|
$configBaseUrl = Config::getVar('general', 'base_url');
|
|
$requestBaseUrl = $request->getBaseUrl();
|
|
if ($requestBaseUrl !== $configBaseUrl) {
|
|
// Make sure it's not an url override (no alias on that case).
|
|
if (!in_array($requestBaseUrl, Config::getContextBaseUrls()) &&
|
|
$requestBaseUrl !== Config::getVar('general', 'base_url[index]')) {
|
|
// Alias found, replace it by base_url from config file.
|
|
// Make sure we use the correct base url override value for the context, if any.
|
|
$baseUrlReplacement = Config::getVar('general', 'base_url[' . $context->getPath() . ']');
|
|
if (!$baseUrlReplacement) {
|
|
$baseUrlReplacement = $configBaseUrl;
|
|
}
|
|
$canonicalUrl = str_replace($requestBaseUrl, $baseUrlReplacement, $canonicalUrl);
|
|
}
|
|
}
|
|
return $canonicalUrl;
|
|
}
|
|
}
|