Version 1
[yaffs-website] / vendor / drupal / console / src / Command / Database / DatabaseLogBase.php
diff --git a/vendor/drupal/console/src/Command/Database/DatabaseLogBase.php b/vendor/drupal/console/src/Command/Database/DatabaseLogBase.php
new file mode 100644 (file)
index 0000000..0feb209
--- /dev/null
@@ -0,0 +1,283 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Console\Command\Database\DatabaseLogBase.
+ */
+
+namespace Drupal\Console\Command\Database;
+
+use Drupal\Console\Core\Command\Shared\CommandTrait;
+use Drupal\Core\Database\Connection;
+use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\Core\StringTranslation\TranslationInterface;
+use Drupal\user\UserStorageInterface;
+use Symfony\Component\Console\Command\Command;
+use Drupal\Core\Logger\RfcLogLevel;
+use Drupal\user\Entity\User;
+use Drupal\Component\Utility\Unicode;
+use Drupal\Component\Utility\Html;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputInterface;
+use Drupal\Console\Core\Style\DrupalStyle;
+
+/**
+ * Class DatabaseLogBase
+ *
+ * @package Drupal\Console\Command\Database
+ */
+abstract class DatabaseLogBase extends Command
+{
+    use CommandTrait;
+
+    /**
+     * @var Connection
+     */
+    protected $database;
+
+    /**
+     * @var DateFormatterInterface
+     */
+    protected $dateFormatter;
+
+    /**
+     * @var EntityTypeManagerInterface
+     */
+    protected $entityTypeManager;
+
+    /**
+     * @var TranslationInterface
+     */
+    protected $stringTranslation;
+
+    /**
+     * @var UserStorageInterface
+     */
+    protected $userStorage;
+
+    /**
+     * @var TranslatableMarkup[]
+     */
+    protected $severityList;
+
+    /**
+     * @var null|string
+     */
+    protected $eventType;
+
+    /**
+     * @var null|string
+     */
+    protected $eventSeverity;
+
+    /**
+     * @var null|string
+     */
+    protected $userId;
+
+    /**
+     * LogDebugCommand constructor.
+     *
+     * @param Connection                 $database
+     * @param DateFormatterInterface     $dateFormatter
+     * @param EntityTypeManagerInterface $entityTypeManager
+     * @param TranslationInterface       $stringTranslation
+     */
+    public function __construct(
+        Connection $database,
+        DateFormatterInterface $dateFormatter,
+        EntityTypeManagerInterface $entityTypeManager,
+        TranslationInterface $stringTranslation
+    ) {
+        $this->database = $database;
+        $this->dateFormatter = $dateFormatter;
+        $this->entityTypeManager = $entityTypeManager;
+        $this->stringTranslation = $stringTranslation;
+        $this->userStorage = $this->entityTypeManager->getStorage('user');
+        $this->severityList = RfcLogLevel::getLevels();
+        parent::__construct();
+    }
+
+    /**
+     * addDefaultLoggingOptions.
+     */
+    protected function addDefaultLoggingOptions()
+    {
+        $this
+            ->addOption(
+                'type',
+                '',
+                InputOption::VALUE_OPTIONAL,
+                $this->trans('commands.database.log.common.options.type')
+            )
+            ->addOption(
+                'severity',
+                '',
+                InputOption::VALUE_OPTIONAL,
+                $this->trans('commands.database.log.common.options.severity')
+            )
+            ->addOption(
+                'user-id',
+                '',
+                InputOption::VALUE_OPTIONAL,
+                $this->trans('commands.database.log.common.options.user-id')
+            );
+    }
+
+    /**
+     * @param InputInterface $input
+     */
+    protected function getDefaultOptions(InputInterface $input)
+    {
+        $this->eventType = $input->getOption('type');
+        $this->eventSeverity = $input->getOption('severity');
+        $this->userId = $input->getOption('user-id');
+    }
+
+    /**
+     * @param DrupalStyle $io
+     * @param null        $offset
+     * @param int         $range
+     * @return bool|\Drupal\Core\Database\Query\SelectInterface
+     */
+    protected function makeQuery(DrupalStyle $io, $offset = null, $range = 1000)
+    {
+        $query = $this->database->select('watchdog', 'w');
+        $query->fields(
+            'w',
+            [
+                'wid',
+                'uid',
+                'severity',
+                'type',
+                'timestamp',
+                'message',
+                'variables',
+            ]
+        );
+
+        if ($this->eventType) {
+            $query->condition('type', $this->eventType);
+        }
+
+        if ($this->eventSeverity) {
+            if (!in_array($this->eventSeverity, $this->severityList)) {
+                $io->error(
+                    sprintf(
+                        $this->trans('database.log.common.messages.invalid-severity'),
+                        $this->eventSeverity
+                    )
+                );
+                return false;
+            }
+            $query->condition(
+                'severity',
+                array_search(
+                    $this->eventSeverity,
+                    $this->severityList
+                )
+            );
+        }
+
+        if ($this->userId) {
+            $query->condition('uid', $this->userId);
+        }
+
+        $query->orderBy('wid', 'ASC');
+
+        if ($offset) {
+            $query->range($offset, $range);
+        }
+
+        return $query;
+    }
+
+    /**
+     * Generic logging table header
+     *
+     * @return array
+     */
+    protected function createTableHeader()
+    {
+        return [
+        $this->trans('commands.database.log.common.messages.event-id'),
+        $this->trans('commands.database.log.common.messages.type'),
+        $this->trans('commands.database.log.common.messages.date'),
+        $this->trans('commands.database.log.common.messages.message'),
+        $this->trans('commands.database.log.common.messages.user'),
+        $this->trans('commands.database.log.common.messages.severity'),
+        ];
+    }
+
+    /**
+     * @param \stdClass $dblog
+     * @return array
+     */
+    protected function createTableRow(\stdClass $dblog)
+    {
+
+        /**
+         * @var User $user
+         */
+        $user = $this->userStorage->load($dblog->uid);
+
+        return [
+            $dblog->wid,
+            $dblog->type,
+            $this->dateFormatter->format($dblog->timestamp, 'short'),
+            Unicode::truncate(
+                Html::decodeEntities(strip_tags($this->formatMessage($dblog))),
+                500,
+                true,
+                true
+            ),
+            $user->getUsername() . ' (' . $user->id() . ')',
+            $this->severityList[$dblog->severity]->render(),
+        ];
+    }
+
+    /**
+     * Formats a database log message.
+     *
+     * @param $event
+     *   The record from the watchdog table. The object properties are: wid, uid,
+     *   severity, type, timestamp, message, variables, link, name.
+     *
+     * @return string|false
+     *   The formatted log message or FALSE if the message or variables properties
+     *   are not set.
+     */
+    protected function formatMessage(\stdClass $event)
+    {
+        $message = false;
+
+        // Check for required properties.
+        if (isset($event->message, $event->variables)) {
+            // Messages without variables or user specified text.
+            if ($event->variables === 'N;') {
+                return $event->message;
+            }
+
+            return $this->stringTranslation->translate(
+                $event->message,
+                unserialize($event->variables)
+            );
+        }
+
+        return $message;
+    }
+
+    /**
+     * @param $dblog
+     * @return array
+     */
+    protected function formatSingle($dblog)
+    {
+        return array_combine(
+            $this->createTableHeader(),
+            $this->createTableRow($dblog)
+        );
+    }
+}