Yoda/src/Model/Database/Auth.php
2024-08-03 21:54:19 +03:00

142 lines
No EOL
2.8 KiB
PHP

<?php
declare(strict_types=1);
namespace Yggverse\Yoda\Model\Database;
use \Pdo;
class Auth
{
protected Pdo $_connection;
public function __construct(
Pdo $connection
) {
// Init parent connection
$this->_connection = $connection;
// Init database structure
$this->_connection->query('
CREATE TABLE IF NOT EXISTS `auth`
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`time` INTEGER NOT NULL,
`identity` INTEGER NOT NULL,
`request` VARCHAR(1024) NOT NULL
)
');
}
public function add(
int $identity,
string $request,
?int $time = null
): int
{
$query = $this->_connection->prepare(
'INSERT INTO `auth` (
`time`,
`identity`,
`request`
) VALUES (
:time,
:identity,
:request
)'
);
$query->execute(
[
':time' => $time ? $time : time(),
':identity' => $identity,
':request' => $request
]
);
return intval(
$this->_connection->lastInsertId()
);
}
public function delete(
int $id
): int
{
$query = $this->_connection->prepare(
'DELETE FROM `auth` WHERE `id` = :id'
);
$query->execute(
[
':id' => $id
]
);
return $query->rowCount();
}
public function get(
int $id
): ?object
{
$query = $this->_connection->prepare(
'SELECT * FROM `auth` WHERE `id` = :id'
);
$query->execute(
[
':id' => $id
]
);
if ($record = $query->fetch())
{
return $record;
}
return null;
}
public function like(
string $request = '',
int $limit = 1000,
int $start = 0
): array
{
$query = $this->_connection->prepare(
sprintf(
'SELECT * FROM `auth`
WHERE `request` LIKE :request
ORDER BY `request` ASC
LIMIT %d,%d',
$start,
$limit
)
);
$query->execute(
[
':request' => $request
]
);
return $query->fetchAll();
}
public function logout(
string $request
): int
{
$affected = 0;
foreach ($this->like($request) as $record)
{
$affected += $this->delete(
$record->id
);
}
return $affected;
}
}