Files
bp/app/Models/UserModel.php
T

124 lines
3.4 KiB
PHP

<?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();
}
}