<?php
namespace App\Services;
use App\Utils\SecurityUtils;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Security;
use Throwable;
class ActionLoggerService
{
const TYPE_ALERT = "ALERT";
const TYPE_UPDATE = "UPDATE";
const TYPE_TEAM = "TEAM";
const TYPE_EMAIL = "EMAIL";
const CREATE_EVENT_APPLICATION = "CREATE_EVENT_APPLICATION";
/**
* @var TokenStorageInterface $tokenStorageInterface
*/
protected $tokenStorageInterface;
/**
* @var LoggerInterface $logger
*/
protected $logger;
/**
* @var Security $security
*/
protected $security;
public function __construct(
TokenStorageInterface $tokenStorageInterface,
Security $security,
LoggerInterface $logger
)
{
$this->tokenStorageInterface = $tokenStorageInterface;
$this->logger = $logger;
$this->security = $security;
}
public function logException(Throwable $exception, string $message)
{
$this->getLogger()->error($message . ' : ' . $exception->getMessage(),
['exception' => $exception]);
}
/**
* @return LoggerInterface
*/
public function getLogger(): LoggerInterface
{
return $this->logger;
}
/**
* To be used by unit test only...
*
* @param LoggerInterface $logger
*/
public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
}
/**
* @param $action string the action done
* @param $type
* @param $objectId
* @param $message
* @param $targetObject
*/
public function logActionInfo(
string $action,
string $type,
string $objectId = null,
string $targetObject = null,
string $message = null
)
{
$this->logger->info("ACTION", [
'user_uid' => SecurityUtils::getUid($this->tokenStorageInterface),
'action' => $action,
'type' => $type,
'objectId' => $objectId,
'target' => $targetObject,
'message' => $message,
]);
}
public function logUserRoles(array $roles, string $urlFrom = null)
{
$asJson = SecurityUtils::getAuthorizationAsJson($roles, $this->security);
$this->logAction('LOG_USER_ROLES', 'USER_ROLES', $urlFrom, null, $asJson);
}
/**
* @param $action string the action done
* @param string $type
* @param string $objectId
* @param string $targetObject
* @param string $message
* @param string|null $parentId
* @param array $message
*/
public function logAction(
string $action,
string $type,
string $objectId = null,
string $targetObject = null,
string $message = null,
string $parentId = null,
array $object = null
)
{
$this->logger->info("ACTION", [
'user_uid' => SecurityUtils::getUid($this->tokenStorageInterface),
'action' => $action,
'type' => $type,
'objectId' => $objectId,
'parentId' => $parentId,
'target' => $targetObject,
'message' => $message,
'object' => $object,
]);
}
/**
* @param string $type
* @param string $objectId
* @param string $targetObject
* @param string $message
* @param string|null $parentId
* @param array $message
*/
public function logActionV2(
string $prefix,
string $type,
string $objectId = null,
string $url = null,
string $message = null,
string $parentId = null,
array $object = null
)
{
$action = $this->buildAction($prefix, $url);
$this->logAction($action, $type, $objectId, $url,
$message, $parentId, $object);
}
/**
* @param string $type
* @param string $objectId
* @param string $targetObject
* @param string $message
* @param string|null $parentId
* @param array $message
*/
public function logActionErrorV2(
string $prefix,
string $type,
string $objectId = null,
string $url = null,
string $message = null,
string $parentId = null,
array $object = null
)
{
$action = $this->buildAction($prefix, $url);
$this->logActionError($action, $type, $objectId, $url,
$message, $parentId, $object);
}
/**
* @param string $type
* @param string $objectId
* @param string $targetObject
* @param string $message
* @param string|null $parentId
* @param array $message
*/
public function logActionWarnV2(
string $prefix,
string $type,
string $objectId = null,
string $url = null,
string $message = null,
string $parentId = null,
array $object = null
)
{
$action = $this->buildAction($prefix, $url);
$this->logActionWarn($action, $type, $objectId, $url,
$message, $parentId, $object);
}
private function buildAction(String $prefix, String $url){
$action = $prefix;
$fragments = parse_url($url);
foreach ($fragments as $fragment) {
if (!is_numeric($fragment)) {
$action = $action . strtoupper($fragment);
}
if (next($fragments) == true) {
$action = $action . "_";
}
}
return $action;
}
/**
* @param $action string the action done
* @param string $type
* @param string $objectId
* @param string $targetObject
* @param string $message
* @param string|null $parentId
*/
public function logActionError(
string $action,
string $type,
string $objectId = null,
string $targetObject = null,
string $message = null,
string $parentId = null
)
{
$this->logger->error("ACTION", [
'user_uid' => SecurityUtils::getUid($this->tokenStorageInterface),
'action' => $action,
'type' => $type,
'objectId' => $objectId,
'parentId' => $parentId,
'target' => $targetObject,
'message' => $message,
]);
}
/**
* @param $action string the action done
* @param string $type
* @param string $objectId
* @param string $targetObject
* @param string $message
* @param string|null $parentId
*/
public function logActionWarn(
string $action,
string $type,
string $objectId = null,
string $targetObject = null,
string $message = null,
string $parentId = null
)
{
$this->logger->warning("ACTION", [
'user_uid' => SecurityUtils::getUid($this->tokenStorageInterface),
'action' => $action,
'type' => $type,
'objectId' => $objectId,
'parentId' => $parentId,
'target' => $targetObject,
'message' => $message,
]);
}
}