Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
n/a
0 / 0
n/a
0 / 0
CRAP
n/a
0 / 0
BackendController
n/a
0 / 0
n/a
0 / 0
57
n/a
0 / 0
 viewForgot
n/a
0 / 0
n/a
0 / 0
1
 viewEmptyCommand
n/a
0 / 0
n/a
0 / 0
1
 viewAccountList
n/a
0 / 0
n/a
0 / 0
7
 viewAccountSettings
n/a
0 / 0
n/a
0 / 0
8
 viewAccountCreate
n/a
0 / 0
n/a
0 / 0
1
 viewGroupList
n/a
0 / 0
n/a
0 / 0
7
 viewGroupSettings
n/a
0 / 0
n/a
0 / 0
3
 viewGroupCreate
n/a
0 / 0
n/a
0 / 0
1
 viewModuleList
n/a
0 / 0
n/a
0 / 0
2
 viewModuleInfo
n/a
0 / 0
n/a
0 / 0
6
 viewModuleLog
n/a
0 / 0
n/a
0 / 0
3
 viewModuleRouteList
n/a
0 / 0
n/a
0 / 0
6
 viewModuleHookList
n/a
0 / 0
n/a
0 / 0
6
 viewModuleSettings
n/a
0 / 0
n/a
0 / 0
5
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   Modules\Admin
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15namespace Modules\Admin\Controller;
16
17use Model\SettingMapper;
18use Modules\Admin\Models\AccountMapper;
19use Modules\Admin\Models\AccountPermissionMapper;
20use Modules\Admin\Models\AppMapper;
21use Modules\Admin\Models\GroupMapper;
22use Modules\Admin\Models\GroupPermissionMapper;
23use Modules\Admin\Models\LocalizationMapper;
24use Modules\Admin\Models\ModuleMapper;
25use Modules\Admin\Models\SettingsEnum;
26use Modules\Auditor\Models\AuditMapper;
27use Modules\Media\Models\MediaMapper;
28use Modules\Organization\Models\UnitMapper;
29use phpOMS\Asset\AssetType;
30use phpOMS\Autoloader;
31use phpOMS\Contract\RenderableInterface;
32use phpOMS\DataStorage\Database\Query\OrderType;
33use phpOMS\Message\RequestAbstract;
34use phpOMS\Message\ResponseAbstract;
35use phpOMS\Utils\Parser\Markdown\Markdown;
36use phpOMS\Utils\StringUtils;
37use phpOMS\Views\View;
38use Web\Backend\Views\TableView;
39
40/**
41 * Admin controller class.
42 *
43 * This class is responsible for the basic admin activities such as managing accounts, groups, permissions and modules.
44 *
45 * @package Modules\Admin
46 * @license OMS License 2.0
47 * @link    https://jingga.app
48 * @since   1.0.0
49 * @codeCoverageIgnore
50 */
51final class BackendController extends Controller
52{
53    /**
54     * Method which shows the password forgotten
55     *
56     * @param RequestAbstract  $request  Request
57     * @param ResponseAbstract $response Response
58     * @param array            $data     Generic data
59     *
60     * @return RenderableInterface Response can be rendered
61     *
62     * @since 1.0.0
63     */
64    public function viewForgot(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
65    {
66        return new View();
67    }
68
69    /**
70     * Method which generates the general settings view.
71     *
72     * In this view general settings for the entire application can be seen and adjusted. Settings which can be modified
73     * here are localization, password, database, etc.
74     *
75     * @param RequestAbstract  $request  Request
76     * @param ResponseAbstract $response Response
77     * @param array            $data     Generic data
78     *
79     * @return RenderableInterface Response can be rendered
80     *
81     * @since 1.0.0
82     */
83    public function viewEmptyCommand(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
84    {
85        $view = new View($this->app->l11nManager, $request, $response);
86        $view->setTemplate('/Modules/Admin/Theme/Cli/empty-command');
87
88        return $view;
89    }
90
91    /**
92     * Method which generates the account list view.
93     *
94     * @param RequestAbstract  $request  Request
95     * @param ResponseAbstract $response Response
96     * @param array            $data     Generic data
97     *
98     * @return RenderableInterface Response can be rendered
99     *
100     * @since 1.0.0
101     */
102    public function viewAccountList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
103    {
104        $view = new View($this->app->l11nManager, $request, $response);
105        $view->setTemplate('/Modules/Admin/Theme/Backend/accounts-list');
106        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response);
107
108        $searchFieldData = $request->getLike('.*\-p\-.*');
109        $searchField     = [];
110        foreach ($searchFieldData as $key => $data) {
111            if ($data === '1') {
112                $split  = \explode('-', $key);
113                $member =  \end($split);
114
115                $searchField[] = $member;
116            }
117        }
118
119        $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
120        $filterField     = [];
121        foreach ($filterFieldData as $key => $type) {
122            $split = \explode('-', $key);
123            \end($split);
124
125            $member = \prev($split);
126
127            if ($request->hasData('accountslist-f-' . $member . '-f1')) {
128                $filterField[$member] = [
129                    'type'   => $type,
130                    'value1' => $request->getData('accountslist-f-' . $member . '-f1'),
131                    'logic1' => $request->getData('accountslist-f-' . $member . '-o1'),
132                    'value2' => $request->getData('accountslist-f-' . $member . '-f2'),
133                    'logic2' => $request->getData('accountslist-f-' . $member . '-o2'),
134                ];
135            }
136        }
137
138        $pageLimit               = 25;
139        $view->data['pageLimit'] = $pageLimit;
140
141        $mapper = AccountMapper::getAll()->with('createdBy');
142        $list   = AccountMapper::find(
143            search: $request->getDataString('search'),
144            mapper: $mapper,
145            id: $request->getDataInt('id') ?? 0,
146            secondaryId: $request->getDataString('subid') ?? '',
147            type: $request->getDataString('pType'),
148            pageLimit: empty($request->getDataInt('limit') ?? 0) ? 100 : ((int) $request->getData('limit')),
149            sortBy: $request->getDataString('sort_by') ?? '',
150            sortOrder: $request->getDataString('sort_order') ?? OrderType::DESC,
151            searchFields: $searchField,
152            filters: $filterField
153        );
154
155        $view->data['accounts'] = $list['data'];
156
157        /** @var \Model\Setting[] $exportTemplates */
158        $exportTemplates = $this->app->appSettings->get(
159            names: [
160                SettingsEnum::DEFAULT_LIST_EXPORTS,
161            ],
162            module: 'Admin'
163        );
164
165        $templateIds = [];
166        foreach ($exportTemplates as $template) {
167            $templateIds[] = (int) $template->content;
168        }
169
170        /** @var \Modules\Media\Models\Media[] $mediaTemplates */
171        $mediaTemplates = MediaMapper::getAll()
172            ->where('id', $templateIds, 'in')
173            ->execute();
174
175        $tableView         = new TableView($this->app->l11nManager, $request, $response);
176        $tableView->module = 'Admin';
177        $tableView->theme  = 'Backend';
178        $tableView->setTitleTemplate('/Web/Backend/Themes/table-title');
179        $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data');
180        $tableView->setExportTemplates($mediaTemplates);
181        $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table');
182        $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table');
183        $tableView->setSortTemplate('/Web/Backend/Themes/sort-table');
184        $tableView->setData('hasPrevious', $list['hasPrevious']);
185        $tableView->setData('hasNext', $list['hasNext']);
186
187        $view->data['tableView'] = $tableView;
188
189        return $view;
190    }
191
192    /**
193     * Method which generates the account view of a single account.
194     *
195     * @param RequestAbstract  $request  Request
196     * @param ResponseAbstract $response Response
197     * @param array            $data     Generic data
198     *
199     * @return RenderableInterface Response can be rendered
200     *
201     * @since 1.0.0
202     */
203    public function viewAccountSettings(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
204    {
205        $view = new View($this->app->l11nManager, $request, $response);
206        $view->setTemplate('/Modules/Admin/Theme/Backend/accounts-single');
207        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response);
208
209        /** @var \Modules\Admin\Models\Account $account */
210        $account = AccountMapper::get()->with('groups')->with('l11n')->where('id', (int) $request->getData('id'))->execute();
211        if ($account->l11n->id === 0) {
212            $account->l11n->loadFromLanguage($request->header->l11n->language);
213        }
214
215        $view->data['account'] = $account;
216
217        /** @var \Modules\Admin\Models\AccountPermission[] $permissions */
218        $permissions = AccountPermissionMapper::getAll()
219            ->where('account', (int) $request->getData('id'))
220            ->execute();
221
222        $view->data['permissions'] = $permissions;
223
224        $view->data['units']   = UnitMapper::getAll()->execute();
225        $view->data['apps']    = AppMapper::getAll()->execute();
226        $view->data['modules'] = ModuleMapper::getAll()->execute();
227
228        $accGrpSelector            = new \Modules\Admin\Theme\Backend\Components\GroupTagSelector\GroupTagSelectorView($this->app->l11nManager, $request, $response);
229        $view->data['grpSelector'] = $accGrpSelector;
230
231        // Auditor log
232        $searchFieldData = $request->getLike('.*\-p\-.*');
233        $searchField     = [];
234        foreach ($searchFieldData as $key => $data) {
235            if ($data === '1') {
236                $split  = \explode('-', $key);
237                $member =  \end($split);
238
239                $searchField[] = $member;
240            }
241        }
242
243        $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
244        $filterField     = [];
245        foreach ($filterFieldData as $key => $type) {
246            $split = \explode('-', $key);
247            \end($split);
248
249            $member = \prev($split);
250
251            if ($request->hasData('auditlist-f-' . $member . '-f1')) {
252                $filterField[$member] = [
253                    'type'   => $type,
254                    'value1' => $request->getData('auditlist-f-' . $member . '-f1'),
255                    'logic1' => $request->getData('auditlist-f-' . $member . '-o1'),
256                    'value2' => $request->getData('auditlist-f-' . $member . '-f2'),
257                    'logic2' => $request->getData('auditlist-f-' . $member . '-o2'),
258                ];
259            }
260        }
261
262        $pageLimit               = 25;
263        $view->data['pageLimit'] = $pageLimit;
264
265        $mapper = AuditMapper::getAll()->with('createdBy');
266
267        /** @var \Modules\Auditor\Models\Audit[] $list */
268        $list = AuditMapper::find(
269            search: $request->getDataString('search'),
270            mapper: $mapper,
271            id: $request->getDataInt('id') ?? 0,
272            secondaryId: $request->getDataString('subid') ?? '',
273            type: $request->getDataString('pType'),
274            pageLimit: empty($request->getDataInt('limit') ?? 0) ? 100 : $request->getDataInt('limit'),
275            sortBy: $request->getDataString('sort_by') ?? '',
276            sortOrder: $request->getDataString('sort_order') ?? OrderType::DESC,
277            searchFields: $searchField,
278            filters: $filterField
279        );
280
281        $view->data['audits'] = $list['data'];
282
283        /** @var \Model\Setting[] $exportTemplates */
284        $exportTemplates = $this->app->appSettings->get(
285            names: [SettingsEnum::DEFAULT_LIST_EXPORTS],
286            module: 'Admin'
287        );
288
289        $templateIds = [];
290        foreach ($exportTemplates as $template) {
291            $templateIds[] = (int) $template->content;
292        }
293
294        /** @var \Modules\Media\Models\Media[] $mediaTemplates */
295        $mediaTemplates = MediaMapper::getAll()
296            ->where('id', $templateIds, 'in')
297            ->execute();
298
299        $tableView         = new TableView($this->app->l11nManager, $request, $response);
300        $tableView->module = 'Auditor';
301        $tableView->theme  = 'Backend';
302        $tableView->setTitleTemplate('/Web/Backend/Themes/table-title');
303        $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data');
304        $tableView->setExportTemplates($mediaTemplates);
305        $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table');
306        $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table');
307        $tableView->setSortTemplate('/Web/Backend/Themes/sort-table');
308        $tableView->setData('hasPrevious', $list['hasPrevious']);
309        $tableView->setData('hasNext', $list['hasNext']);
310
311        $view->data['tableView'] = $tableView;
312
313        return $view;
314    }
315
316    /**
317     * Method which generates the create account view.
318     *
319     * @param RequestAbstract  $request  Request
320     * @param ResponseAbstract $response Response
321     * @param array            $data     Generic data
322     *
323     * @return RenderableInterface Response can be rendered
324     *
325     * @since 1.0.0
326     */
327    public function viewAccountCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
328    {
329        $view = new View($this->app->l11nManager, $request, $response);
330        $view->setTemplate('/Modules/Admin/Theme/Backend/accounts-create');
331        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response);
332
333        return $view;
334    }
335
336    /**
337     * Method which generates the group list view.
338     *
339     * @param RequestAbstract  $request  Request
340     * @param ResponseAbstract $response Response
341     * @param array            $data     Generic data
342     *
343     * @return RenderableInterface Response can be rendered
344     *
345     * @since 1.0.0
346     */
347    public function viewGroupList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
348    {
349        $view = new View($this->app->l11nManager, $request, $response);
350        $view->setTemplate('/Modules/Admin/Theme/Backend/groups-list');
351        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000103001, $request, $response);
352
353        $searchFieldData = $request->getLike('.*\-p\-.*');
354        $searchField     = [];
355        foreach ($searchFieldData as $key => $data) {
356            if ($data === '1') {
357                $split  = \explode('-', $key);
358                $member =  \end($split);
359
360                $searchField[] = $member;
361            }
362        }
363
364        $filterFieldData = $request->getLike('.*\-f\-.*?\-t');
365        $filterField     = [];
366        foreach ($filterFieldData as $key => $type) {
367            $split = \explode('-', $key);
368            \end($split);
369
370            $member = \prev($split);
371
372            if ($request->hasData('groupslist-f-' . $member . '-f1')) {
373                $filterField[$member] = [
374                    'type'   => $type,
375                    'value1' => $request->getData('groupslist-f-' . $member . '-f1'),
376                    'logic1' => $request->getData('groupslist-f-' . $member . '-o1'),
377                    'value2' => $request->getData('groupslist-f-' . $member . '-f2'),
378                    'logic2' => $request->getData('groupslist-f-' . $member . '-o2'),
379                ];
380            }
381        }
382
383        $pageLimit               = 25;
384        $view->data['pageLimit'] = $pageLimit;
385
386        $mapper = GroupMapper::getAll()->with('createdBy');
387        $list   = GroupMapper::find(
388            search: $request->getDataString('search'),
389            mapper: $mapper,
390            id: $request->getDataInt('id') ?? 0,
391            secondaryId: $request->getDataString('subid') ?? '',
392            type: $request->getDataString('pType'),
393            pageLimit: empty($request->getDataInt('limit') ?? 0) ? 100 : ((int) $request->getData('limit')),
394            sortBy: $request->getDataString('sort_by') ?? '',
395            sortOrder: $request->getDataString('sort_order') ?? OrderType::DESC,
396            searchFields: $searchField,
397            filters: $filterField
398        );
399
400        $view->data['groups'] = $list['data'];
401
402        $memberCount               = GroupMapper::countMembers();
403        $view->data['memberCount'] = $memberCount;
404
405        /** @var \Model\Setting[] $exportTemplates */
406        $exportTemplates = $this->app->appSettings->get(
407            names: [
408                SettingsEnum::DEFAULT_LIST_EXPORTS,
409            ],
410            module: 'Admin'
411        );
412
413        $templateIds = [];
414        foreach ($exportTemplates as $template) {
415            $templateIds[] = (int) $template->content;
416        }
417
418        /** @var \Modules\Media\Models\Media[] $mediaTemplates */
419        $mediaTemplates = MediaMapper::getAll()
420            ->where('id', $templateIds, 'in')
421            ->execute();
422
423        $tableView         = new TableView($this->app->l11nManager, $request, $response);
424        $tableView->module = 'Admin';
425        $tableView->theme  = 'Backend';
426        $tableView->setTitleTemplate('/Web/Backend/Themes/table-title');
427        $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data');
428        $tableView->setExportTemplates($mediaTemplates);
429        $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table');
430        $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table');
431        $tableView->setSortTemplate('/Web/Backend/Themes/sort-table');
432        $tableView->setData('hasPrevious', $list['hasPrevious']);
433        $tableView->setData('hasNext', $list['hasNext']);
434
435        $view->data['tableView'] = $tableView;
436
437        return $view;
438    }
439
440    /**
441     * Method which generates the group view of a single group.
442     *
443     * @param RequestAbstract  $request  Request
444     * @param ResponseAbstract $response Response
445     * @param array            $data     Generic data
446     *
447     * @return RenderableInterface Response can be rendered
448     *
449     * @since 1.0.0
450     */
451    public function viewGroupSettings(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
452    {
453        $view = new View($this->app->l11nManager, $request, $response);
454        $view->setTemplate('/Modules/Admin/Theme/Backend/groups-single');
455
456        $view->data['nav'] = $this->app->moduleManager->get('Navigation')
457            ->createNavigationMid(1000103001, $request, $response);
458
459        $view->data['group'] = GroupMapper::get()
460            ->with('accounts')
461            ->where('id', (int) $request->getData('id'))
462            ->execute();
463
464        /** @var \Modules\Admin\Models\GroupPermission[] $permissions */
465        $permissions = GroupPermissionMapper::getAll()
466            ->where('group', (int) $request->getData('id'))
467            ->execute();
468
469        $view->data['permissions'] = $permissions;
470
471        $view->data['units']   = UnitMapper::getAll()->execute();
472        $view->data['apps']    = AppMapper::getAll()->execute();
473        $view->data['modules'] = ModuleMapper::getAll()->execute();
474
475        $accGrpSelector               = new \Modules\Profile\Theme\Backend\Components\AccountGroupSelector\BaseView($this->app->l11nManager, $request, $response);
476        $view->data['accGrpSelector'] = $accGrpSelector;
477
478        $editor               = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response);
479        $view->data['editor'] = $editor;
480
481        $mapperQuery = AuditMapper::getAll()
482            ->with('createdBy')
483            ->where('module', self::NAME)
484            ->where('type', StringUtils::intHash(GroupMapper::class))
485            ->where('ref', $request->getDataString('id') ?? '0')
486            ->limit(25);
487
488        // audit log
489        if ($request->getData('ptype') === 'p') {
490            $view->data['auditlogs'] = $mapperQuery->where('id', $request->getDataInt('audit') ?? 0, '<')->limit(25)->execute();
491        } elseif ($request->getData('ptype') === 'n') {
492            $view->data['auditlogs'] = $mapperQuery->where('id', $request->getDataInt('audit') ?? 0, '>')->limit(25)->execute();
493        } else {
494            $view->data['auditlogs'] = $mapperQuery->where('id', 0, '>')->limit(25)->execute();
495        }
496
497        return $view;
498    }
499
500    /**
501     * Method which generates the group create view.
502     *
503     * @param RequestAbstract  $request  Request
504     * @param ResponseAbstract $response Response
505     * @param array            $data     Generic data
506     *
507     * @return RenderableInterface Response can be rendered
508     *
509     * @since 1.0.0
510     */
511    public function viewGroupCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
512    {
513        $view = new View($this->app->l11nManager, $request, $response);
514        $view->setTemplate('/Modules/Admin/Theme/Backend/groups-create');
515        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000103001, $request, $response);
516
517        $editor               = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response);
518        $view->data['editor'] = $editor;
519
520        return $view;
521    }
522
523    /**
524     * Method which generates the module list view.
525     *
526     * @param RequestAbstract  $request  Request
527     * @param ResponseAbstract $response Response
528     * @param array            $data     Generic data
529     *
530     * @return RenderableInterface Response can be rendered
531     *
532     * @since 1.0.0
533     */
534    public function viewModuleList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
535    {
536        /** @var \phpOMS\Model\Html\Head $head */
537        $head = $response->data['Content']->head;
538        $head->addAsset(AssetType::CSS, 'Modules/Admin/Theme/Backend/css/styles.css?v=1.0.0');
539
540        $view = new View($this->app->l11nManager, $request, $response);
541        $view->setTemplate('/Modules/Admin/Theme/Backend/modules-list');
542
543        $view->data['modules']   = $this->app->moduleManager->getAllModules();
544        $view->data['active']    = $this->app->moduleManager->getActiveModules();
545        $view->data['installed'] = $this->app->moduleManager->getInstalledModules();
546
547        /** @var \Model\Setting[] $exportTemplates */
548        $exportTemplates = $this->app->appSettings->get(
549            names: [
550                SettingsEnum::DEFAULT_LIST_EXPORTS,
551            ],
552            module: 'Admin'
553        );
554
555        $templateIds = [];
556        foreach ($exportTemplates as $template) {
557            $templateIds[] = (int) $template->content;
558        }
559
560        /** @var \Modules\Media\Models\Media[] $mediaTemplates */
561        $mediaTemplates = MediaMapper::getAll()
562            ->where('id', $templateIds, 'in')
563            ->execute();
564
565        $tableView         = new TableView($this->app->l11nManager, $request, $response);
566        $tableView->module = 'Admin';
567        $tableView->theme  = 'Backend';
568        $tableView->setTitleTemplate('/Web/Backend/Themes/table-title');
569        $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data');
570        $tableView->setExportTemplates($mediaTemplates);
571        $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table');
572        $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table');
573        $tableView->setSortTemplate('/Web/Backend/Themes/sort-table');
574
575        $view->data['tableView'] = $tableView;
576
577        return $view;
578    }
579
580    /**
581     * Method which generates the module profile view.
582     *
583     * @param RequestAbstract  $request  Request
584     * @param ResponseAbstract $response Response
585     * @param array            $data     Generic data
586     *
587     * @return RenderableInterface Response can be rendered
588     *
589     * @since 1.0.0
590     */
591    public function viewModuleInfo(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
592    {
593        $view = new View($this->app->l11nManager, $request, $response);
594        $view->setTemplate('/Modules/Admin/Theme/Backend/modules-info');
595        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response);
596
597        $id                      = $request->getDataString('id') ?? '';
598        $view->data['modules']   = $this->app->moduleManager->getAllModules();
599        $view->data['active']    = $this->app->moduleManager->getActiveModules();
600        $view->data['installed'] = $this->app->moduleManager->getInstalledModules();
601        $view->data['id']        = $id;
602
603        $type     = 'Help';
604        $page     = 'introduction';
605        $basePath = __DIR__ . '/../../' . $request->getData('id') . '/Docs/' . $type . '/' . $request->header->l11n->language;
606        $path     = \realpath($basePath . '/' . $page . '.md');
607
608        if ($path === false) {
609            $basePath = __DIR__ . '/../../' . $request->getData('id') . '/Docs/' . $type . '/' . $this->app->l11nServer->language;
610            $path     = \realpath($basePath . '/' . $page . '.md');
611        }
612
613        if ($path === false) {
614            $basePath = __DIR__ . '/../../' . $request->getData('id') . '/Docs/' . $type . '/en';
615            $path     = \realpath($basePath . '/' . $page . '.md');
616        }
617
618        if ($path === false) {
619            $path = \realpath($basePath . '/introduction.md');
620        }
621
622        $toParse = $path === false ? '' : \file_get_contents($path);
623        $content = Markdown::parse($toParse === false ? '' : $toParse);
624
625        $view->data['introduction'] = $content;
626
627        return $view;
628    }
629
630    /**
631     * Method which generates the module profile view.
632     *
633     * @param RequestAbstract  $request  Request
634     * @param ResponseAbstract $response Response
635     * @param array            $data     Generic data
636     *
637     * @return RenderableInterface Response can be rendered
638     *
639     * @since 1.0.0
640     */
641    public function viewModuleLog(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
642    {
643        $view = new View($this->app->l11nManager, $request, $response);
644        $view->setTemplate('/Modules/Admin/Theme/Backend/modules-log');
645        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response);
646
647        $id = $request->getDataString('id') ?? '';
648
649        $queryMapper =  AuditMapper::getAll()
650            ->with('createdBy')
651            ->where('module', $id);
652
653        // audit log
654        if ($request->getData('ptype') === 'p') {
655            $view->data['auditlogs'] = $queryMapper->where('id', (int) $request->getData('audit'), '<')->limit(25)->execute();
656        } elseif ($request->getData('ptype') === 'n') {
657            $view->data['auditlogs'] = $queryMapper->where('id', (int) $request->getData('audit'), '>')->limit(25)->execute();
658        } else {
659            $view->data['auditlogs'] = $queryMapper->where('id', 0, '>')->limit(25)->execute();
660        }
661
662        return $view;
663    }
664
665    /**
666     * Method which generates the module profile view.
667     *
668     * @param RequestAbstract  $request  Request
669     * @param ResponseAbstract $response Response
670     * @param array            $data     Generic data
671     *
672     * @return RenderableInterface Response can be rendered
673     *
674     * @since 1.0.0
675     */
676    public function viewModuleRouteList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
677    {
678        $view = new View($this->app->l11nManager, $request, $response);
679        $view->setTemplate('/Modules/Admin/Theme/Backend/modules-route-list');
680        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response);
681
682        $module               = $request->getDataString('id') ?? '';
683        $view->data['module'] = $module;
684
685        $appPath      = __DIR__ . '/../../../Web';
686        $activeRoutes = [];
687
688        $apps = \scandir($appPath);
689        if ($apps === false) {
690            $apps = [];
691        }
692
693        foreach ($apps as $app) {
694            if (!\is_file(__DIR__ . '/../../../Web/' . $app . '/Routes.php')) {
695                continue;
696            }
697
698            $activeRoutes['Web/' . $app] = include __DIR__ . '/../../../Web/' . $app . '/Routes.php';
699        }
700
701        if (\is_file(__DIR__ . '/../../../Cli/Routes.php')) {
702            $activeRoutes['Cli'] = include __DIR__ . '/../../../Cli/Routes.php';
703        }
704
705        if (\is_file(__DIR__ . '/../../../Socket/Routes.php')) {
706            $activeRoutes['Socket'] = include __DIR__ . '/../../../Socket/Routes.php';
707        }
708
709        $view->data['routes'] = $activeRoutes;
710
711        return $view;
712    }
713
714    /**
715     * Method which generates the module profile view.
716     *
717     * @param RequestAbstract  $request  Request
718     * @param ResponseAbstract $response Response
719     * @param array            $data     Generic data
720     *
721     * @return RenderableInterface Response can be rendered
722     *
723     * @since 1.0.0
724     */
725    public function viewModuleHookList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
726    {
727        $view = new View($this->app->l11nManager, $request, $response);
728        $view->setTemplate('/Modules/Admin/Theme/Backend/modules-hook-list');
729        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response);
730
731        $module               = $request->getDataString('id') ?? '';
732        $view->data['module'] = $module;
733
734        $appPath     = __DIR__ . '/../../../Web';
735        $activeHooks = [];
736
737        $apps = \scandir($appPath);
738        if ($apps === false) {
739            $apps = [];
740        }
741
742        foreach ($apps as $app) {
743            if (!\is_file(__DIR__ . '/../../../Web/' . $app . '/Hooks.php')) {
744                continue;
745            }
746
747            $activeHooks['Web/' . $app] = include __DIR__ . '/../../../Web/' . $app . '/Hooks.php';
748        }
749
750        if (\is_file(__DIR__ . '/../../../Cli/Hooks.php')) {
751            $activeHooks['Cli'] = include __DIR__ . '/../../../Cli/Hooks.php';
752        }
753
754        if (\is_file(__DIR__ . '/../../../Socket/Hooks.php')) {
755            $activeHooks['Socket'] = include __DIR__ . '/../../../Socket/Hooks.php';
756        }
757
758        $view->data['hooks'] = $activeHooks;
759
760        return $view;
761    }
762
763    /**
764     * Method which generates the module profile view.
765     *
766     * @param RequestAbstract  $request  Request
767     * @param ResponseAbstract $response Response
768     * @param array            $data     Generic data
769     *
770     * @return RenderableInterface Response can be rendered
771     *
772     * @since 1.0.0
773     */
774    public function viewModuleSettings(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
775    {
776        $view              = new View($this->app->l11nManager, $request, $response);
777        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response);
778
779        $id = $request->getDataString('id') ?? '';
780
781        /** @var \Model\Setting[] $settings */
782        $settings = SettingMapper::getAll()->where('module', $id)->execute();
783        if (empty($settings)) {
784            $view->data['settings'] = $settings;
785        }
786
787        $class = '\\Modules\\' . $request->getData('id') . '\\Models\\SettingsEnum';
788        if (!Autoloader::exists($class)) {
789            $class = null;
790        }
791
792        $view->data['settings_class'] = $class;
793
794        if ($request->getData('id') === 'Admin') {
795            $view->setTemplate('/Modules/' . $request->getData('id') . '/Admin/Settings/Theme/Backend/settings');
796        } elseif (\is_file(__DIR__ . '/../../' . ($request->getDataString('id') ?? '') . '/Admin/Settings/Theme/Backend/settings.tpl.php')) {
797            return $this->app->moduleManager->get($request->getDataString('id') ?? '')
798                ->viewModuleSettings($request, $response, $data);
799        } else {
800            $view->setTemplate('/Modules/Admin/Theme/Backend/modules-settings');
801        }
802
803        /** @var \Model\Setting[] $generalSettings */
804        $generalSettings = $this->app->appSettings->get(
805            names: [
806                SettingsEnum::PASSWORD_PATTERN, SettingsEnum::LOGIN_TIMEOUT, SettingsEnum::PASSWORD_INTERVAL, SettingsEnum::PASSWORD_HISTORY, SettingsEnum::LOGIN_TRIES, SettingsEnum::LOGGING_STATUS, SettingsEnum::LOGGING_PATH, SettingsEnum::DEFAULT_UNIT,
807                SettingsEnum::LOGIN_STATUS, SettingsEnum::DEFAULT_LOCALIZATION, SettingsEnum::MAIL_SERVER_ADDR,
808            ],
809            module: 'Admin'
810        );
811
812        $view->data['generalSettings']     = $generalSettings;
813        $view->data['defaultlocalization'] = LocalizationMapper::get()->where('id', (int) $generalSettings[SettingsEnum::DEFAULT_LOCALIZATION]->content)->execute();
814
815        return $view;
816    }
817}