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
29
n/a
0 / 0
 viewApplicationList
n/a
0 / 0
n/a
0 / 0
3
 viewApplicationCreate
n/a
0 / 0
n/a
0 / 0
1
 viewPageList
n/a
0 / 0
n/a
0 / 0
1
 viewPage
n/a
0 / 0
n/a
0 / 0
1
 viewApplicationPosts
n/a
0 / 0
n/a
0 / 0
1
 viewApplicationFile
n/a
0 / 0
n/a
0 / 0
22
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   Modules\CMS
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\CMS\Controller;
16
17use Modules\Admin\Models\AppMapper;
18use Modules\CMS\Models\PageMapper;
19use phpOMS\Application\ApplicationType;
20use phpOMS\Contract\RenderableInterface;
21use phpOMS\Message\Http\RequestStatusCode;
22use phpOMS\Message\RequestAbstract;
23use phpOMS\Message\ResponseAbstract;
24use phpOMS\Security\Guard;
25use phpOMS\Views\View;
26
27/**
28 * CMS class.
29 *
30 * @package Modules\CMS
31 * @license OMS License 2.0
32 * @link    https://jingga.app
33 * @since   1.0.0
34 * @codeCoverageIgnore
35 */
36final class BackendController extends Controller
37{
38    /**
39     * Routing end-point for application behaviour.
40     *
41     * @param RequestAbstract  $request  Request
42     * @param ResponseAbstract $response Response
43     * @param array            $data     Generic data
44     *
45     * @return RenderableInterface
46     *
47     * @since 1.0.0
48     */
49    public function viewApplicationList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
50    {
51        $view = new View($this->app->l11nManager, $request, $response);
52
53        $view->setTemplate('/Modules/CMS/Theme/Backend/application-list');
54        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1007802001, $request, $response);
55
56        if ($request->getData('ptype') === 'p') {
57            $view->data['applications'] = AppMapper::getAll()->where('type', ApplicationType::WEB)->where('id', $request->getDataInt('id') ?? 0, '<')->limit(25)->execute();
58        } elseif ($request->getData('ptype') === 'n') {
59            $view->data['applications'] = AppMapper::getAll()->where('type', ApplicationType::WEB)->where('id', $request->getDataInt('id') ?? 0, '>')->limit(25)->execute();
60        } else {
61            $view->data['applications'] = AppMapper::getAll()->where('type', ApplicationType::WEB)->where('id', 0, '>')->limit(25)->execute();
62        }
63
64        return $view;
65    }
66
67    /**
68     * Routing end-point for application behaviour.
69     *
70     * @param RequestAbstract  $request  Request
71     * @param ResponseAbstract $response Response
72     * @param array            $data     Generic data
73     *
74     * @return RenderableInterface
75     *
76     * @since 1.0.0
77     */
78    public function viewApplicationCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
79    {
80        $view = new View($this->app->l11nManager, $request, $response);
81
82        $view->setTemplate('/Modules/CMS/Theme/Backend/application-create');
83        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1007802001, $request, $response);
84
85        $editor               = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response);
86        $view->data['editor'] = $editor;
87
88        return $view;
89    }
90
91    /**
92     * Routing end-point for application behaviour.
93     *
94     * @param RequestAbstract  $request  Request
95     * @param ResponseAbstract $response Response
96     * @param array            $data     Generic data
97     *
98     * @return RenderableInterface
99     *
100     * @since 1.0.0
101     */
102    public function viewPageList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
103    {
104        $view = new View($this->app->l11nManager, $request, $response);
105
106        $view->setTemplate('/Modules/CMS/Theme/Backend/application-page-list');
107        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1007802101, $request, $response);
108
109        $pages = PageMapper::getAll()
110            ->where('app', $request->getData('app'))
111            ->execute();
112
113        $view->data['list'] = $pages;
114
115        return $view;
116    }
117
118    /**
119     * Routing end-point for application behaviour.
120     *
121     * @param RequestAbstract  $request  Request
122     * @param ResponseAbstract $response Response
123     * @param array            $data     Generic data
124     *
125     * @return RenderableInterface
126     *
127     * @since 1.0.0
128     * @codeCoverageIgnore
129     */
130    public function viewPage(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
131    {
132        $view = new View($this->app->l11nManager, $request, $response);
133
134        $view->setTemplate('/Modules/CMS/Theme/Backend/application-page');
135        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1007802101, $request, $response);
136
137        $editor               = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response);
138        $view->data['editor'] = $editor;
139
140        $page = PageMapper::get()
141            ->with('l11n')
142            ->where('id', (int) $request->getData('id'))
143            ->execute();
144
145        $view->data['page'] = $page;
146
147        return $view;
148    }
149
150    /**
151     * Routing end-point for application behaviour.
152     *
153     * @param RequestAbstract  $request  Request
154     * @param ResponseAbstract $response Response
155     * @param array            $data     Generic data
156     *
157     * @return RenderableInterface
158     *
159     * @since 1.0.0
160     */
161    public function viewApplicationPosts(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
162    {
163        $view = new View($this->app->l11nManager, $request, $response);
164
165        $view->setTemplate('/Modules/CMS/Theme/Backend/application-posts');
166        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1007802101, $request, $response);
167
168        return $view;
169    }
170
171    /**
172     * Routing end-point for application behaviour.
173     *
174     * @param RequestAbstract  $request  Request
175     * @param ResponseAbstract $response Response
176     * @param array            $data     Generic data
177     *
178     * @return RenderableInterface
179     *
180     * @since 1.0.0
181     */
182    public function viewApplicationFile(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface
183    {
184        $view = new View($this->app->l11nManager, $request, $response);
185
186        $view->setTemplate('/Modules/CMS/Theme/Backend/application-file');
187        $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1007802101, $request, $response);
188
189        /** @var \Modules\Admin\Models\App $app */
190        $app               = AppMapper::get()->where('type', ApplicationType::WEB)->where('id', $request->getData('id'))->execute();
191        $view->data['app'] = $app;
192
193        $basePath = \realpath(__DIR__ . '/../../../Web/');
194        $path     = \realpath($basePath . '/' . \ucfirst(\strtolower($app->name)) . '/' . ($request->getDataString('file') ?? ''));
195
196        if ($path === false || \stripos($path, $basePath . '/') !== 0 || $basePath === false) {
197            $path = \realpath($basePath . '/' . \ucfirst(\strtolower($app->name)));
198        }
199
200        if ($path === false || $basePath === false || !Guard::isSafePath($path)) {
201            $view->setTemplate('/Web/Backend/Error/404');
202            $response->header->status = RequestStatusCode::R_404;
203
204            return $view;
205        }
206
207        if (!\is_dir($path)) {
208            $path = \dirname($path);
209        }
210
211        $tempList = ($dirs = \scandir($path)) === false ? [] : $dirs;
212
213        $temp1    = [];
214        $temp2    = [];
215        $fileList = [];
216
217        foreach ($tempList as $element) {
218            if ($element === '.' || $element === '..') {
219                continue;
220            } elseif (\is_file($path . '/' . $element)) {
221                $temp2[] = ['name' => $element, 'type' => 0];
222            } else {
223                $temp1[] = ['name' => $element, 'type' => 1];
224            }
225        }
226
227        $file   = \realpath($basePath . '/' . \ucfirst(\strtolower($app->name)) . '/' . ($request->getDataString('file') ?? ''));
228        $parent = $file === false || \is_dir($file) ? $request->getDataString('file') ?? '' : \dirname($request->getDataString('file') ?? '');
229
230        if ($file === false || !\is_file($file) || \stripos($file, $basePath) !== 0) {
231            $file = empty($temp2) ? false : \realpath(\rtrim($path, '/') . '/' . $temp2[0]['name']);
232        }
233
234        $fileList = \array_merge($temp1, $temp2);
235
236        if ($file === false || !Guard::isSafePath($file)) {
237            $view->setTemplate('/Web/Backend/Error/404');
238            $response->header->status = RequestStatusCode::R_404;
239
240            return $view;
241        }
242
243        $view->data['content'] = $file === false ? '' : \file_get_contents($file);
244        $view->data['parent']  = $parent;
245        $view->data['list']    = $fileList;
246
247        return $view;
248    }
249}