forked from GravitLauncher/HttpMethodExample
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUserSession.php
More file actions
135 lines (121 loc) · 5.43 KB
/
UserSession.php
File metadata and controls
135 lines (121 loc) · 5.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
namespace Gravita\Http;
use Gravita\Http\Config\Config;
use Gravita\Http\Database;
use Gravita\Http\Utils;
use \PDO;
class UserSession
{
public $user;
public function __construct(
public $id = null,
public $user_id = null,
public $access_token = null,
public $refresh_token = null,
public $server_id = null,
public $expire_in = null
) {
}
public function to_response()
{
return [
"id" => $this->id,
"user_id" => $this->user_id,
"access_token" => $this->access_token,
"refresh_token" => $this->refresh_token,
"server_id" => $this->server_id,
"expire_in" => $this->expire_in - time()
];
}
public function refresh(Database $db)
{
$stmt = $db->getPDO()->prepare("UPDATE user_sessions SET access_token=:access_token, refresh_token=:refresh_token, expire_in=:expire_in WHERE id=:id");
$stmt->execute([
'id' => $this->id,
'access_token' => $this->access_token = Utils::generate_token(),
'refresh_token' => $this->refresh_token = Utils::generate_token(),
'expire_in' => $this->expire_in = time() + Config::$sessionExpireSeconds
]);
}
public function update_server_id(Database $db, $server_id)
{
$this->server_id = $server_id;
$stmt = $db->getPDO()->prepare("UPDATE user_sessions SET server_id=:server_id WHERE id=:id");
$stmt->execute([
'id' => $this->id,
'server_id' => $this->server_id
]);
}
public static function create_for_user(Database $db, $user_id): UserSession
{
$session = new UserSession(null, $user_id, Utils::generate_token(), Utils::generate_token(), null, date("c", time() + Config::$sessionExpireSeconds));
$stmt = $db->getPDO()->prepare(
"INSERT INTO user_sessions (user_id,access_token,refresh_token,expire_in)
VALUES (:user_id, :access_token, :refresh_token, :expire_in)"
);
$stmt->execute([
'user_id' => $user_id,
'access_token' => $session->access_token,
'refresh_token' => $session->refresh_token,
'expire_in' => $session->expire_in
]);
$session->id = $db->getPDO()->lastInsertId();
$session->expire_in = (int) date("U", strtotime($session->expire_in));
return $session;
}
public static function get_by_id(Database $db, $id): UserSession|null
{
$stmt = $db->getPDO()->prepare("SELECT * FROM user_sessions WHERE id=:id");
$stmt->execute(['id' => $id]);
return UserSession::read_from_row($stmt->fetch(PDO::FETCH_ASSOC));
}
public static function get_by_access_token_with_user(Database $db, $access_token): UserSession|null
{
$stmt = $db->getPDO()->prepare("SELECT user_sessions.id as session_id, users.id as id, username, uuid, access_token, refresh_token, server_id, expire_in, user_id, password FROM user_sessions JOIN users ON user_sessions.user_id=users.id WHERE access_token=:access_token");
$stmt->execute(['access_token' => $access_token]);
return UserSession::read_from_row($stmt->fetch(PDO::FETCH_ASSOC), true);
}
public static function get_by_refresh_token(Database $db, $refresh_token): UserSession|null
{
$stmt = $db->getPDO()->prepare("SELECT * FROM user_sessions WHERE refresh_token=:refresh_token");
$stmt->execute(['refresh_token' => $refresh_token]);
return UserSession::read_from_row($stmt->fetch(PDO::FETCH_ASSOC));
}
public static function get_by_server_id_and_username(Database $db, $username, $server_id): UserSession|null
{
$stmt = $db->getPDO()->prepare(
"SELECT user_sessions.id as session_id, users.id as id, username, uuid, access_token, refresh_token, server_id, expire_in, user_id, password
FROM user_sessions JOIN users ON user_sessions.user_id = users.id
WHERE server_id=:server_id AND users.username=:username");
$stmt->execute(['server_id' => $server_id, 'username' => $username]);
return UserSession::read_from_row($stmt->fetch(PDO::FETCH_ASSOC), true);
}
public static function get_by_server_id_and_uuid(Database $db, $uuid, $server_id): UserSession|null
{
$stmt = $db->getPDO()->prepare(
"SELECT user_sessions.id as session_id, users.id as id, username, uuid, access_token, refresh_token, server_id, expire_in, user_id, password
FROM user_sessions
JOIN users ON user_sessions.user_id = users.id
WHERE server_id=:server_id AND users.uuid=:uuid"
);
$stmt->execute(['server_id' => $server_id, 'uuid' => $uuid]);
return UserSession::read_from_row($stmt->fetch(PDO::FETCH_ASSOC), true);
}
public static function read_from_row($row, bool $enableUser = false): UserSession|null
{
if (!$row) {
return null;
}
$session = new UserSession();
$session->id = $enableUser ? $row['session_id'] : $row['id'];
$session->user_id = $row['user_id'];
$session->access_token = $row['access_token'];
$session->refresh_token = $row['refresh_token'];
$session->server_id = $row['server_id'];
$session->expire_in = (int)date("U", strtotime($row['expire_in']));
if ($enableUser) {
$session->user = User::read_from_row($row);
}
return $session;
}
}