Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
LegacyMiddleware
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
2 / 2
30
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 process
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
9
 loadPage
n/a
0 / 0
n/a
0 / 0
16
 renderPage
n/a
0 / 0
n/a
0 / 0
4
1<?php
2
3declare(strict_types=1);
4
5namespace Engelsystem\Middleware;
6
7use Engelsystem\Helpers\Authenticator;
8use Engelsystem\Helpers\Translation\Translator;
9use Engelsystem\Http\Request;
10use Psr\Container\ContainerInterface;
11use Psr\Http\Message\ResponseInterface;
12use Psr\Http\Message\ServerRequestInterface;
13use Psr\Http\Server\MiddlewareInterface;
14use Psr\Http\Server\RequestHandlerInterface;
15
16/**
17 * Middleware to support the old routing / pages from includes
18 */
19class LegacyMiddleware implements MiddlewareInterface
20{
21    /** @var array<string> */
22    protected array $free_pages = [
23        'angeltypes',
24        'public_dashboard',
25        'locations',
26        'shift_entries',
27        'shifts',
28        'users',
29    ];
30
31    public function __construct(protected ContainerInterface $container, protected Authenticator $auth)
32    {
33    }
34
35    /**
36     * Handle the request the old way
37     *
38     * Should be used before a 404 is sent
39     */
40    public function process(
41        ServerRequestInterface $request,
42        RequestHandlerInterface $handler
43    ): ResponseInterface {
44        /** @var Request $appRequest */
45        $appRequest = $this->container->get('request');
46        $page = $appRequest->query->get('p');
47        // Support old URL/permission scheme
48        if (empty($page)) {
49            $page = $appRequest->path();
50            $page = str_replace('-', '_', $page);
51        }
52
53        $allowPage = false;
54        if ($page === 'admin_arrive') {
55            $allowPage = $this->auth->can('users.arrive.list');
56        }
57
58        $title = $content = '';
59        if (
60            preg_match('~^\w+$~i', $page)
61            && (in_array($page, $this->free_pages) || $this->auth->can($page) || $allowPage)
62        ) {
63            list($title, $content) = $this->loadPage($page);
64        }
65
66        if (empty($title) and empty($content)) {
67            /** @var Translator $translator */
68            $translator = $this->container->get('translator');
69
70            $page = 404;
71            $title = $translator->translate('page.404.title');
72            $content = $translator->translate('page.404.text');
73        }
74
75        return $this->renderPage($page, $title, $content);
76    }
77
78    /**
79     * Get the legacy page content and title
80     *
81     * @return array ['title', 'content']
82     * @codeCoverageIgnore
83     */
84    protected function loadPage(string $page): array
85    {
86        switch ($page) {
87            case 'public_dashboard':
88                return public_dashboard_controller();
89            case 'angeltypes':
90                return angeltypes_controller();
91            case 'shift_entries':
92                return shift_entries_controller();
93            case 'shifts':
94                return shifts_controller();
95            case 'users':
96                return users_controller();
97            case 'user_angeltypes':
98                return user_angeltypes_controller();
99            case 'locations':
100                return locations_controller();
101            case 'user_myshifts':
102                $title = myshifts_title();
103                $content = user_myshifts();
104                return [$title, $content];
105            case 'user_shifts':
106                $title = shifts_title();
107                $content = user_shifts();
108                return [$title, $content];
109            case 'admin_user':
110                $title = admin_user_title();
111                $content = admin_user();
112                return [$title, $content];
113            case 'admin_arrive':
114                $title = admin_arrive_title();
115                $content = admin_arrive();
116                return [$title, $content];
117            case 'admin_active':
118                $title = admin_active_title();
119                $content = admin_active();
120                return [$title, $content];
121            case 'admin_free':
122                $title = admin_free_title();
123                $content = admin_free();
124                return [$title, $content];
125            case 'admin_groups':
126                $title = admin_groups_title();
127                $content = admin_groups();
128                return [$title, $content];
129            case 'admin_shifts':
130                $title = admin_shifts_title();
131                $content = admin_shifts();
132                return [$title, $content];
133        }
134
135        throw_redirect(url('/login'));
136
137        return [];
138    }
139
140    /**
141     * Render the template
142     *
143     * @codeCoverageIgnore
144     */
145    protected function renderPage(string | int $page, string $title, string $content): ResponseInterface
146    {
147        if (!empty($page) && is_int($page)) {
148            return response($content, $page);
149        }
150
151        if (str_contains($content, '<html')) {
152            return response($content);
153        }
154
155        return response(
156            view(
157                'layouts/app',
158                [
159                    'title'   => $title,
160                    'content' => msg() . $content,
161                ]
162            )
163        );
164    }
165}