diff --git a/cake4/rd_cake/setup/db/rd.sql b/cake4/rd_cake/setup/db/rd.sql index 3e8eff722..dc9deefc3 100644 --- a/cake4/rd_cake/setup/db/rd.sql +++ b/cake4/rd_cake/setup/db/rd.sql @@ -4334,7 +4334,7 @@ CREATE TABLE `radacct` ( `operator_name` varchar(32) NOT NULL DEFAULT '', PRIMARY KEY (`radacctid`), UNIQUE KEY `acctuniqueid` (`acctuniqueid`), - KEY `username` (`username`), + KEY `username_acctstarttime` (`username`, `acctstarttime`), KEY `framedipaddress` (`framedipaddress`), KEY `acctsessionid` (`acctsessionid`), KEY `acctsessiontime` (`acctsessiontime`), diff --git a/cake4/rd_cake/src/Controller/PermanentUsersController.php b/cake4/rd_cake/src/Controller/PermanentUsersController.php index 8741441c0..726553fa7 100644 --- a/cake4/rd_cake/src/Controller/PermanentUsersController.php +++ b/cake4/rd_cake/src/Controller/PermanentUsersController.php @@ -119,7 +119,46 @@ public function index(){ $total = $query->count(); $q_r = $query->all(); $items = []; - + + //Get more detail on the activity + $usernames = [0]; + foreach ($q_r as $user) { + $usernames[] = $user->username; + } + + $last_session_query = $this->{'Radaccts'}->find('all', [ + 'fields' => [ + 'username' => 'username', + 'last_acctstarttime' => 'max(acctstarttime)', + ], + 'group' => 'username' + ]); + + $last_session_query = $this->{'Radaccts'}->find() + ->join([ + 'last_session' => [ + 'table' => $last_session_query, + 'type' => 'inner', + 'conditions' => [ + 'last_session.username = Radaccts.username', + 'last_session.last_acctstarttime = Radaccts.acctstarttime' + ] + ] + ]) + ->where(['Radaccts.username IN' => $usernames]) + ->select([ + 'username' => 'Radaccts.username', + 'acctstarttime' => 'acctstarttime', + 'acctstoptime' => 'acctstoptime', + 'framedipaddress' => 'framedipaddress' + ]); + + $last_session_list = $last_session_query->toList(); + $last_session_dict = array(); + foreach ($last_session_list as $row) { + $last_session_dict[$row['username']] = $row; + } + foreach($q_r as $i){ $row = []; @@ -153,9 +192,8 @@ public function index(){ unset($row["token"]); //Get more detail on the activity - //select acctstarttime,acctstoptime,framedipaddress from radacct where username='ord9555@superfibre' order by acctstarttime DESC LIMIT 1; - $last_session = $this->{'Radaccts'}->find()->where(['username' => $i->username])->select(['acctstarttime','acctstoptime','framedipaddress'])->order('acctstarttime DESC')->first(); - if($last_session){ + if (array_key_exists($i->username, $last_session_dict)) { + $last_session = $last_session_dict[$i->username]; if(!$last_session->acctstoptime){ $row['last_seen']['status'] = 'online'; $row['last_seen']['span'] = $this->TimeCalculations->time_elapsed_string($last_session->acctstarttime,false,true); @@ -167,7 +205,7 @@ public function index(){ }else{ $row['last_seen'] = ['status' => 'never']; } - + $actions_enabled = true; if($right == 'view'){ $actions_enabled = false;