170 lines
4.2 KiB
PHP
170 lines
4.2 KiB
PHP
<?php
|
|
|
|
require_once __DIR__ . '/../UserProviderInterface.php';
|
|
require_once __DIR__ . '/../User.php';
|
|
|
|
/**
|
|
* JsonUserProvider stores users in a JSON file
|
|
*/
|
|
class JsonUserProvider implements UserProviderInterface
|
|
{
|
|
private string $filePath;
|
|
private array $users = [];
|
|
|
|
public function __construct(string $filePath)
|
|
{
|
|
$this->filePath = $filePath;
|
|
$this->loadUsers();
|
|
}
|
|
|
|
/**
|
|
* Load users from JSON file
|
|
*/
|
|
private function loadUsers(): void
|
|
{
|
|
if (!file_exists($this->filePath)) {
|
|
$this->users = [];
|
|
$this->saveUsers();
|
|
return;
|
|
}
|
|
|
|
$content = file_get_contents($this->filePath);
|
|
$data = json_decode($content, true) ?? [];
|
|
|
|
$this->users = [];
|
|
foreach ($data as $userData) {
|
|
$this->users[$userData['id']] = new User($userData);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Save users to JSON file
|
|
*/
|
|
private function saveUsers(): void
|
|
{
|
|
$data = [];
|
|
foreach ($this->users as $user) {
|
|
$userData = [
|
|
'id' => $user->id,
|
|
'username' => $user->username,
|
|
'email' => $user->email,
|
|
'password' => $user->password,
|
|
'remember_token' => $user->rememberToken,
|
|
'created_at' => $user->createdAt,
|
|
'updated_at' => $user->updatedAt,
|
|
] + $user->attributes;
|
|
$data[] = $userData;
|
|
}
|
|
|
|
file_put_contents($this->filePath, json_encode($data, JSON_PRETTY_PRINT));
|
|
}
|
|
|
|
/**
|
|
* Generate next user ID
|
|
*/
|
|
private function generateId(): int
|
|
{
|
|
if (empty($this->users)) {
|
|
return 1;
|
|
}
|
|
return max(array_keys($this->users)) + 1;
|
|
}
|
|
|
|
public function findById(int|string $id): ?User
|
|
{
|
|
return $this->users[$id] ?? null;
|
|
}
|
|
|
|
public function findByEmail(string $email): ?User
|
|
{
|
|
foreach ($this->users as $user) {
|
|
if ($user->email === $email) {
|
|
return $user;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function findByUsername(string $username): ?User
|
|
{
|
|
foreach ($this->users as $user) {
|
|
if ($user->username === $username) {
|
|
return $user;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function findByCredentials(string $identifier): ?User
|
|
{
|
|
// Check if identifier is email
|
|
if (filter_var($identifier, FILTER_VALIDATE_EMAIL)) {
|
|
return $this->findByEmail($identifier);
|
|
}
|
|
|
|
// Otherwise treat as username
|
|
return $this->findByUsername($identifier);
|
|
}
|
|
|
|
public function findByRememberToken(string $token): ?User
|
|
{
|
|
foreach ($this->users as $user) {
|
|
if ($user->rememberToken === $token) {
|
|
return $user;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function create(array $data): User
|
|
{
|
|
$data['id'] = $data['id'] ?? $this->generateId();
|
|
$data['created_at'] = $data['created_at'] ?? date('Y-m-d H:i:s');
|
|
$data['updated_at'] = $data['updated_at'] ?? date('Y-m-d H:i:s');
|
|
|
|
$user = new User($data);
|
|
$this->users[$user->id] = $user;
|
|
$this->saveUsers();
|
|
|
|
return $user;
|
|
}
|
|
|
|
public function update(User $user, array $data): bool
|
|
{
|
|
if (!isset($this->users[$user->id])) {
|
|
return false;
|
|
}
|
|
|
|
foreach ($data as $key => $value) {
|
|
if (property_exists($user, $key)) {
|
|
$user->$key = $value;
|
|
} else {
|
|
$user->attributes[$key] = $value;
|
|
}
|
|
}
|
|
|
|
$user->updatedAt = date('Y-m-d H:i:s');
|
|
$this->users[$user->id] = $user;
|
|
$this->saveUsers();
|
|
|
|
return true;
|
|
}
|
|
|
|
public function updateRememberToken(User $user, ?string $token): bool
|
|
{
|
|
if (!isset($this->users[$user->id])) {
|
|
return false;
|
|
}
|
|
|
|
$user->rememberToken = $token;
|
|
$this->users[$user->id] = $user;
|
|
$this->saveUsers();
|
|
|
|
return true;
|
|
}
|
|
|
|
public function verifyPassword(User $user, string $password): bool
|
|
{
|
|
return password_verify($password, $user->password);
|
|
}
|
|
} |