/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/Models/User.php
232 строки
6 KB
vivanenko
tg register
29 май 2025, 19:11
29 май 2025, 19:11
94c4ab4
Код
Авторство
О чём код?
<?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; use Spatie\Permission\Traits\HasRoles; use DateTime; /** * @property string $name The user's display name * @property string $email The user's email address * @property string $password The hashed password * @property string|null $telegram_id The user's Telegram ID * @property string|null $telegram_username The user's Telegram username * @property bool $is_telegram_verified Whether the Telegram account is verified * @property DateTime|null $email_verified_at When the email was verified * @property string|null $remember_token The "remember me" token * @property DateTime $created_at When the user was created * @property DateTime $updated_at When the user was last updated */ class User extends Authenticatable { /** @use HasFactory<\Database\Factories\UserFactory> */ use HasApiTokens, HasFactory, Notifiable, HasRoles; /** * The attributes that are mass assignable. * * @var list<string> */ protected $fillable = [ 'name', 'email', 'password', 'telegram_id', 'telegram_username', 'telegram_data', 'is_telegram_verified', 'last_login', 'remember_token', ]; /** * The attributes that should be hidden for serialization. * * @var list<string> */ protected $hidden = [ 'password', 'remember_token', ]; /** * Get the attributes that should be cast. * * @return array<string, string> */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', 'is_telegram_verified' => 'boolean', 'telegram_data' => 'array', 'last_login' => 'datetime', ]; } protected $appends = [ 'roles_list' ]; public function getRolesListAttribute(): array { return $this->roles->pluck('name')->toArray(); } public function subscriptions(): HasMany { return $this->hasMany(UserTariffSubscription::class); } public function purchases(): HasMany { return $this->hasMany(Purchase::class); } public function runningTapalks(): HasManyThrough { return $this->hasManyThrough( RunningTapalk::class, UserTariffSubscription::class ); } public function taps(): HasMany { return $this->hasMany(Tap::class); } public function hasActiveSubscription(): bool { return $this->subscriptions() ->where('expires_at', '>', now()) ->exists(); } public function getActiveSubscription(): ?UserTariffSubscription { return $this->subscriptions() ->where('expires_at', '>', now()) ->orderBy('expires_at', 'desc') ->first(); } public function hasTelegram(): bool { return !empty($this->telegram_id) && $this->is_telegram_verified; } public function hasVerifiedEmail(): bool { return !is_null($this->email_verified_at); } public function markEmailAsVerified(): bool { return $this->forceFill([ 'email_verified_at' => $this->freshTimestamp(), ])->save(); } public function linkTelegram(string $telegramId, string $username): void { if (!preg_match('/^[a-zA-Z0-9_]{5,32}$/', $username)) { throw new \InvalidArgumentException('Invalid Telegram username format'); } $this->update([ 'telegram_id' => $telegramId, 'telegram_username' => $username, 'is_telegram_verified' => true, ]); } public function unlinkTelegram(): void { $this->update([ 'telegram_id' => null, 'telegram_username' => null, 'is_telegram_verified' => false, ]); } public function getName(): string { return $this->name; } public function getEmail(): string { return $this->email; } public function getTelegramId(): ?string { return $this->telegram_id; } public function getTelegramUsername(): ?string { return $this->telegram_username; } public function getIsTelegramVerified(): bool { return $this->is_telegram_verified; } public function getEmailVerifiedAt(): ?DateTime { return $this->email_verified_at; } public function setName(string $name): self { $this->name = $name; return $this; } public function setEmail(string $email): self { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new \InvalidArgumentException('Invalid email format'); } $this->email = $email; return $this; } public function setPassword(string $password): self { $this->password = $password; return $this; } public function setTelegramId(?string $telegramId): self { $this->telegram_id = $telegramId; return $this; } public function setTelegramUsername(?string $username): self { if ($username !== null && !preg_match('/^[a-zA-Z0-9_]{5,32}$/', $username)) { throw new \InvalidArgumentException('Invalid Telegram username format'); } $this->telegram_username = $username; return $this; } public function setIsTelegramVerified(bool $isVerified): self { $this->is_telegram_verified = $isVerified; return $this; } }