Passed
Push — master ( ddb225...7e4d75 )
by Derek Stephen
02:50
created

BoneUserPackage   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 186
Duplicated Lines 0 %

Test Coverage

Coverage 86.78%

Importance

Changes 10
Bugs 0 Features 4
Metric Value
eloc 104
c 10
b 0
f 4
dl 0
loc 186
ccs 105
cts 121
cp 0.8678
rs 10
wmc 16

9 Methods

Rating   Name   Duplication   Size   Complexity  
A addViewExtensions() 0 9 1
A addViews() 0 5 1
A getTranslationsDirectory() 0 3 1
A addRoutes() 0 56 4
A getAssetFolders() 0 4 1
A getFixtures() 0 4 1
A getAdminLinks() 0 18 3
A registerConsoleCommands() 0 5 1
A addToContainer() 0 57 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Bone\User;
6
7
use Barnacle\Container;
8
use Barnacle\RegistrationInterface;
9
use Bone\Application;
10
use Bone\Console\CommandRegistrationInterface;
11
use Bone\Contracts\Container\AdminPanelProviderInterface;
12
use Bone\Contracts\Container\FixtureProviderInterface;
13
use Bone\Controller\Init;
14
use Bone\Http\Middleware\HalEntity;
15
use Bone\Http\Middleware\JsonParse;
16
use Bone\Http\Middleware\Stack;
17
use Bone\I18n\I18nRegistrationInterface;
18
use Bone\Mail\Service\MailService;
19
use Bone\OAuth2\Http\Middleware\ResourceServerMiddleware;
0 ignored issues
show
Bug introduced by
The type Bone\OAuth2\Http\Middlew...esourceServerMiddleware was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
20
use Bone\OAuth2\Http\Middleware\ScopeCheck;
0 ignored issues
show
Bug introduced by
The type Bone\OAuth2\Http\Middleware\ScopeCheck was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
21
use Bone\Paseto\PasetoService;
22
use Bone\Server\SiteConfig;
23
use Bone\Router\Router;
24
use Bone\Router\RouterConfigInterface;
25
use Bone\User\Controller\BoneUserApiController;
26
use Bone\User\Controller\BoneUserController;
27
use Bone\User\Fixtures\LoadUsers;
28
use Bone\User\Http\Controller\Admin\PersonAdminController;
29
use Bone\User\Http\Controller\Admin\UserAdminController;
30
use Bone\User\Http\Controller\Api\PersonApiController;
31
use Bone\User\Http\Controller\Api\UserApiController;
32
use Bone\User\Http\Middleware\SessionAuth;
33
use Bone\User\Http\Middleware\SessionAuthRedirect;
34
use Bone\User\View\Helper\LoginWidget;
35
use Bone\View\Util\AdminLink;
36
use Bone\View\ViewEngine;
37
use Bone\View\ViewRegistrationInterface;
38
use Del\Booty\AssetRegistrationInterface;
39
use Del\Console\CreateUserCommand;
40
use Del\Console\ResetPasswordCommand;
41
use Del\Service\UserService;
42
use Del\SessionManager;
43
use Del\UserPackage;
44
use League\Route\RouteGroup;
45
use League\Route\Strategy\JsonStrategy;
46
use Laminas\Diactoros\ResponseFactory;
47
use Laminas\I18n\Translator\Translator;
48
49
class BoneUserPackage implements RegistrationInterface, RouterConfigInterface, I18nRegistrationInterface,
50
                                 AssetRegistrationInterface, ViewRegistrationInterface, CommandRegistrationInterface,
51
                                 FixtureProviderInterface, AdminPanelProviderInterface
