first commit

This commit is contained in:
Lars Behrends
2025-10-17 13:29:28 +02:00
commit 929ee43001
85 changed files with 10361 additions and 0 deletions

92
app/Models/User.php Normal file
View File

@@ -0,0 +1,92 @@
<?php
namespace App\Models;
class User extends Model
{
protected string $table = 'users';
protected array $fillable = [
'username',
'email',
'password',
'role',
'is_active',
'last_login_at',
'login_ip'
];
protected array $hidden = [
'password',
'remember_token'
];
protected array $casts = [
'is_active' => 'bool',
'last_login_at' => 'datetime'
];
public function setPassword(string $password): void
{
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
public function verifyPassword(string $password): bool
{
return password_verify($password, $this->password);
}
public function isAdmin(): bool
{
return $this->role === 'admin';
}
public function updateLastLogin(string $ip = null): bool
{
return $this->update($this->id, [
'last_login_at' => date('Y-m-d H:i:s'),
'login_ip' => $ip
]);
}
public static function findByUsername(\PDO $pdo, string $username): ?array
{
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND is_active = 1");
$stmt->execute(['username' => $username]);
return $stmt->fetch(\PDO::FETCH_ASSOC) ?: null;
}
public static function findByEmail(\PDO $pdo, string $email): ?array
{
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email AND is_active = 1");
$stmt->execute(['email' => $email]);
return $stmt->fetch(\PDO::FETCH_ASSOC) ?: null;
}
public static function createAdmin(\PDO $pdo, string $username, string $email, string $password): int
{
$data = [
'username' => $username,
'email' => $email,
'role' => 'admin',
'is_active' => true
];
$userModel = new self($pdo);
$userModel->setPassword($password);
$data['password'] = $userModel->password;
return $userModel->create($data);
}
public static function getStats(\PDO $pdo): array
{
$stmt = $pdo->query("
SELECT
COUNT(*) as total_users,
COUNT(CASE WHEN role = 'admin' THEN 1 END) as admin_users,
COUNT(CASE WHEN last_login_at IS NOT NULL THEN 1 END) as active_users
FROM users
");
return $stmt->fetch(\PDO::FETCH_ASSOC);
}
}