2020namespace phpMyFAQ \Administration ;
2121
2222use phpMyFAQ \Configuration ;
23- use phpMyFAQ \Database ;
2423use stdClass ;
2524use Symfony \Component \HttpFoundation \Request ;
2625use Throwable ;
2726
2827readonly class Session
2928{
29+ private SessionRepository $ repository ;
30+
3031 public function __construct (
3132 private Configuration $ configuration ,
3233 ) {
34+ $ this ->repository = new SessionRepository ($ configuration );
3335 }
3436
3537 /**
@@ -42,23 +44,9 @@ public function getNumberOfOnlineUsers(int $windowSeconds = 600): int
4244 try {
4345 $ minTimestamp = (int ) Request::createFromGlobals ()->server ->get ('REQUEST_TIME ' ) - $ windowSeconds ;
4446 if ($ this ->configuration ->get (item: 'main.enableUserTracking ' )) {
45- $ query = sprintf (
46- 'SELECT COUNT(DISTINCT user_id) AS cnt FROM %sfaqsessions WHERE time >= %d AND user_id > 0 ' ,
47- Database::getTablePrefix (),
48- $ minTimestamp - (PMF_AUTH_TIMEOUT * 60 ),
49- );
47+ $ count = $ this ->repository ->countOnlineUsersFromSessions ($ minTimestamp - (PMF_AUTH_TIMEOUT * 60 ));
5048 } else {
51- $ query = sprintf (
52- 'SELECT COUNT(*) AS cnt FROM %sfaquser WHERE session_id IS NOT NULL AND session_timestamp >= %d AND success = 1 ' ,
53- Database::getTablePrefix (),
54- $ minTimestamp ,
55- );
56- }
57-
58- $ result = $ this ->configuration ->getDb ()->query ($ query );
59- if ($ result ) {
60- $ row = $ this ->configuration ->getDb ()->fetchObject ($ result );
61- $ count = isset ($ row ->cnt ) ? (int ) $ row ->cnt : 0 ;
49+ $ count = $ this ->repository ->countOnlineUsersFromFaqUser ($ minTimestamp );
6250 }
6351 } catch (Throwable ) {
6452 $ count = 0 ;
@@ -69,18 +57,7 @@ public function getNumberOfOnlineUsers(int $windowSeconds = 600): int
6957
7058 public function getTimeFromSessionId (int $ sessionId ): int
7159 {
72- $ timestamp = 0 ;
73-
74- $ query = sprintf ('SELECT time FROM %sfaqsessions WHERE sid = %d ' , Database::getTablePrefix (), $ sessionId );
75-
76- $ result = $ this ->configuration ->getDb ()->query ($ query );
77-
78- if ($ result ) {
79- $ res = $ this ->configuration ->getDb ()->fetchObject ($ result );
80- $ timestamp = (int ) $ res ->time ;
81- }
82-
83- return $ timestamp ;
60+ return $ this ->repository ->getTimeBySessionId ($ sessionId );
8461 }
8562
8663 /**
@@ -94,16 +71,9 @@ public function getTimeFromSessionId(int $sessionId): int
9471 public function getSessionsByDate (int $ firstHour , int $ lastHour ): array
9572 {
9673 $ sessions = [];
74+ $ rows = $ this ->repository ->getSessionsByDateRange ($ firstHour , $ lastHour );
9775
98- $ query = sprintf (
99- 'SELECT sid, ip, time FROM %sfaqsessions WHERE time > %d AND time < %d ORDER BY time ' ,
100- Database::getTablePrefix (),
101- $ firstHour ,
102- $ lastHour ,
103- );
104-
105- $ result = $ this ->configuration ->getDb ()->query ($ query );
106- while ($ row = $ this ->configuration ->getDb ()->fetchObject ($ result )) {
76+ foreach ($ rows as $ row ) {
10777 $ sessions [$ row ->sid ] = [
10878 'ip ' => $ row ->ip ,
10979 'time ' => $ row ->time ,
@@ -118,17 +88,7 @@ public function getSessionsByDate(int $firstHour, int $lastHour): array
11888 */
11989 public function getNumberOfSessions (): int
12090 {
121- $ num = 0 ;
122-
123- $ query = sprintf ('SELECT COUNT(sid) as num_sessions FROM %sfaqsessions ' , Database::getTablePrefix ());
124-
125- $ result = $ this ->configuration ->getDb ()->query ($ query );
126- if ($ result ) {
127- $ row = $ this ->configuration ->getDb ()->fetchObject ($ result );
128- $ num = (int ) $ row ->num_sessions ;
129- }
130-
131- return $ num ;
91+ return $ this ->repository ->countTotalSessions ();
13292 }
13393
13494 /**
@@ -139,24 +99,15 @@ public function getNumberOfSessions(): int
13999 */
140100 public function deleteSessions (int $ first , int $ last ): bool
141101 {
142- $ query = sprintf (
143- 'DELETE FROM %sfaqsessions WHERE time >= %d AND time <= %d ' ,
144- Database::getTablePrefix (),
145- $ first ,
146- $ last ,
147- );
148-
149- return (bool ) $ this ->configuration ->getDb ()->query ($ query );
102+ return $ this ->repository ->deleteSessionsByTimeRange ($ first , $ last );
150103 }
151104
152105 /**
153106 * Deletes all entries in the table.
154107 */
155108 public function deleteAllSessions (): bool
156109 {
157- $ query = sprintf ('DELETE FROM %sfaqsessions ' , Database::getTablePrefix ());
158-
159- return (bool ) $ this ->configuration ->getDb ()->query ($ query );
110+ return $ this ->repository ->deleteAllSessions ();
160111 }
161112
162113 /**
@@ -167,21 +118,10 @@ public function deleteAllSessions(): bool
167118 public function getLast30DaysVisits (int $ endDate ): array
168119 {
169120 $ stats = [];
170- $ visits = [];
171121 $ completeData = [];
172122 $ startDate = strtotime (datetime: '-1 month ' );
173123
174- $ query = sprintf (
175- 'SELECT time FROM %sfaqsessions WHERE time > %d AND time < %d; ' ,
176- Database::getTablePrefix (),
177- $ startDate ,
178- $ endDate ,
179- );
180- $ result = $ this ->configuration ->getDb ()->query ($ query );
181-
182- while ($ row = $ this ->configuration ->getDb ()->fetchObject ($ result )) {
183- $ visits [] = $ row ->time ;
184- }
124+ $ visits = $ this ->repository ->getSessionTimestamps ($ startDate , $ endDate );
185125
186126 for ($ date = $ startDate ; $ date <= $ endDate ; $ date += 86400 ) {
187127 $ stats [date (
@@ -195,7 +135,7 @@ public function getLast30DaysVisits(int $endDate): array
195135 !isset (
196136 $ stats [date (
197137 format: 'Y-m-d ' ,
198- timestamp: ( int ) $ visitDate ,
138+ timestamp: $ visitDate ,
199139 )],
200140 )
201141 ) {
@@ -204,7 +144,7 @@ public function getLast30DaysVisits(int $endDate): array
204144
205145 ++$ stats [date (
206146 format: 'Y-m-d ' ,
207- timestamp: ( int ) $ visitDate ,
147+ timestamp: $ visitDate ,
208148 )];
209149 }
210150
0 commit comments