Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
13 / 13
CRAP
100.00% covered (success)
100.00%
1 / 1
LoginService
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
13 / 13
14
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 runAction
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 login
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 stored
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 available
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 resend
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 register
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 recover
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 regenerate
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 password
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 logout
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 activate
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 mailchange
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3    declare(strict_types=1);
4
5    namespace UppServices;
6
7    /**
8     * Login-related actions. Delegates to action files in App/Services/login/.
9     * Each action receives a ConxHelper (connection created lazily on first use) and $logger.
10     */
11    class LoginService
12    {
13        private const LOGIN_ACTIONS_DIR = __DIR__.'/login';
14        private readonly LoggerFactory $loggerFactory;
15        private readonly SessionService $sessionService;
16
17        public function __construct(
18            LoggerFactory $loggerFactory,
19            SessionService $sessionService,
20        ) {
21            $this->loggerFactory = $loggerFactory;
22            $this->sessionService = $sessionService;
23        }
24
25        /** @var array<string, callable> cache of loaded action callables to avoid redeclaring functions on second require */
26        private static array $actionCache = [];
27
28        /**
29         * Load and run an action. Creates a ConxHelper and passes it to the action; connection is created lazily by the helper; caller releases it.
30         *
31         * @param array<string, mixed> $query
32         * @return array{output: string, contentType: string}
33         */
34        private function runAction(string $actionName, string $body, array $query): array
35        {
36            require_once __DIR__.'/legacy/ddbb/conx.php';
37            $conx = new \ConxHelper(__FILE__);
38
39            if (!isset(self::$actionCache[$actionName])) {
40                $path = self::LOGIN_ACTIONS_DIR.'/'.$actionName.'.php';
41                self::$actionCache[$actionName] = require $path;
42            }
43            $action = self::$actionCache[$actionName];
44            $logger = $this->loggerFactory->for(__FILE__);
45            try {
46                return $action($body, $query, $conx, $logger, $this->sessionService);
47            } 
48            finally {
49                $conx->release();
50            }
51        }
52
53        /** POST /login - username/password login */
54        public function login(string $body, array $query): array
55        {
56            return $this->runAction('Login', $body, $query);
57        }
58
59        /** GET /login/stored - stored session login */
60        public function stored(array $query): array
61        {
62            return $this->runAction('Stored', '', $query);
63        }
64
65        /** GET /login/available - check if email is available */
66        public function available(array $query): array
67        {
68            return $this->runAction('Available', '', $query);
69        }
70
71        /** GET /login/resend - resend validation email */
72        public function resend(array $query): array
73        {
74            return $this->runAction('Resend', '', $query);
75        }
76
77        /** POST /login/register - register new user */
78        public function register(string $body, array $query): array
79        {
80            return $this->runAction('Register', $body, $query);
81        }
82
83        /** GET /login/recover - password recovery request */
84        public function recover(array $query): array
85        {
86            return $this->runAction('Recover', '', $query);
87        }
88
89        /** GET /login/regenerate - password regeneration (from recovery link) */
90        public function regenerate(array $query): array
91        {
92            return $this->runAction('Regenerate', '', $query);
93        }
94
95        /** GET /login/password - change password */
96        public function password(array $query): array
97        {
98            return $this->runAction('Password', '', $query);
99        }
100
101        /** GET /login/logout - logout session */
102        public function logout(array $query): array
103        {
104            return $this->runAction('Logout', '', $query);
105        }
106
107        /** GET /login/activate - activate user (email link) */
108        public function activate(array $query): array
109        {
110            return $this->runAction('Activate', '', $query);
111        }
112
113        /** GET /login/mailchange - confirm email change (email link) */
114        public function mailchange(array $query): array
115        {
116            return $this->runAction('Mailchange', '', $query);
117        }
118    }