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