2
0
Web/auth/providers/JsonUserProvider.php
2025-09-10 21:57:44 -05:00

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);
}
}