52
{
53 3
    public function addToContainer(Container $c)
54
    {
55 3
        $c[BoneUserController::class] = $c->factory(function (Container $c) {
56
            /** @var MailService $mailService */
57 1
            $mailService = $c->get(MailService::class);
58
            /** @var UserService $userService */
59 1
            $userService = $c->get(UserService::class);
60 1
            $pasetoService = $c->get(PasetoService::class);
61 1
            $defaultLayout = $c->get('default_layout');
62 1
            $adminLayout = $c->has('admin_layout') ? $c->get('admin_layout') : $defaultLayout;
63 1
            $options = [];
64
65 1
            if ($c->has('bone-user')) {
66 1
                $options = $c->get('bone-user');
67
            }
68
69 1
            $loginRedirectRoute = $options['loginRedirectRoute'] ?? '/user/home';
70 1
            $registrationEnabled = $options['enableRegistration'] ?? true;
71 1
            $profileRequired = $options['requireProfile'] ?? false;
72 1
            $rememberMeCookie = $options['rememberMeCookie'] ?? false;
73 1
            $controller = new BoneUserController($userService, $mailService, $loginRedirectRoute, $adminLayout, $pasetoService, $registrationEnabled, $profileRequired, $rememberMeCookie);
74
75 1
            return  Init::controller($controller, $c);
76 3
        });
77
78 3
        $c[BoneUserApiController::class] = $c->factory(function (Container $c) {
79
            /** @var UserService $userService */
80 1
            $userService = $c->get(UserService::class);
81 1
            $dir = $c->get('uploads_dir');
82 1
            $img = $c->get('image_dir');
83 1
            $tmp = $c->get('temp_dir');
84 1
            $mailService = $c->get(MailService::class);
85
86 1
            return Init::controller(new BoneUserApiController($userService, $dir, $img, $tmp, $mailService), $c);
87 3
        });
88
89
90 3
        $c[SessionAuth::class] = $c->factory(function (Container $c) {
91
            /** @var SessionManager $session */
92 2
            $session = $c->get(SessionManager::class);
93
            /** @var UserService $userService */
94 2
            $userService = $c->get(UserService::class);
95
            /** @var PasetoService $pasetoService */
96 2
            $pasetoService = $c->get(PasetoService::class);
97
98 2
            return new SessionAuth($session, $userService, $pasetoService);
99 3
        });
100
101 3
        $c[SessionAuthRedirect::class] = $c->factory(function (Container $c) {
102
            /** @var SessionManager $session */
103 1
            $session = $c->get(SessionManager::class);
104
            /** @var UserService $userService */
105 1
            $userService = $c->get(UserService::class);
106
            /** @var PasetoService $pasetoService */
107 1
            $pasetoService = $c->get(PasetoService::class);
108
109 1
            return new SessionAuthRedirect($session, $userService, $pasetoService);
110 3
        });
111
    }
112
113 1
    public function getAssetFolders(): array
114
    {
115 1
        return [
116 1
            'bone-user' => dirname(__DIR__) . '/data/assets',
117 1
        ];
118
    }
119
120 1
    public function getTranslationsDirectory(): string
121
    {
122 1
        return dirname(__DIR__) . '/data/translations';
123
    }
124
125 1
    public function addViews(): array
126
    {
127 1
        return [
128 1
            'boneuser' => __DIR__ . '/View/BoneUser/',
129 1
            'email.user' => __DIR__ . '/View/email/',
130 1
        ];
131
    }
132
133 1
    public function addViewExtensions(Container $c): array
134
    {
135 1
        $userService = $c->get(UserService::class);
136 1
        $translator = $c->get(Translator::class);
137 1
        $sessionManager = $c->get(SessionManager::class);
138 1
        $uploadFolder = $c->get('uploads_dir');
139 1
        $loginWidget = new LoginWidget($userService, $translator, $sessionManager, $uploadFolder);
140
141 1
        return [$loginWidget];
142
    }
143
144 1
    public function addRoutes(Container $c, Router $router): Router
145
    {
146 1
        $router->group('/user', function (RouteGroup $route) {
147 1
            $route->map('GET', '/', [BoneUserController::class, 'indexAction']);
148 1
            $route->map('GET', '/lost-password/{email}', [BoneUserController::class, 'forgotPasswordAction']);
149 1
            $route->map('GET', '/login', [BoneUserController::class, 'loginAction']);
150 1
            $route->map('POST', '/login', [BoneUserController::class, 'loginFormAction']);
151 1
            $route->map('GET', '/logout', [BoneUserController::class, 'logoutAction']);
152 1
            $route->map('GET', '/activate/{email}/{token}', [BoneUserController::class, 'activateAction']);
153 1
            $route->map('GET', '/reset-email/{email}/{new-email}/{token}', [BoneUserController::class, 'resetEmailAction']);
154 1
            $route->map('GET', '/reset-password/{email}/{token}', [BoneUserController::class, 'resetPasswordAction']);
155 1
            $route->map('POST', '/reset-password/{email}/{token}', [BoneUserController::class, 'resetPasswordAction']);
156 1
            $route->map('GET', '/resend-activation-mail/{email}', [BoneUserController::class, 'resendActivationEmailAction']);
157 1
        });
158
159 1
        $canRegister = true;
160 1
        $admin = false;
161 1
        $api = false;
0 ignored issues
show
Unused Code introduced by
The assignment to $api is dead and can be removed.
Loading history...
162
163 1
        if ($c->has('bone-user')) {
164 1
            $config = $c->get('bone-user');
165 1
            $canRegister = $config['enableRegistration'] ?? true;
166 1
            $admin = $config['admin'] ?? false;
167 1
            $api = $config['api'] ?? false;
168
        }
169
170 1
        if ($canRegister) {
171 1
            $router->map('GET', '/user/register', [BoneUserController::class, 'registerAction']);
172 1
            $router->map('POST', '/user/register', [BoneUserController::class, 'registerAction']);
173
        }
174
175 1
        $auth = $c->get(SessionAuth::class);
176 1
        $router->map('GET', '/user/change-password', [BoneUserController::class, 'changePasswordAction'])->middleware($auth);
177 1
        $router->map('POST', '/user/change-password', [BoneUserController::class, 'changePasswordAction'])->middleware($auth);
178 1
        $router->map('GET', '/user/change-email', [BoneUserController::class, 'changeEmailAction'])->middleware($auth);
179 1
        $router->map('POST', '/user/change-email', [BoneUserController::class, 'changeEmailAction'])->middleware($auth);
180 1
        $router->map('GET', '/user/edit-profile', [BoneUserController::class, 'editProfileAction'])->middleware($auth);
181 1
        $router->map('POST', '/user/edit-profile', [BoneUserController::class, 'editProfileAction'])->middleware($auth);
182 1
        $router->map('GET', '/user/home', [BoneUserController::class, 'homePageAction'])->middleware($auth);
183 1
        $factory = new ResponseFactory();
184 1
        $strategy = new JsonStrategy($factory);
185 1
        $strategy->setContainer($c);
186
187 1
        $router->group('/api/user', function (RouteGroup $route) use ($auth) {
188 1
            $route->map('POST', '/choose-avatar', [BoneUserApiController::class, 'chooseAvatarAction'])->middleware($auth);
189 1
            $route->map('POST', '/upload-avatar', [BoneUserApiController::class, 'uploadAvatarAction'])->middleware($auth);
190 1
            $route->map('GET', '/avatar', [BoneUserApiController::class, 'avatar'])->middleware($auth);
191 1
        })
192 1
        ->setStrategy($strategy);
193
194 1
        if ($admin === true) {
195 1
            $router->adminResource('people', PersonAdminController::class, $c);
196 1
            $router->adminResource('users', UserAdminController::class, $c);
197
        }
198
199 1
        return $router;
200
    }
201
202 1
    public function registerConsoleCommands(Container $container): array
203
    {
204 1
        return [
205 1
            new ResetPasswordCommand($container->get(UserService::class)),
206 1
            new CreateUserCommand($container->get(UserService::class)),
207 1
        ];
208
    }
209
210
    public function getFixtures(): array
211
    {
212
        return [
213
            LoadUsers::class
214
        ];
215
    }
216
217
    public function getAdminLinks(): array
218
    {
219
        $c = Application::ahoy()->getContainer();
220
        $admin = false;
221
222
        if ($c->has('bone-user')) {
223
            $config = $c->get('bone-user');
224
            $admin = $config['admin'] ?? false;
225
        }
226
227
        if ($admin === true) {
228
            return [
229
                new AdminLink('People', '/admin/people', 'nav-icon fa fa-address-book'),
230
                new AdminLink('Users', '/admin/users', 'nav-icon fa fa-users'),
231
            ];
232
        }
233
234
        return [];
235
    }
236
}
237