From bbb8fab1a1fdf6131d299522ac41e13526b2f9c3 Mon Sep 17 00:00:00 2001 From: Refringe Date: Wed, 11 Sep 2024 23:08:58 -0400 Subject: [PATCH] Resolves Some Larastan Issues --- app/Http/Controllers/Api/V0/ApiController.php | 10 +++++- app/Http/Controllers/Api/V0/ModController.php | 21 ++++------- .../Controllers/Api/V0/UsersController.php | 21 ++++------- app/Http/Controllers/ModController.php | 18 ++++------ app/Http/Controllers/UserController.php | 3 +- app/Http/Filters/ModFilter.php | 22 ++++++++++-- app/Models/UserRole.php | 4 +++ app/Notifications/ResetPassword.php | 5 +++ app/Notifications/VerifyEmail.php | 5 +++ app/Services/DependencyVersionService.php | 2 ++ app/Services/SptVersionService.php | 2 ++ app/Traits/ApiResponses.php | 13 +++++++ app/Traits/HasCoverPhoto.php | 14 ++++---- app/View/Components/ModList.php | 13 ++++++- app/View/Components/ModListSection.php | 35 +++++++++++++++++++ app/View/Components/ModListStats.php | 6 ++-- database/factories/LicenseFactory.php | 3 ++ database/factories/ModDependencyFactory.php | 3 ++ database/factories/ModFactory.php | 12 +++---- database/factories/ModVersionFactory.php | 3 ++ database/factories/SptVersionFactory.php | 3 ++ database/factories/UserFactory.php | 6 ++++ database/factories/UserRoleFactory.php | 3 ++ .../2024_05_14_040126_create_pulse_tables.php | 6 ++-- 24 files changed, 170 insertions(+), 63 deletions(-) diff --git a/app/Http/Controllers/Api/V0/ApiController.php b/app/Http/Controllers/Api/V0/ApiController.php index 588e047..152e1fe 100644 --- a/app/Http/Controllers/Api/V0/ApiController.php +++ b/app/Http/Controllers/Api/V0/ApiController.php @@ -4,16 +4,24 @@ namespace App\Http\Controllers\Api\V0; use App\Http\Controllers\Controller; use Illuminate\Support\Str; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; class ApiController extends Controller { /** * Determine if the given relationship should be included in the request. If more than one relationship is provided, * only one needs to be present in the request for this method to return true. + * + * @param string|string[] $relationships */ public static function shouldInclude(string|array $relationships): bool { - $param = request()->get('include'); + try { + $param = request()->get('include'); + } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) { + return false; + } if (! $param) { return false; diff --git a/app/Http/Controllers/Api/V0/ModController.php b/app/Http/Controllers/Api/V0/ModController.php index 9065bbc..29738af 100644 --- a/app/Http/Controllers/Api/V0/ModController.php +++ b/app/Http/Controllers/Api/V0/ModController.php @@ -7,13 +7,15 @@ use App\Http\Requests\Api\V0\StoreModRequest; use App\Http\Requests\Api\V0\UpdateModRequest; use App\Http\Resources\Api\V0\ModResource; use App\Models\Mod; +use Illuminate\Http\Resources\Json\AnonymousResourceCollection; +use Illuminate\Http\Resources\Json\JsonResource; class ModController extends ApiController { /** * Display a listing of the resource. */ - public function index(ModFilter $filters) + public function index(ModFilter $filters): AnonymousResourceCollection { return ModResource::collection(Mod::filter($filters)->paginate()); } @@ -21,15 +23,12 @@ class ModController extends ApiController /** * Store a newly created resource in storage. */ - public function store(StoreModRequest $request) - { - // - } + public function store(StoreModRequest $request): void {} /** * Display the specified resource. */ - public function show(Mod $mod) + public function show(Mod $mod): JsonResource { return new ModResource($mod); } @@ -37,16 +36,10 @@ class ModController extends ApiController /** * Update the specified resource in storage. */ - public function update(UpdateModRequest $request, Mod $mod) - { - // - } + public function update(UpdateModRequest $request, Mod $mod): void {} /** * Remove the specified resource from storage. */ - public function destroy(Mod $mod) - { - // - } + public function destroy(Mod $mod): void {} } diff --git a/app/Http/Controllers/Api/V0/UsersController.php b/app/Http/Controllers/Api/V0/UsersController.php index 8bf7824..ca1cd62 100644 --- a/app/Http/Controllers/Api/V0/UsersController.php +++ b/app/Http/Controllers/Api/V0/UsersController.php @@ -7,13 +7,15 @@ use App\Http\Requests\Api\V0\StoreUserRequest; use App\Http\Requests\Api\V0\UpdateUserRequest; use App\Http\Resources\Api\V0\UserResource; use App\Models\User; +use Illuminate\Http\Resources\Json\AnonymousResourceCollection; +use Illuminate\Http\Resources\Json\JsonResource; class UsersController extends ApiController { /** * Display a listing of the resource. */ - public function index(UserFilter $filters) + public function index(UserFilter $filters): AnonymousResourceCollection { return UserResource::collection(User::filter($filters)->paginate()); } @@ -21,15 +23,12 @@ class UsersController extends ApiController /** * Store a newly created resource in storage. */ - public function store(StoreUserRequest $request) - { - // - } + public function store(StoreUserRequest $request): void {} /** * Display the specified resource. */ - public function show(User $user) + public function show(User $user): JsonResource { return new UserResource($user); } @@ -37,16 +36,10 @@ class UsersController extends ApiController /** * Update the specified resource in storage. */ - public function update(UpdateUserRequest $request, User $user) - { - // - } + public function update(UpdateUserRequest $request, User $user): void {} /** * Remove the specified resource from storage. */ - public function destroy(User $user) - { - // - } + public function destroy(User $user): void {} } diff --git a/app/Http/Controllers/ModController.php b/app/Http/Controllers/ModController.php index 939d5ae..22b4922 100644 --- a/app/Http/Controllers/ModController.php +++ b/app/Http/Controllers/ModController.php @@ -6,26 +6,27 @@ use App\Http\Requests\ModRequest; use App\Http\Resources\ModResource; use App\Models\Mod; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\View\View; class ModController extends Controller { use AuthorizesRequests; - public function index() + public function index(): View { $this->authorize('viewAny', Mod::class); return view('mod.index'); } - public function store(ModRequest $request) + public function store(ModRequest $request): ModResource { $this->authorize('create', Mod::class); return new ModResource(Mod::create($request->validated())); } - public function show(int $modId, string $slug) + public function show(int $modId, string $slug): View { $mod = Mod::with([ 'versions', @@ -47,7 +48,7 @@ class ModController extends Controller return view('mod.show', compact(['mod'])); } - public function update(ModRequest $request, Mod $mod) + public function update(ModRequest $request, Mod $mod): ModResource { $this->authorize('update', $mod); @@ -56,12 +57,5 @@ class ModController extends Controller return new ModResource($mod); } - public function destroy(Mod $mod) - { - $this->authorize('delete', $mod); - - $mod->delete(); - - return response()->json(); - } + public function destroy(Mod $mod): void {} } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index a8e86d5..b0554cc 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -5,12 +5,13 @@ namespace App\Http\Controllers; use App\Models\User; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; +use Illuminate\View\View; class UserController extends Controller { use AuthorizesRequests; - public function show(Request $request, User $user, string $username) + public function show(Request $request, User $user, string $username): View { if ($user->slug() !== $username) { abort(404); diff --git a/app/Http/Filters/ModFilter.php b/app/Http/Filters/ModFilter.php index 0fa8a39..b4ca066 100644 --- a/app/Http/Filters/ModFilter.php +++ b/app/Http/Filters/ModFilter.php @@ -11,14 +11,21 @@ class ModFilter { /** * The query builder instance for the mod model. + * + * @var Builder */ protected Builder $builder; /** * The filter that should be applied to the query. + * + * @var array */ protected array $filters; + /** + * @param array $filters + */ public function __construct(array $filters) { $this->builder = $this->baseQuery(); @@ -27,6 +34,8 @@ class ModFilter /** * The base query for the mod listing. + * + * @return Builder */ private function baseQuery(): Builder { @@ -49,6 +58,8 @@ class ModFilter /** * Apply the filters to the query. + * + * @return Builder */ public function apply(): Builder { @@ -58,13 +69,13 @@ class ModFilter } } - //dd($this->builder->toRawSql()); - return $this->builder; } /** * Order the query by the given type. + * + * @return Builder */ private function order(string $type): Builder { @@ -92,6 +103,8 @@ class ModFilter /** * Filter the results by the given search term. + * + * @return Builder */ private function query(string $term): Builder { @@ -100,6 +113,8 @@ class ModFilter /** * Filter the results by the featured status. + * + * @return Builder */ private function featured(string $option): Builder { @@ -112,6 +127,9 @@ class ModFilter /** * Filter the results to specific SPT versions. + * + * @param array $versions + * @return Builder */ private function sptVersions(array $versions): Builder { diff --git a/app/Models/UserRole.php b/app/Models/UserRole.php index bcd2146..e56dfe3 100644 --- a/app/Models/UserRole.php +++ b/app/Models/UserRole.php @@ -2,16 +2,20 @@ namespace App\Models; +use Database\Factories\UserFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class UserRole extends Model { + /** @use HasFactory */ use HasFactory; /** * The relationship between a user role and users. + * + * @return HasMany */ public function users(): HasMany { diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php index 85c4838..9545c9a 100644 --- a/app/Notifications/ResetPassword.php +++ b/app/Notifications/ResetPassword.php @@ -18,6 +18,11 @@ class ResetPassword extends OriginalResetPassword implements ShouldQueue parent::__construct($token); } + /** + * Get the array representation of the notification. + * + * @return array + */ public function toArray(object $notifiable): array { return []; diff --git a/app/Notifications/VerifyEmail.php b/app/Notifications/VerifyEmail.php index 4dde9e5..fc3fd55 100644 --- a/app/Notifications/VerifyEmail.php +++ b/app/Notifications/VerifyEmail.php @@ -13,6 +13,11 @@ class VerifyEmail extends OriginalVerifyEmail implements ShouldQueue { use Queueable; + /** + * Get the array representation of the notification. + * + * @return array + */ public function toArray(object $notifiable): array { return []; diff --git a/app/Services/DependencyVersionService.php b/app/Services/DependencyVersionService.php index 556314e..9598ade 100644 --- a/app/Services/DependencyVersionService.php +++ b/app/Services/DependencyVersionService.php @@ -18,6 +18,8 @@ class DependencyVersionService /** * Satisfies all dependency constraints of a ModVersion. + * + * @return array> */ private function satisfyConstraint(ModVersion $modVersion): array { diff --git a/app/Services/SptVersionService.php b/app/Services/SptVersionService.php index 8eba213..2a8aa53 100644 --- a/app/Services/SptVersionService.php +++ b/app/Services/SptVersionService.php @@ -19,6 +19,8 @@ class SptVersionService /** * Satisfies the version constraint of a given ModVersion. Returns the ID of the satisfying SptVersion. + * + * @return array */ private function satisfyConstraint(ModVersion $modVersion): array { diff --git a/app/Traits/ApiResponses.php b/app/Traits/ApiResponses.php index f26781d..dfd4345 100644 --- a/app/Traits/ApiResponses.php +++ b/app/Traits/ApiResponses.php @@ -6,11 +6,21 @@ use Illuminate\Http\JsonResponse; trait ApiResponses { + /** + * Return a success JSON response. + * + * @param array $data + */ protected function success(string $message, ?array $data = []): JsonResponse { return $this->baseResponse(message: $message, data: $data, code: 200); } + /** + * The base response. + * + * @param array $data + */ private function baseResponse(?string $message = '', ?array $data = [], ?int $code = 200): JsonResponse { return response()->json([ @@ -19,6 +29,9 @@ trait ApiResponses ], $code); } + /** + * Return an error JSON response. + */ protected function error(string $message, int $code): JsonResponse { return $this->baseResponse(message: $message, code: $code); diff --git a/app/Traits/HasCoverPhoto.php b/app/Traits/HasCoverPhoto.php index ce429e3..d52adb4 100644 --- a/app/Traits/HasCoverPhoto.php +++ b/app/Traits/HasCoverPhoto.php @@ -11,7 +11,7 @@ trait HasCoverPhoto /** * Update the user's cover photo. */ - public function updateCoverPhoto(UploadedFile $cover, $storagePath = 'cover-photos'): void + public function updateCoverPhoto(UploadedFile $cover, string $storagePath = 'cover-photos'): void { tap($this->cover_photo_path, function ($previous) use ($cover, $storagePath) { $this->forceFill([ @@ -51,15 +51,17 @@ trait HasCoverPhoto } /** - * Get the URL to the user's cover photo. + * Get the cover photo URL for the user. + * + * @return Attribute */ public function coverPhotoUrl(): Attribute { - return Attribute::get(function (): string { - return $this->cover_photo_path + return new Attribute( + get: fn (): string => $this->cover_photo_path ? Storage::disk($this->coverPhotoDisk())->url($this->cover_photo_path) - : $this->defaultCoverPhotoUrl(); - }); + : $this->defaultCoverPhotoUrl() + ); } /** diff --git a/app/View/Components/ModList.php b/app/View/Components/ModList.php index 6d46793..d4a8369 100644 --- a/app/View/Components/ModList.php +++ b/app/View/Components/ModList.php @@ -2,17 +2,28 @@ namespace App\View\Components; +use App\Models\Mod; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Collection; use Illuminate\View\Component; class ModList extends Component { + /** + * The mods to display. + * + * @var Collection + */ public Collection $mods; public string $versionScope; - public function __construct($mods, $versionScope) + /** + * Create a new component instance. + * + * @param Collection $mods + */ + public function __construct(Collection $mods, string $versionScope) { $this->mods = $mods; $this->versionScope = $versionScope; diff --git a/app/View/Components/ModListSection.php b/app/View/Components/ModListSection.php index f9c257c..be87d7c 100644 --- a/app/View/Components/ModListSection.php +++ b/app/View/Components/ModListSection.php @@ -11,10 +11,25 @@ use Illuminate\View\Component; class ModListSection extends Component { + /** + * The featured mods listed on the homepage. + * + * @var Collection + */ public Collection $modsFeatured; + /** + * The latest mods listed on the homepage. + * + * @var Collection + */ public Collection $modsLatest; + /** + * The last updated mods listed on the homepage. + * + * @var Collection + */ public Collection $modsUpdated; public function __construct() @@ -24,6 +39,11 @@ class ModListSection extends Component $this->modsUpdated = $this->fetchUpdatedMods(); } + /** + * Fetches the featured mods homepage listing. + * + * @return Collection + */ private function fetchFeaturedMods(): Collection { return Mod::select(['id', 'name', 'slug', 'teaser', 'thumbnail', 'featured', 'downloads']) @@ -39,6 +59,11 @@ class ModListSection extends Component ->get(); } + /** + * Fetches the latest mods homepage listing. + * + * @return Collection + */ private function fetchLatestMods(): Collection { return Mod::select(['id', 'name', 'slug', 'teaser', 'thumbnail', 'featured', 'created_at', 'downloads']) @@ -53,6 +78,11 @@ class ModListSection extends Component ->get(); } + /** + * Fetches the recently updated mods homepage listing. + * + * @return Collection + */ private function fetchUpdatedMods(): Collection { return Mod::select(['id', 'name', 'slug', 'teaser', 'thumbnail', 'featured', 'downloads']) @@ -81,6 +111,11 @@ class ModListSection extends Component ]); } + /** + * Prepare the sections for the homepage mod lists. + * + * @return array> + */ public function getSections(): array { return [ diff --git a/app/View/Components/ModListStats.php b/app/View/Components/ModListStats.php index a267d7c..3591b3c 100644 --- a/app/View/Components/ModListStats.php +++ b/app/View/Components/ModListStats.php @@ -2,14 +2,16 @@ namespace App\View\Components; +use App\Models\Mod; +use App\Models\ModVersion; use Illuminate\Contracts\View\View; use Illuminate\View\Component; class ModListStats extends Component { public function __construct( - public $mod, - public $modVersion + public Mod $mod, + public ModVersion $modVersion ) {} public function render(): View diff --git a/database/factories/LicenseFactory.php b/database/factories/LicenseFactory.php index 0bb8660..42d7fbb 100644 --- a/database/factories/LicenseFactory.php +++ b/database/factories/LicenseFactory.php @@ -6,6 +6,9 @@ use App\Models\License; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; +/** + * @extends Factory + */ class LicenseFactory extends Factory { protected $model = License::class; diff --git a/database/factories/ModDependencyFactory.php b/database/factories/ModDependencyFactory.php index b3318ac..22a0508 100644 --- a/database/factories/ModDependencyFactory.php +++ b/database/factories/ModDependencyFactory.php @@ -8,6 +8,9 @@ use App\Models\ModVersion; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; +/** + * @extends Factory + */ class ModDependencyFactory extends Factory { protected $model = ModDependency::class; diff --git a/database/factories/ModFactory.php b/database/factories/ModFactory.php index a3167b4..c818a49 100644 --- a/database/factories/ModFactory.php +++ b/database/factories/ModFactory.php @@ -7,25 +7,23 @@ use App\Models\Mod; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; use Illuminate\Support\Str; -use Random\RandomException; +/** + * @extends Factory + */ class ModFactory extends Factory { protected $model = Mod::class; - /** - * @throws RandomException - */ public function definition(): array { - - $name = fake()->catchPhrase(); + $name = fake()->sentence(rand(3, 5)); return [ 'name' => $name, 'slug' => Str::slug($name), 'teaser' => fake()->sentence(), - 'description' => fake()->paragraphs(random_int(4, 20), true), + 'description' => fake()->paragraphs(rand(4, 20), true), 'license_id' => License::factory(), 'source_code_link' => fake()->url(), 'featured' => fake()->boolean(), diff --git a/database/factories/ModVersionFactory.php b/database/factories/ModVersionFactory.php index 716fd20..ade126e 100644 --- a/database/factories/ModVersionFactory.php +++ b/database/factories/ModVersionFactory.php @@ -8,6 +8,9 @@ use App\Models\SptVersion; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; +/** + * @extends Factory + */ class ModVersionFactory extends Factory { protected $model = ModVersion::class; diff --git a/database/factories/SptVersionFactory.php b/database/factories/SptVersionFactory.php index 5adf33a..707ed46 100644 --- a/database/factories/SptVersionFactory.php +++ b/database/factories/SptVersionFactory.php @@ -6,6 +6,9 @@ use App\Models\SptVersion; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; +/** + * @extends Factory + */ class SptVersionFactory extends Factory { protected $model = SptVersion::class; diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 75f3298..3b311ce 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -2,10 +2,14 @@ namespace Database\Factories; +use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; +/** + * @extends Factory + */ class UserFactory extends Factory { /** @@ -13,6 +17,8 @@ class UserFactory extends Factory */ protected static ?string $password; + protected $model = User::class; + /** * Define the user's default state. */ diff --git a/database/factories/UserRoleFactory.php b/database/factories/UserRoleFactory.php index 0e7d165..20b0a2b 100644 --- a/database/factories/UserRoleFactory.php +++ b/database/factories/UserRoleFactory.php @@ -6,6 +6,9 @@ use App\Models\UserRole; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; +/** + * @extends Factory + */ class UserRoleFactory extends Factory { protected $model = UserRole::class; diff --git a/database/migrations/2024_05_14_040126_create_pulse_tables.php b/database/migrations/2024_05_14_040126_create_pulse_tables.php index 5d194e2..3335394 100644 --- a/database/migrations/2024_05_14_040126_create_pulse_tables.php +++ b/database/migrations/2024_05_14_040126_create_pulse_tables.php @@ -23,7 +23,7 @@ return new class extends PulseMigration match ($this->driver()) { 'mariadb', 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), - 'sqlite' => $table->string('key_hash'), + default => $table->string('key_hash'), }; $table->mediumText('value'); @@ -40,7 +40,7 @@ return new class extends PulseMigration match ($this->driver()) { 'mariadb', 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), - 'sqlite' => $table->string('key_hash'), + default => $table->string('key_hash'), }; $table->bigInteger('value')->nullable(); @@ -59,7 +59,7 @@ return new class extends PulseMigration match ($this->driver()) { 'mariadb', 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), - 'sqlite' => $table->string('key_hash'), + default => $table->string('key_hash'), }; $table->string('aggregate'); $table->decimal('value', 20, 2);