159 lines
4.6 KiB
PHP
159 lines
4.6 KiB
PHP
<?php
|
|
|
|
require_once "UserDAOInterface.php";
|
|
|
|
class LocalUserDAO implements UserDAOInterface {
|
|
|
|
private string $file = "data/users.json";
|
|
|
|
private function loadUsers() {
|
|
if (!file_exists($this->file)) {
|
|
return [];
|
|
}
|
|
|
|
$json = file_get_contents($this->file);
|
|
|
|
if ($json === false) {
|
|
throw new RuntimeException("Benutzerdaten konnten nicht gelesen werden.");
|
|
}
|
|
|
|
$users = json_decode($json, true);
|
|
|
|
if ($users === null && json_last_error() !== JSON_ERROR_NONE) {
|
|
throw new RuntimeException("Benutzerdaten sind fehlerhaft.");
|
|
}
|
|
|
|
return is_array($users) ? $users : [];
|
|
}
|
|
|
|
private function saveUsers($users) {
|
|
$result = file_put_contents(
|
|
$this->file,
|
|
json_encode($users, JSON_PRETTY_PRINT)
|
|
);
|
|
|
|
if ($result === false) {
|
|
throw new RuntimeException("Benutzerdaten konnten nicht gespeichert werden.");
|
|
}
|
|
}
|
|
|
|
private function validateEmail($email) {
|
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
throw new InvalidArgumentException("Ungültige E-Mail-Adresse.");
|
|
}
|
|
}
|
|
|
|
private function validateName($name, $fieldName) {
|
|
if (!preg_match("/^[a-zA-ZäöüÄÖÜß -]{2,50}$/", $name)) {
|
|
throw new InvalidArgumentException(
|
|
$fieldName . " darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."
|
|
);
|
|
}
|
|
}
|
|
|
|
private function validatePassword($password) {
|
|
if (empty($password)) {
|
|
throw new InvalidArgumentException("Passwort darf nicht leer sein.");
|
|
}
|
|
}
|
|
|
|
public function findUser($email) {
|
|
$this->validateEmail($email);
|
|
|
|
$users = $this->loadUsers();
|
|
|
|
foreach ($users as $user) {
|
|
if (isset($user["email"]) && $user["email"] === $email) {
|
|
|
|
if (!isset($user["vorname"]) && isset($user["username"])) {
|
|
$nameParts = explode(" ", $user["username"], 2);
|
|
$user["vorname"] = $nameParts[0] ?? "";
|
|
$user["nachname"] = $nameParts[1] ?? "";
|
|
}
|
|
|
|
return $user;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public function addUser($email, $vorname, $nachname, $password) {
|
|
$this->validateEmail($email);
|
|
$this->validateName($vorname, "Vorname");
|
|
$this->validateName($nachname, "Nachname");
|
|
$this->validatePassword($password);
|
|
|
|
$users = $this->loadUsers();
|
|
|
|
foreach ($users as $user) {
|
|
if (isset($user["email"]) && $user["email"] === $email) {
|
|
throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet.");
|
|
}
|
|
}
|
|
|
|
$users[] = [
|
|
"email" => $email,
|
|
"vorname" => $vorname,
|
|
"nachname" => $nachname,
|
|
"password" => $password
|
|
];
|
|
|
|
$this->saveUsers($users);
|
|
}
|
|
|
|
public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null) {
|
|
$this->validateEmail($oldEmail);
|
|
$this->validateEmail($newEmail);
|
|
$this->validateName($vorname, "Vorname");
|
|
$this->validateName($nachname, "Nachname");
|
|
|
|
$users = $this->loadUsers();
|
|
|
|
foreach ($users as $user) {
|
|
if (
|
|
isset($user["email"])
|
|
&& $user["email"] === $newEmail
|
|
&& $newEmail !== $oldEmail
|
|
) {
|
|
throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet.");
|
|
}
|
|
}
|
|
|
|
foreach ($users as $i => $user) {
|
|
if (isset($user["email"]) && $user["email"] === $oldEmail) {
|
|
$users[$i]["email"] = $newEmail;
|
|
$users[$i]["vorname"] = $vorname;
|
|
$users[$i]["nachname"] = $nachname;
|
|
|
|
unset($users[$i]["username"]);
|
|
|
|
if (!empty($password)) {
|
|
$users[$i]["password"] = password_hash($password, PASSWORD_DEFAULT);
|
|
}
|
|
|
|
$this->saveUsers($users);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function deleteUser($email) {
|
|
$this->validateEmail($email);
|
|
|
|
$users = $this->loadUsers();
|
|
|
|
foreach ($users as $i => $user) {
|
|
if (isset($user["email"]) && $user["email"] === $email) {
|
|
unset($users[$i]);
|
|
$users = array_values($users);
|
|
$this->saveUsers($users);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
} |