summaryrefslogtreecommitdiffstats
path: root/application/controllers/BranchController.php
diff options
context:
space:
mode:
Diffstat (limited to 'application/controllers/BranchController.php')
-rw-r--r--application/controllers/BranchController.php138
1 files changed, 138 insertions, 0 deletions
diff --git a/application/controllers/BranchController.php b/application/controllers/BranchController.php
new file mode 100644
index 0000000..3b36e83
--- /dev/null
+++ b/application/controllers/BranchController.php
@@ -0,0 +1,138 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\Diff\HtmlRenderer\SideBySideDiff;
+use gipfl\Diff\PhpDiff;
+use gipfl\IcingaWeb2\Widget\NameValueTable;
+use Icinga\Module\Director\Data\Db\DbObjectStore;
+use Icinga\Module\Director\Data\Db\DbObjectTypeRegistry;
+use Icinga\Module\Director\Db\Branch\BranchActivity;
+use Icinga\Module\Director\Db\Branch\BranchStore;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\SyncRule;
+use Icinga\Module\Director\PlainObjectRenderer;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+use Icinga\Module\Director\Web\Widget\IcingaConfigDiff;
+use ipl\Html\Html;
+
+class BranchController extends ActionController
+{
+ use BranchHelper;
+
+ public function init()
+ {
+ parent::init();
+ IcingaObject::setDbObjectStore(new DbObjectStore($this->db(), $this->getBranch()));
+ SyncRule::setDbObjectStore(new DbObjectStore($this->db(), $this->getBranch()));
+ }
+
+ protected function checkDirectorPermissions()
+ {
+ }
+
+ public function activityAction()
+ {
+ $this->assertPermission('director/showconfig');
+ $ts = $this->params->getRequired('ts');
+ $activity = BranchActivity::load($ts, $this->db());
+ $store = new BranchStore($this->db());
+ $branch = $store->fetchBranchByUuid($activity->getBranchUuid());
+ if ($branch->isSyncPreview()) {
+ $this->addSingleTab($this->translate('Sync Preview'));
+ $this->addTitle($this->translate('Expected Modification'));
+ } else {
+ $this->addSingleTab($this->translate('Activity'));
+ $this->addTitle($this->translate('Branch Activity'));
+ }
+
+ $this->content()->add($this->prepareActivityInfo($activity));
+ $this->showActivity($activity);
+ }
+
+ protected function prepareActivityInfo(BranchActivity $activity)
+ {
+ $table = new NameValueTable();
+ $table->addNameValuePairs([
+ $this->translate('Author') => $activity->getAuthor(),
+ $this->translate('Date') => date('Y-m-d H:i:s', $activity->getTimestamp()),
+ $this->translate('Action') => $activity->getAction()
+ . ' ' . preg_replace('/^icinga_/', '', $activity->getObjectTable())
+ . ' ' . $activity->getObjectName(),
+ // $this->translate('Actions') => ['Undo form'],
+ ]);
+ return $table;
+ }
+
+ protected function leftFromActivity(BranchActivity $activity)
+ {
+ if ($activity->isActionCreate()) {
+ return null;
+ }
+ $object = DbObjectTypeRegistry::newObject($activity->getObjectTable(), [], $this->db());
+ $properties = $this->objectTypeFirst($activity->getFormerProperties()->jsonSerialize());
+ foreach ($properties as $key => $value) {
+ $object->set($key, $value);
+ }
+
+ return $object;
+ }
+
+ protected function rightFromActivity(BranchActivity $activity)
+ {
+ if ($activity->isActionDelete()) {
+ return null;
+ }
+ $object = DbObjectTypeRegistry::newObject($activity->getObjectTable(), [], $this->db());
+ if (! $activity->isActionCreate()) {
+ foreach ($activity->getFormerProperties()->jsonSerialize() as $key => $value) {
+ $object->set($key, $value);
+ }
+ }
+ $properties = $this->objectTypeFirst($activity->getModifiedProperties()->jsonSerialize());
+ foreach ($properties as $key => $value) {
+ $object->set($key, $value);
+ }
+
+ return $object;
+ }
+
+ protected function objectTypeFirst($properties)
+ {
+ $properties = (array) $properties;
+ if (isset($properties['object_type'])) {
+ $type = $properties['object_type'];
+ unset($properties['object_type']);
+ $properties = ['object_type' => $type] + $properties;
+ }
+
+ return $properties;
+ }
+
+ protected function showActivity(BranchActivity $activity)
+ {
+ $left = $this->leftFromActivity($activity);
+ $right = $this->rightFromActivity($activity);
+ if ($left instanceof IcingaObject || $right instanceof IcingaObject) {
+ $this->content()->add(new IcingaConfigDiff(
+ $left ? $left->toSingleIcingaConfig() : $this->createEmptyConfig(),
+ $right ? $right->toSingleIcingaConfig() : $this->createEmptyConfig()
+ ));
+ } else {
+ $this->content()->add([
+ Html::tag('h3', $this->translate('Modification')),
+ new SideBySideDiff(new PhpDiff(
+ PlainObjectRenderer::render($left->getProperties()),
+ PlainObjectRenderer::render($right->getProperties())
+ ))
+ ]);
+ }
+ }
+
+ protected function createEmptyConfig()
+ {
+ return new IcingaConfig($this->db());
+ }
+}