Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
37.17% covered (danger)
37.17%
42 / 113
100.00% covered (success)
100.00%
1 / 1
CRAP
n/a
0 / 0
_get_username_sessionusers
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2
3/**
4 * @file
5 * Place action: get usernames for session list (sessionusers).
6 */
7
8declare(strict_types=1);
9
10require_once __DIR__.'/../../Legacy/common/session.php';
11
12/**
13 * @param string|null $alias
14 * @param string|null $first
15 * @param string|null $last
16 */
17function _get_username_sessionusers($alias, $first, $last): ?string
18{
19    if ($alias) {
20        return $alias;
21    }
22    if ($first) {
23        return $last ? $first.' '.$last : $first;
24    }
25    return null;
26}
27
28/**
29 * Action callable: get usernames for session list (POST body with session objids).
30 *
31 * @param string $body JSON array of session objids.
32 * @param array<string, mixed> $query Query params: device, session, place.
33 * @param \ConxHelper $conx Connection helper.
34 * @param \Psr\Log\LoggerInterface $logger Logger.
35 * @param \UppServices\SessionService $sessionService Session service for check.
36 * @return array{output: string, contentType: string}
37 */
38return function (string $body, array $query, \ConxHelper $conx, \Psr\Log\LoggerInterface $logger, \UppServices\SessionService $sessionService): array {
39    $retval = \ApplicationError::Success;
40    $_usersmap = [];
41
42    if (!$body) {
43        $logger->error("No post data provided.");
44        $retval = \ApplicationError::Parameters;
45    }
46
47    if (\success($retval)) {
48        $sessions = json_decode($body, true);
49        $logger->debug("DUMP OF POST DATA:".PHP_EOL.print_r($sessions, true).PHP_EOL);
50        if (!\is_array($sessions)) {
51            $logger->error("Invalid JSON format in post request data");
52            $retval = \ApplicationError::Parameters;
53        }
54    }
55
56    if (\success($retval)) {
57        $device = $query['device'] ?? null;
58        if (!$device) {
59            $logger->error("No device provided on URL. Operation cancelled.");
60            $retval = \ApplicationError::Parameters;
61        }
62    }
63
64    if (\success($retval)) {
65        $session = $query['session'] ?? null;
66        if (!$session) {
67            $logger->error("No session provided on URL. Operation cancelled.");
68            $retval = \ApplicationError::Parameters;
69        } else {
70            $userid = null;
71            $sessionObjid = null;
72            $retval = $sessionService->checkSession($conx, (string) $session, (string) $device, $userid, $sessionObjid);
73        }
74    }
75
76    if (\success($retval)) {
77        $place = $query['place'] ?? null;
78        if (!$place) {
79            $logger->error("Mandatory parameter 'place' not provided on URL. Operation cancelled.");
80            $retval = \ApplicationError::Parameters;
81        }
82    }
83
84    if (\success($retval)) {
85        $_sessions = $sessions;
86        $conx->tenant = $place;
87    }
88
89    if (\success($retval) && count($_sessions) > 0) {
90        $_objids = implode(",", $_sessions);
91        $sql = "select SESSION.objid as session, ";
92        $sql .= "QRSCAN.alias as alias, QRSCAN.number as number ";
93        $sql .= "from SESSION ";
94        $sql .= "inner join QRSCAN on SESSION.qrscan = QRSCAN.objid ";
95        $sql .= "where SESSION.objid in (".$_objids.")";
96        $sessionRows = [];
97        $res = $conx->global->runsql(['SESSION', 'QRSCAN'], $sql, $sessionRows);
98        if ($res && count($sessionRows) > 0) {
99            foreach ($sessionRows as &$result) {
100                $_session = $result['session'];
101                $_usersmap[$_session] = [
102                    'type' => 'QR',
103                    'name' => !empty($result['alias']) ? $result['alias'] : (isset($result['number']) ? (string) $result['number'] : ''),
104                ];
105                $_idx = array_search($_session, $_sessions);
106                if ($_idx !== false) {
107                    unset($_sessions[$_idx]);
108                }
109            }
110            unset($result);
111        }
112    }
113
114    if (\success($retval) && count($_sessions) > 0) {
115        $_objids = implode(",", $_sessions);
116        $sql = "select SESSION.objid as session, ";
117        $sql .= "USER.firstname as firstname, USER.lastname as lastname, ";
118        $sql .= "STAFF.alias as alias ";
119        $sql .= "from SESSION ";
120        $sql .= "inner join STAFF on SESSION.user = STAFF.user ";
121        $sql .= "inner join USER on STAFF.user = USER.objid ";
122        $sql .= "where SESSION.objid in (".$_objids.")";
123        $results = [];
124        $res = $conx->global->runsql(['SESSION', 'USER', 'STAFF'], $sql, $results);
125        if ($res) {
126            foreach ($results as &$result) {
127                $_session = $result['session'];
128                $_usersmap[$_session] = [
129                    'type' => 'ST',
130                    'name' => _get_username_sessionusers($result['alias'] ?? null, $result['firstname'] ?? null, $result['lastname'] ?? null),
131                ];
132                $_idx = array_search($_session, $_sessions);
133                if ($_idx !== false) {
134                    unset($_sessions[$_idx]);
135                }
136            }
137            unset($result);
138        } else {
139            $logger->error("STAFF sessions query failed.");
140            $retval = \ApplicationError::Database;
141        }
142    }
143
144    if (\success($retval) && count($_sessions) > 0) {
145        $_objids = implode(",", $_sessions);
146        $sql = "select SESSION.objid as session, ";
147        $sql .= "USER.firstname as firstname, USER.lastname as lastname, ";
148        $sql .= "STAFF.alias as alias ";
149        $sql .= "from SESSION ";
150        $sql .= "inner join USER on USER.objid = SESSION.user ";
151        $sql .= "left join STAFF on SESSION.user = STAFF.user ";
152        $sql .= "where SESSION.objid in (".$_objids.")";
153        $results = [];
154        $res = $conx->global->runsql(['SESSION', 'USER', 'STAFF'], $sql, $results);
155        if ($res) {
156            foreach ($results as &$result) {
157                $_session = $result['session'];
158                $_usersmap[$_session] = [
159                    'type' => 'OW',
160                    'name' => _get_username_sessionusers($result['alias'] ?? null, $result['firstname'] ?? null, $result['lastname'] ?? null),
161                ];
162                $_idx = array_search($_session, $_sessions);
163                if ($_idx !== false) {
164                    unset($_sessions[$_idx]);
165                }
166            }
167            unset($result);
168        } else {
169            $logger->error("OWNER sessions query failed.");
170            $retval = \ApplicationError::Database;
171        }
172    }
173
174    $result = [
175        "errorcode" => $retval,
176        "usernames" => \success($retval) ? $_usersmap : null,
177    ];
178    return ['output' => json_encode($result), 'contentType' => 'application/json; charset=utf-8'];
179};