From 1f031e128433bd4cf02fc764d71428be2df3e967 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Thu, 26 Mar 2026 22:54:34 +0100 Subject: [PATCH] Update controllers and models --- app/Console/Commands/InstallNntmux.php | 2 +- .../Controllers/Admin/AdminUserController.php | 24 ++-- .../Auth/ForgotPasswordController.php | 2 +- app/Http/Controllers/Auth/LoginController.php | 2 +- .../Controllers/Auth/RegisterController.php | 4 +- .../Auth/ResetPasswordController.php | 2 +- app/Http/Controllers/ContentController.php | 4 +- .../Controllers/FailedReleasesController.php | 2 +- app/Http/Controllers/GetNzbController.php | 2 +- app/Http/Controllers/ProfileController.php | 2 +- app/Http/Controllers/RssController.php | 2 +- app/Models/Content.php | 20 ++-- app/Models/User.php | 106 ++---------------- 13 files changed, 45 insertions(+), 129 deletions(-) diff --git a/app/Console/Commands/InstallNntmux.php b/app/Console/Commands/InstallNntmux.php index 28cb53d61..4ba819b7e 100644 --- a/app/Console/Commands/InstallNntmux.php +++ b/app/Console/Commands/InstallNntmux.php @@ -265,7 +265,7 @@ class InstallNntmux extends Command $this->info('Adding admin user to database'); try { User::add(config('nntmux.admin_username'), config('nntmux.admin_password'), config('nntmux.admin_email'), 2); - User::where('username', config('nntmux.admin_username'))->update(['verified' => 1, 'email_verified_at' => now()]); + User::where('username', config('nntmux.admin_username'))->first()?->markEmailAsVerified(); } catch (\Throwable $e) { echo $e->getMessage(); $this->error('Unable to add admin user!'); diff --git a/app/Http/Controllers/Admin/AdminUserController.php b/app/Http/Controllers/Admin/AdminUserController.php index 53132a516..1b856cb3a 100644 --- a/app/Http/Controllers/Admin/AdminUserController.php +++ b/app/Http/Controllers/Admin/AdminUserController.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace App\Http\Controllers\Admin; +use App\Enums\SignupError; +use App\Enums\UserRole; use App\Http\Controllers\BasePageController; use App\Models\Invitation; use App\Models\User; @@ -98,7 +100,7 @@ class AdminUserController extends BasePageController 'username' => '', 'email' => '', 'password' => '', - 'role' => User::ROLE_USER, + 'role' => UserRole::USER->value, 'notes' => '', 'rate_limit' => 60, ]; @@ -248,11 +250,11 @@ class AdminUserController extends BasePageController } $error = match ($ret) { - User::ERR_SIGNUP_BADUNAME => 'Bad username. Try a better one.', - User::ERR_SIGNUP_BADPASS => 'Bad password. Try a longer one.', - User::ERR_SIGNUP_BADEMAIL => 'Bad email.', - User::ERR_SIGNUP_UNAMEINUSE => 'Username in use.', - User::ERR_SIGNUP_EMAILINUSE => 'Email in use.', + SignupError::BAD_USERNAME->value => 'Bad username. Try a better one.', + SignupError::BAD_PASSWORD->value => 'Bad password. Try a longer one.', + SignupError::BAD_EMAIL->value => 'Bad email.', + SignupError::USERNAME_IN_USE->value => 'Username in use.', + SignupError::EMAIL_IN_USE->value => 'Email in use.', default => 'Unknown save error.', }; $user += [ @@ -341,11 +343,11 @@ class AdminUserController extends BasePageController { if ($request->has('id')) { $user = User::find($request->input('id')); - User::query()->where('id', $request->input('id'))->update([ - 'verified' => 1, - 'email_verified_at' => now(), - 'verification_token' => null, - ]); + if ($user === null) { + return redirect()->back()->with('error', 'User is invalid'); + } + + $user->markEmailAsVerified(); return redirect()->back()->with('success', 'Email verification for '.$user->username.' completed'); } diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index e46412d7f..16a215463 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -68,7 +68,7 @@ class ForgotPasswordController extends Controller } // Check users exists and send an email - $ret = ! empty($rssToken) ? User::getByRssToken($rssToken) : User::getByEmail($email); + $ret = ! empty($rssToken) ? User::findByRssToken($rssToken) : User::findByEmail($email); if ($ret === null) { return redirect() ->route('forgottenpassword') diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index ce7de4598..e4002c478 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -103,7 +103,7 @@ class LoginController extends Controller $rememberMe = $request->has('rememberme') && $request->input('rememberme') === 'on'; - if (! $user->isVerified() || $user->isPendingVerification()) { + if (! $user->hasVerifiedEmail()) { $request->session()->flash('warning', 'You have not verified your email address!'); return redirect()->to('login'); diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 8b029aadf..f36e70b7b 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Http\Controllers\Auth; +use App\Enums\UserRole; use App\Http\Controllers\Controller; use App\Http\Requests\Auth\RegisterRegisterRequest; use App\Models\Invitation; @@ -69,7 +70,6 @@ class RegisterController extends Controller 'api_token' => md5(Str::random(40)), 'verified' => false, 'email_verified_at' => null, - 'verification_token' => null, ]); $role = Role::query()->where('id', '=', $data['roles_id'])->first(); @@ -163,7 +163,7 @@ class RegisterController extends Controller 'password' => $password, 'email' => $email, 'host' => $request->ip(), - 'roles_id' => $userDefault !== null ? $userDefault['id'] : User::ROLE_USER, + 'roles_id' => $userDefault !== null ? $userDefault['id'] : UserRole::USER->value, 'notes' => '', 'defaultinvites' => $userDefault !== null ? $userDefault['defaultinvites'] : Invitation::DEFAULT_INVITES, ]; diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index 625dd9d65..0653f6f2d 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -38,7 +38,7 @@ class ResetPasswordController extends Controller return redirect()->route('password.request')->with('error', 'No reset code provided.'); } - $user = User::getByPassResetGuid($request->input('guid')); + $user = User::findByResetGuid($request->input('guid')); if ($user === null) { return redirect()->route('password.request')->with('error', 'Bad reset code provided.'); } diff --git a/app/Http/Controllers/ContentController.php b/app/Http/Controllers/ContentController.php index 28a00b1a7..a5bb65df9 100644 --- a/app/Http/Controllers/ContentController.php +++ b/app/Http/Controllers/ContentController.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace App\Http\Controllers; +use App\Enums\UserRole; use App\Models\Content; -use App\Models\User; use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -36,7 +36,7 @@ class ContentController extends BasePageController * * Admins and mods should be the only ones to see admin content. */ - $isAdmin = \in_array($role, [User::ROLE_ADMIN, User::ROLE_MODERATOR], true); + $isAdmin = \in_array($role, [UserRole::ADMIN->value, UserRole::MODERATOR->value], true); $contentId = $request->input('id', 0); $contentPage = $request->input('page', false); diff --git a/app/Http/Controllers/FailedReleasesController.php b/app/Http/Controllers/FailedReleasesController.php index 55515188b..e5ada9a1c 100644 --- a/app/Http/Controllers/FailedReleasesController.php +++ b/app/Http/Controllers/FailedReleasesController.php @@ -19,7 +19,7 @@ class FailedReleasesController extends BasePageController return response('Bad request, please supply all parameters!', 400)->withHeaders(['X-DNZB-RCode' => 400, 'X-DNZB-RText' => 'Bad request, please supply all parameters!']); } - $res = User::getByRssToken($request->input('api_token')); + $res = User::findByRssToken($request->input('api_token')); if ($res === null) { return response('Unauthorised, wrong rss key!', 401)->withHeaders(['X-DNZB-RCode' => 401, 'X-DNZB-RText' => 'Unauthorised, wrong rss key!']); } diff --git a/app/Http/Controllers/GetNzbController.php b/app/Http/Controllers/GetNzbController.php index 9714a4f0a..27e763f7d 100644 --- a/app/Http/Controllers/GetNzbController.php +++ b/app/Http/Controllers/GetNzbController.php @@ -119,7 +119,7 @@ class GetNzbController extends BasePageController return showApiError(200); } - $user = User::getByRssToken($request->input('r')); + $user = User::findByRssToken($request->input('r')); if (! $user) { return showApiError(100); } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index c486469b2..a91437419 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -44,7 +44,7 @@ class ProfileController extends BasePageController // If both 'id' and 'name' are specified, 'id' should take precedence. if ($altID === false && $altUsername !== false) { - $user = User::getByUsername($altUsername); + $user = User::findByUsername($altUsername); if ($user) { $this->userdata = $user; $altID = $user['id']; diff --git a/app/Http/Controllers/RssController.php b/app/Http/Controllers/RssController.php index a830817b4..196d4863b 100644 --- a/app/Http/Controllers/RssController.php +++ b/app/Http/Controllers/RssController.php @@ -217,7 +217,7 @@ class RssController extends BasePageController return response()->json(['error' => 'API key is required for viewing the RSS!'], 403); } - $res = User::getByRssToken($request->input('api_token')); + $res = User::findByRssToken($request->input('api_token')); if ($res === null) { return response()->json(['error' => 'Invalid RSS token'], 403); diff --git a/app/Models/Content.php b/app/Models/Content.php index 630d43a29..ae59f5afc 100644 --- a/app/Models/Content.php +++ b/app/Models/Content.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Models; +use App\Enums\UserRole; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; @@ -80,14 +81,17 @@ class Content extends Model protected $guarded = []; /** - * @var array + * @return array */ - protected $casts = [ - 'contenttype' => 'integer', - 'status' => 'integer', - 'ordinal' => 'integer', - 'role' => 'integer', - ]; + protected function casts(): array + { + return [ + 'contenttype' => 'integer', + 'status' => 'integer', + 'ordinal' => 'integer', + 'role' => 'integer', + ]; + } /** * Scope: Get only active content. @@ -111,7 +115,7 @@ class Content extends Model public function scopeForRole(Builder $query, int $role): Builder // @phpstan-ignore missingType.generics { // Admins and moderators can see everything - if (\in_array($role, [User::ROLE_ADMIN, User::ROLE_MODERATOR], true)) { + if (\in_array($role, [UserRole::ADMIN->value, UserRole::MODERATOR->value], true)) { return $query; } diff --git a/app/Models/User.php b/app/Models/User.php index b42d3c50b..0fc41df63 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace App\Models; -use App\Enums\QueueType; use App\Enums\SignupError; use App\Enums\UserRole; use App\Jobs\SendAccountExpiredEmail; @@ -112,7 +111,6 @@ use Spatie\Permission\Traits\HasRoles; * @method static Builder|User whereEmail(string $value) * @method static Builder|User whereApiToken(string $value) * @method static Builder|User whereResetguid(string $value) - * @method static Builder|User whereVerified(int $value) * @method static Builder|User active() * @method static Builder|User verified() * @method static Builder|User withRole(int|string $role) @@ -344,7 +342,11 @@ final class User extends Authenticatable implements MustVerifyEmailContract */ public function scopeVerified(Builder $query): Builder // @phpstan-ignore missingType.generics { - return $query->where('verified', true); + return $query->where(function (Builder $verifiedQuery): void { + $verifiedQuery + ->where('verified', true) + ->orWhereNotNull('email_verified_at'); + }); } /** @@ -387,22 +389,6 @@ final class User extends Authenticatable implements MustVerifyEmailContract $this->notify(new VerifyEmail); } - /** - * Legacy compatibility helper used by existing login flows. - */ - public function isVerified(): bool - { - return $this->hasVerifiedEmail(); - } - - /** - * Legacy compatibility helper used by existing login flows. - */ - public function isPendingVerification(): bool - { - return ! $this->hasVerifiedEmail(); - } - /** * Scope to filter users by role. */ @@ -776,40 +762,6 @@ final class User extends Authenticatable implements MustVerifyEmailContract return static::whereResetguid($guid)->first(); } - // ===== Backward Compatibility Aliases ===== - - /** - * @deprecated Use findByUsername() instead - */ - public static function getByUsername(string $userName): ?static - { - return static::findByUsername($userName); - } - - /** - * @deprecated Use findByEmail() instead - */ - public static function getByEmail(string $email): ?static - { - return static::findByEmail($email); - } - - /** - * @deprecated Use findByRssToken() instead - */ - public static function getByRssToken(string $rssToken): ?static - { - return static::findByRssToken($rssToken); - } - - /** - * @deprecated Use findByResetGuid() instead - */ - public static function getByPassResetGuid(string $guid): ?static - { - return static::findByResetGuid($guid); - } - // ===== User Management Methods ===== /** @@ -1744,7 +1696,9 @@ final class User extends Authenticatable implements MustVerifyEmailContract */ public static function deleteUnVerified(): void { - static::whereVerified(0) + static::query() + ->where('verified', false) + ->whereNull('email_verified_at') ->where('created_at', '<', now()->subDays(3)) ->delete(); } @@ -1764,48 +1718,4 @@ final class User extends Authenticatable implements MustVerifyEmailContract { return $this->timezone ?? 'UTC'; } - - // ===== Legacy Constants (Deprecated - Use Enums) ===== - - /** @deprecated Use SignupError::BAD_USERNAME->value instead */ - public const ERR_SIGNUP_BADUNAME = SignupError::BAD_USERNAME->value; - - /** @deprecated Use SignupError::BAD_PASSWORD->value instead */ - public const ERR_SIGNUP_BADPASS = SignupError::BAD_PASSWORD->value; - - /** @deprecated Use SignupError::BAD_EMAIL->value instead */ - public const ERR_SIGNUP_BADEMAIL = SignupError::BAD_EMAIL->value; - - /** @deprecated Use SignupError::USERNAME_IN_USE->value instead */ - public const ERR_SIGNUP_UNAMEINUSE = SignupError::USERNAME_IN_USE->value; - - /** @deprecated Use SignupError::EMAIL_IN_USE->value instead */ - public const ERR_SIGNUP_EMAILINUSE = SignupError::EMAIL_IN_USE->value; - - /** @deprecated Use SignupError::BAD_INVITE_CODE->value instead */ - public const ERR_SIGNUP_BADINVITECODE = SignupError::BAD_INVITE_CODE->value; - - /** @deprecated Use SignupError::SUCCESS->value instead */ - public const SUCCESS = SignupError::SUCCESS->value; - - /** @deprecated Use UserRole::USER->value instead */ - public const ROLE_USER = UserRole::USER->value; - - /** @deprecated Use UserRole::ADMIN->value instead */ - public const ROLE_ADMIN = UserRole::ADMIN->value; - - /** @deprecated Use UserRole::DISABLED->value instead */ - public const ROLE_DISABLED = UserRole::DISABLED->value; - - /** @deprecated Use UserRole::MODERATOR->value instead */ - public const ROLE_MODERATOR = UserRole::MODERATOR->value; - - /** @deprecated Use QueueType::NONE->value instead */ - public const QUEUE_NONE = QueueType::NONE->value; - - /** @deprecated Use QueueType::SABNZBD->value instead */ - public const QUEUE_SABNZBD = QueueType::SABNZBD->value; - - /** @deprecated Use QueueType::NZBGET->value instead */ - public const QUEUE_NZBGET = QueueType::NZBGET->value; }