Completed
Pull Request — master (#4264)
by Craig
05:17 queued 14s
created

MenuBuilder   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 144
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 98
c 1
b 0
f 0
dl 0
loc 144
rs 10
wmc 17

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A getCsrfToken() 0 3 1
D createAdminMenu() 0 112 15
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Zikula package.
7
 *
8
 * Copyright Zikula - https://ziku.la/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Zikula\ExtensionsModule\Menu;
15
16
use Knp\Menu\FactoryInterface;
17
use Knp\Menu\ItemInterface;
18
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
19
use Zikula\Bundle\CoreBundle\Composer\MetaData;
20
use Zikula\Bundle\CoreBundle\HttpKernel\ZikulaKernel;
21
use Zikula\ExtensionsModule\Constant;
22
use Zikula\PermissionsModule\Api\ApiInterface\PermissionApiInterface;
23
24
class MenuBuilder
25
{
26
    /**
27
     * @var FactoryInterface
28
     */
29
    private $factory;
30
31
    /**
32
     * @var PermissionApiInterface
33
     */
34
    private $permissionApi;
35
36
    /**
37
     * @var CsrfTokenManagerInterface
38
     */
39
    private $csrfTokenManager;
40
41
    public function __construct(
42
        FactoryInterface $factory,
43
        PermissionApiInterface $permissionApi,
44
        CsrfTokenManagerInterface $csrfTokenManager
45
    ) {
46
        $this->factory = $factory;
47
        $this->permissionApi = $permissionApi;
48
        $this->csrfTokenManager = $csrfTokenManager;
49
    }
50
51
    public function createAdminMenu(array $options): ItemInterface
52
    {
53
        /** @var \Zikula\ExtensionsModule\Entity\ExtensionEntity $extension */
54
        $extension = $options['extension'];
55
        $menu = $this->factory->createItem('adminActions');
56
        $menu->setChildrenAttribute('class', 'list-inline');
57
58
        if (!$this->permissionApi->hasPermission('ZikulaExtensionsModule::', $extension->getName() . '::' . $extension->getId(), ACCESS_ADMIN)) {
59
            return $menu;
60
        }
61
62
        $id = $extension->getId();
63
64
        switch ($extension->getState()) {
65
            case Constant::STATE_ACTIVE:
66
                if (!ZikulaKernel::isCoreExtension($extension->getName())) {
67
                    $csrfToken = $this->getCsrfToken('deactivate-extension');
68
                    $menu->addChild('Deactivate extension', [
69
                        'route' => 'zikulaextensionsmodule_extension_deactivate',
70
                        'routeParameters' => [
71
                            'id' => $id,
72
                            'token' => $csrfToken
73
                        ]
74
                    ])->setAttribute('icon', 'fas fa-minus-circle text-danger');
75
                }
76
                break;
77
            case Constant::STATE_INACTIVE:
78
                $csrfToken = $this->getCsrfToken('activate-extension');
79
                $menu->addChild('Activate extension', [
80
                    'route' => 'zikulaextensionsmodule_extension_activate',
81
                    'routeParameters' => ['id' => $id, 'token' => $csrfToken]
82
                ])->setAttribute('icon', 'fas fa-plus-square')
83
                    ->setLinkAttribute('class', 'text-success');
84
                $csrfToken = $this->getCsrfToken('uninstall-extension');
85
                $menu->addChild('Uninstall extension', [
86
                    'route' => 'zikulaextensionsmodule_extension_uninstall',
87
                    'routeParameters' => ['id' => $id, 'token' => $csrfToken]
88
                ])->setAttribute('icon', 'fas fa-trash-alt text-danger');
89
                break;
90
            case Constant::STATE_MISSING:
91
                // Nothing to do.
92
                // do not allow deletion of missing modules if previously installed (#1278)
93
                break;
94
            case Constant::STATE_UPGRADED:
95
                $csrfToken = $this->getCsrfToken('upgrade-extension');
96
                $menu->addChild('Upgrade extension', [
97
                    'route' => 'zikulaextensionsmodule_extension_upgrade',
98
                    'routeParameters' => ['id' => $id, 'token' => $csrfToken]
99
                ])->setAttribute('icon', 'fas fa-sync text-primary');
100
                break;
101
            case Constant::STATE_INVALID:
102
                // nothing to do.
103
                // do not allow deletion of invalid modules if previously installed (#1278)
104
                break;
105
            case Constant::STATE_NOTALLOWED:
106
                $csrfToken = $this->getCsrfToken('uninstall-extension');
107
                $menu->addChild('Remove extension', [
108
                    'route' => 'zikulaextensionsmodule_extension_uninstall',
109
                    'routeParameters' => ['id' => $id, 'token' => $csrfToken]
110
                ])->setAttribute('icon', 'fas fa-trash-alt text-danger');
111
                break;
112
            case Constant::STATE_TRANSITIONAL:
113
                $menu->addChild('Install extension', [
114
                    'route' => 'zikulaextensionsmodule_extensioninstaller_preinstall',
115
                    'routeParameters' => [
116
                        'id' => $id
117
                    ]
118
                ])->setAttribute('icon', 'text success fas fa-cog')
119
                    ->setLinkAttribute('class', 'text-success');
120
            case Constant::STATE_UNINITIALISED:
121
            default:
122
                if ($extension->getState() < 10) {
123
                    $menu->addChild('Install extension', [
124
                        'route' => 'zikulaextensionsmodule_extensioninstaller_preinstall',
125
                        'routeParameters' => [
126
                            'id' => $id
127
                        ]
128
                    ])->setAttribute('icon', 'fas fa-cog')
129
                        ->setLinkAttribute('class', 'text-success');
130
                } else {
131
                    $menu->addChild('Core compatibility information', [
132
                        'route' => 'zikulaextensionsmodule_extension_compatibility',
133
                        'routeParameters' => ['id' => $id]
134
                    ])->setAttribute('icon', 'fas fa-info-circle text-info');
135
                }
136
                break;
137
        }
138
139
        if (in_array($extension->getState(), [
140
            Constant::STATE_ACTIVE,
141
            Constant::STATE_INACTIVE,
142
        ], true)) {
143
            $menu->addChild('Edit extension', [
144
                'route' => 'zikulaextensionsmodule_extension_modify',
145
                'routeParameters' => ['id' => $id]
146
            ])->setAttribute('icon', 'fas fa-wrench text-dark');
147
        }
148
149
        if (Constant::STATE_ACTIVE === $extension->getState()
150
            && (in_array($extension->getType(), [MetaData::TYPE_THEME, MetaData::TYPE_SYSTEM_THEME]))) {
151
            $menu->addChild('Edit theme vars', [
152
                'route' => 'zikulathememodule_var_var',
153
                'routeParameters' => ['themeName' => $extension->getName()]
154
            ])->setAttribute('icon', 'fas fa-pencil-alt');
155
            $menu->addChild('Preview theme', [
156
                'route' => 'zikulaextensionsmodule_extension_preview',
157
                'routeParameters' => ['themeName' => $extension->getName()]
158
            ])->setAttribute('icon', 'far fa-eye')
159
            ->setLinkAttribute('target', '_blank');
160
        }
161
162
        return $menu;
163
    }
164
165
    private function getCsrfToken(string $tokenId): string
166
    {
167
        return $this->csrfTokenManager->getToken($tokenId)->getValue();
168
    }
169
}
170