bp/app/Models/UserModel.php

124 lines
3.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Models;
use CodeIgniter\Model;
use App\Models\Traits\TenantScopedModel;
class UserModel extends Model
{
use TenantScopedModel;
protected $table = 'users';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $protectFields = true;
protected $allowedFields = [
'email',
'password',
'name',
'phone',
'avatar',
// Поля для верификации email
'verification_token',
'email_verified',
'verified_at',
// Поля для восстановления пароля
'reset_token',
'reset_expires_at',
//системная роль
'system_role',
'status',
];
// Dates
protected $useTimestamps = true;
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
// Хеширование пароля перед вставкой
protected $beforeInsert = ['hashPassword'];
protected $beforeUpdate = ['hashPassword'];
protected function hashPassword(array $data)
{
if (isset($data['data']['password'])) {
$data['data']['password'] = password_hash($data['data']['password'], PASSWORD_DEFAULT);
}
return $data;
}
/**
* Генерация токена для сброса пароля
*
* @param int $userId ID пользователя
* @param int $expiresInHours Срок действия токена в часах (по умолчанию 24 часа)
* @return string Сгенерированный токен
*/
public function generateResetToken(int $userId, int $expiresInHours = 24): string
{
$token = bin2hex(random_bytes(32));
$expiresAt = date('Y-m-d H:i:s', strtotime("+{$expiresInHours} hours"));
$this->update($userId, [
'reset_token' => $token,
'reset_expires_at' => $expiresAt,
]);
return $token;
}
/**
* Проверка токена сброса пароля
*
* @param string $token Токен сброса
* @return array|null Данные пользователя или null если токен недействителен
*/
public function verifyResetToken(string $token): ?array
{
$user = $this->where('reset_token', $token)->first();
if (!$user) {
return null;
}
// Проверяем срок действия токена
if (empty($user['reset_expires_at'])) {
return null;
}
if (strtotime($user['reset_expires_at']) < time()) {
return null;
}
return $user;
}
/**
* Очистка токена сброса пароля
*
* @param int $userId ID пользователя
* @return bool
*/
public function clearResetToken(int $userId): bool
{
return $this->update($userId, [
'reset_token' => null,
'reset_expires_at' => null,
]);
}
/**
* Поиск пользователя по email
*
* @param string $email Email адрес
* @return array|null
*/
public function findByEmail(string $email): ?array
{
return $this->where('email', $email)->first();
}
}