Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
50.43% covered (warning)
50.43%
59 / 117
0.00% covered (danger)
0.00%
0 / 1
CRAP
n/a
0 / 0
_get_username_sessionusers
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
20
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        $sqlSession = "select SESSION.objid as session, SESSION.qrscan as qrscan from SESSION where SESSION.objid in (".$_objids.")";
92        $sessionRows = [];
93        $res = $conx->global->runsql(['SESSION'], $sqlSession, $sessionRows);
94        if ($res && count($sessionRows) > 0) {
95            $qrscanIds = array_unique(array_filter(array_column($sessionRows, 'qrscan')));
96            $nameByQrscan = [];
97            if (\success($retval) && count($qrscanIds) > 0 && $place !== null) {
98                $globalRows = [];
99                $res = $conx->global->query('QRSCAN', ['objid' => $qrscanIds, 'place' => (int) $place], $globalRows);
100                if ($res && count($globalRows) > 0) {
101                    foreach ($globalRows as $row) {
102                        $gObjid = (int) $row['objid'];
103                        $nameByQrscan[$gObjid] = !empty($row['alias']) ? $row['alias'] : (isset($row['number']) ? (string) $row['number'] : '');
104                    }
105                }
106            }
107            if (\success($retval)) {
108                foreach ($sessionRows as &$result) {
109                    $_session = $result['session'];
110                    $_usersmap[$_session] = [
111                        'type' => 'QR',
112                        'name' => isset($nameByQrscan[$result['qrscan']]) ? $nameByQrscan[$result['qrscan']] : '',
113                    ];
114                    $_idx = array_search($_session, $_sessions);
115                    if ($_idx !== false) {
116                        unset($_sessions[$_idx]);
117                    }
118                }
119                unset($result);
120            }
121        }
122    }
123
124    if (\success($retval) && count($_sessions) > 0) {
125        $_objids = implode(",", $_sessions);
126        $sql = "select SESSION.objid as session, ";
127        $sql .= "USER.firstname as firstname, USER.lastname as lastname, ";
128        $sql .= "STAFF.alias as alias ";
129        $sql .= "from SESSION ";
130        $sql .= "inner join STAFF on SESSION.user = STAFF.user ";
131        $sql .= "inner join USER on STAFF.user = USER.objid ";
132        $sql .= "where SESSION.objid in (".$_objids.")";
133        $results = [];
134        $res = $conx->global->runsql(['SESSION', 'USER', 'STAFF'], $sql, $results);
135        if ($res) {
136            foreach ($results as &$result) {
137                $_session = $result['session'];
138                $_usersmap[$_session] = [
139                    'type' => 'ST',
140                    'name' => _get_username_sessionusers($result['alias'] ?? null, $result['firstname'] ?? null, $result['lastname'] ?? null),
141                ];
142                $_idx = array_search($_session, $_sessions);
143                if ($_idx !== false) {
144                    unset($_sessions[$_idx]);
145                }
146            }
147            unset($result);
148        } else {
149            $logger->error("STAFF sessions query failed.");
150            $retval = \ApplicationError::Database;
151        }
152    }
153
154    if (\success($retval) && count($_sessions) > 0) {
155        $_objids = implode(",", $_sessions);
156        $sql = "select SESSION.objid as session, ";
157        $sql .= "USER.firstname as firstname, USER.lastname as lastname ";
158        $sql .= "from SESSION ";
159        $sql .= "inner join USER on USER.objid = SESSION.user ";
160        $sql .= "where SESSION.objid in (".$_objids.")";
161        $results = [];
162        $res = $conx->global->runsql(['SESSION', 'USER'], $sql, $results);
163        if ($res) {
164            foreach ($results as &$result) {
165                $_session = $result['session'];
166                $_usersmap[$_session] = [
167                    'type' => 'OW',
168                    'name' => _get_username_sessionusers(null, $result['firstname'] ?? null, $result['lastname'] ?? null),
169                ];
170                $_idx = array_search($_session, $_sessions);
171                if ($_idx !== false) {
172                    unset($_sessions[$_idx]);
173                }
174            }
175            unset($result);
176        } else {
177            $logger->error("OWNER sessions query failed.");
178            $retval = \ApplicationError::Database;
179        }
180    }
181
182    $result = [
183        "errorcode" => $retval,
184        "usernames" => \success($retval) ? $_usersmap : null,
185    ];
186    return ['output' => json_encode($result), 'contentType' => 'application/json; charset=utf-8'];
187};