mirror of
https://github.com/ceratic/MediaCollectorLibary.git
synced 2026-05-13 23:56:46 +02:00
first commit
This commit is contained in:
92
app/Models/User.php
Normal file
92
app/Models/User.php
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user