Current directory: /home/klas4s23/domains/585455.klas4s23.mid-ica.nl/public_html/Gastenboek/uploads
<?php
class User {
private $id;
private $username;
private $email;
private $role;
private $party_id;
private $created_at;
public function __construct(array $data = []) {
if (!empty($data)) {
$this->id = $data['id'] ?? null;
$this->username = $data['username'] ?? '';
$this->email = $data['email'] ?? '';
$this->role = $data['role'] ?? 'party';
$this->party_id = $data['party_id'] ?? null;
$this->created_at = $data['created_at'] ?? null;
}
}
// Getters
public function getId(): ?int { return $this->id; }
public function getUsername(): string { return $this->username; }
public function getEmail(): ?string { return $this->email; }
public function getRole(): string { return $this->role; }
public function getPartyId(): ?int { return $this->party_id; }
public function getCreatedAt(): ?string { return $this->created_at; }
// Authentication methods
public static function login(string $usernameOrEmail, string $password): ?self {
$pdo = Database::getInstance()->getConnection();
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :u OR email = :u LIMIT 1");
$stmt->execute([':u' => $usernameOrEmail]);
$userData = $stmt->fetch();
if ($userData && password_verify($password, $userData['password_hash'])) {
Session::start();
$_SESSION['user_id'] = (int)$userData['id'];
$_SESSION['role'] = $userData['role'];
$_SESSION['party_id'] = $userData['party_id'];
return new self($userData);
}
return null;
}
public static function getCurrent(): ?self {
Session::start();
if (empty($_SESSION['user_id'])) {
return null;
}
$pdo = Database::getInstance()->getConnection();
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => $_SESSION['user_id']]);
$userData = $stmt->fetch();
return $userData ? new self($userData) : null;
}
public function logout(): void {
Session::destroy();
}
public static function ensureDefaultAdmin(): void {
$pdo = Database::getInstance()->getConnection();
$stmt = $pdo->prepare("SELECT id FROM users WHERE username = 'admin' LIMIT 1");
$stmt->execute();
if (!$stmt->fetch()) {
$hash = password_hash('admin', PASSWORD_DEFAULT);
$pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES ('admin', :hash, 'superadmin')")
->execute([':hash' => $hash]);
}
}
// CRUD operations
public static function find(int $id): ?self {
$pdo = Database::getInstance()->getConnection();
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => $id]);
$data = $stmt->fetch();
return $data ? new self($data) : null;
}
public static function getAll(): array {
$pdo = Database::getInstance()->getConnection();
$stmt = $pdo->query("SELECT u.*, p.name AS party_name FROM users u LEFT JOIN parties p ON p.id = u.party_id ORDER BY u.id DESC");
$users = [];
while ($data = $stmt->fetch()) {
$users[] = new self($data);
}
return $users;
}
public function save(): bool {
$pdo = Database::getInstance()->getConnection();
if ($this->id) {
$stmt = $pdo->prepare("
UPDATE users SET
username = :username, email = :email, role = :role, party_id = :party_id
WHERE id = :id
");
return $stmt->execute([
':username' => $this->username,
':email' => $this->email,
':role' => $this->role,
':party_id' => $this->party_id,
':id' => $this->id
]);
} else {
throw new Exception("Use create method for new users");
}
}
public static function create(array $data): bool {
$pdo = Database::getInstance()->getConnection();
$hash = password_hash($data['password'], PASSWORD_DEFAULT);
$stmt = $pdo->prepare("
INSERT INTO users (username, email, password_hash, role, party_id)
VALUES (:username, :email, :password_hash, :role, :party_id)
");
return $stmt->execute([
':username' => $data['username'],
':email' => $data['email'],
':password_hash' => $hash,
':role' => $data['role'],
':party_id' => $data['party_id'] ?: null
]);
}
public function delete(): bool {
if (!$this->id) return false;
$pdo = Database::getInstance()->getConnection();
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
return $stmt->execute([':id' => $this->id]);
}
public function updatePassword(string $password): bool {
if (!$this->id) return false;
$pdo = Database::getInstance()->getConnection();
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("UPDATE users SET password_hash = :hash WHERE id = :id");
return $stmt->execute([':hash' => $hash, ':id' => $this->id]);
}
}