refactor: general code improvement (#1006)

This commit is contained in:
Kyrch
2025-11-15 16:00:49 -03:00
committed by GitHub
parent 44c412fc32
commit a4c2d3a0de
24 changed files with 88 additions and 102 deletions
+8 -4
View File
@@ -4,6 +4,8 @@ declare(strict_types=1);
namespace App\Actions\Discord;
use App\Actions\ActionResult;
use App\Enums\Actions\ActionStatus;
use App\Models\Discord\DiscordThread;
use App\Models\Wiki\Anime;
use Exception;
@@ -14,8 +16,10 @@ class DiscordThreadAction
{
/**
* @param array<string, mixed> $fields
*
* @throws Exception
*/
public function handle(Anime $anime, array $fields): ?Exception
public function handle(Anime $anime, array $fields): ActionResult
{
try {
$anime->load(Anime::RELATION_IMAGES);
@@ -44,13 +48,13 @@ class DiscordThreadAction
DiscordThread::ATTRIBUTE_ANIME => $anime->getKey(),
]);
}
return null;
} catch (Exception $e) {
Log::error($e->getMessage());
return $e;
throw $e;
}
return new ActionResult(ActionStatus::PASSED);
}
/**
@@ -4,6 +4,8 @@ declare(strict_types=1);
namespace App\Actions\Discord;
use App\Actions\ActionResult;
use App\Enums\Actions\ActionStatus;
use App\Enums\Actions\Models\Wiki\Video\DiscordNotificationType;
use App\Models\Wiki\Video;
use Illuminate\Support\Arr;
@@ -15,7 +17,7 @@ class DiscordVideoNotificationAction
* @param Collection<int, Video> $videos
* @param array<string, mixed> $fields
*/
public function handle(Collection $videos, array $fields): void
public function handle(Collection $videos, array $fields): ActionResult
{
$type = Arr::get($fields, DiscordNotificationType::getFieldKey());
@@ -59,5 +61,7 @@ class DiscordVideoNotificationAction
'videos' => $newVideos,
])
->throw();
return new ActionResult(ActionStatus::PASSED);
}
}
@@ -4,8 +4,10 @@ declare(strict_types=1);
namespace App\Actions\Models\Wiki;
use App\Actions\ActionResult;
use App\Concerns\Models\CanCreateImage;
use App\Contracts\Models\HasImages;
use App\Enums\Actions\ActionStatus;
use App\Enums\Models\Wiki\ImageFacet;
use App\Models\BaseModel;
use Illuminate\Support\Arr;
@@ -17,7 +19,7 @@ class AttachImageAction
/**
* @param ImageFacet[] $facets
*/
public function handle(BaseModel&HasImages $model, array $fields, array $facets): void
public function handle(BaseModel&HasImages $model, array $fields, array $facets): ActionResult
{
foreach ($facets as $facet) {
$image = Arr::get($fields, $facet->name);
@@ -28,5 +30,7 @@ class AttachImageAction
$this->createImageFromFile($image, $facet, $model);
}
return new ActionResult(ActionStatus::PASSED);
}
}
@@ -4,8 +4,10 @@ declare(strict_types=1);
namespace App\Actions\Models\Wiki;
use App\Actions\ActionResult;
use App\Concerns\Models\CanCreateExternalResource;
use App\Contracts\Models\HasResources;
use App\Enums\Actions\ActionStatus;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\BaseModel;
use Illuminate\Support\Arr;
@@ -17,7 +19,7 @@ class AttachResourceAction
/**
* @param ResourceSite[] $sites
*/
public function handle(BaseModel&HasResources $model, array $fields, array $sites): void
public function handle(BaseModel&HasResources $model, array $fields, array $sites): ActionResult
{
foreach ($sites as $resourceSite) {
$url = Arr::get($fields, $resourceSite->name);
@@ -28,5 +30,7 @@ class AttachResourceAction
$this->createResource($url, $resourceSite, $model);
}
return new ActionResult(ActionStatus::PASSED);
}
}
@@ -60,9 +60,6 @@ class OptimizeImageAction
return new ActionResult(ActionStatus::PASSED);
}
/**
* @throws Exception
*/
protected function convertImage(): ?string
{
try {
@@ -66,7 +66,7 @@ trait HasActionLogs
public function finishedLog(): void
{
if (($actionLog = $this->actionLog) && ! $this->isFailedLog()) {
if (($actionLog = $this->actionLog) && ! $this->hasFailedLog()) {
$actionLog->finished();
// Filament notifications
if ($this instanceof Action) {
@@ -80,8 +80,8 @@ trait HasActionLogs
$this->actionLog->batchFinished();
}
public function isFailedLog(): bool
public function hasFailedLog(): bool
{
return $this->actionLog->isFailed();
return $this->actionLog->hasFailed();
}
}
+10 -18
View File
@@ -10,8 +10,7 @@ use App\Enums\Models\Wiki\ImageFacet;
use App\Jobs\Wiki\Image\OptimizeImageJob;
use App\Models\BaseModel;
use App\Models\Wiki\Image;
use Illuminate\Http\Client\RequestException;
use Illuminate\Http\Testing\File;
use Illuminate\Http\File;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
@@ -22,24 +21,20 @@ trait CanCreateImage
{
use HasLabel;
/**
* @throws RequestException
*/
public function createImageFromUrl(string $url, ImageFacet $facet, (BaseModel&HasImages)|null $model = null): Image
{
$imageResponse = Http::get($url)->throw();
$binary = Http::get($url)
->throw()
->body();
$image = $imageResponse->body();
$tmp = tempnam(sys_get_temp_dir(), 'img_');
$file = File::createWithContent(basename($url), $image);
file_put_contents($tmp, $binary);
/** @var \Illuminate\Filesystem\FilesystemAdapter $fs */
$fs = Storage::disk(Config::get(ImageConstants::DISKS_QUALIFIED));
$fsFile = $fs->putFile($this->path($facet, $model), $file);
$fsFile = Storage::disk(Config::get(ImageConstants::DISKS_QUALIFIED))
->putFile($this->path($facet, $model), new File($tmp));
Log::info("Creating Image {$fsFile}");
/** @var Image $image */
$image = Image::query()->create([
Image::ATTRIBUTE_FACET => $facet->value,
Image::ATTRIBUTE_PATH => $fsFile,
@@ -54,13 +49,10 @@ trait CanCreateImage
public function createImageFromFile(mixed $image, ImageFacet $facet, (BaseModel&HasImages)|null $model = null): Image
{
/** @var \Illuminate\Filesystem\FilesystemAdapter $fs */
$fs = Storage::disk(Config::get(ImageConstants::DISKS_QUALIFIED));
$fsFile = $fs->putFile($this->path($facet, $model), $image);
$fsFile = Storage::disk(Config::get(ImageConstants::DISKS_QUALIFIED))
->putFile($this->path($facet, $model), $image);
Log::info("Creating Image {$fsFile}");
/** @var Image $image */
$image = Image::query()->create([
Image::ATTRIBUTE_FACET => $facet->value,
Image::ATTRIBUTE_PATH => $fsFile,
+4 -21
View File
@@ -7,7 +7,6 @@ namespace App\Concerns\Models;
use App\Enums\Models\Wiki\ResourceSite;
use App\Models\Wiki\ExternalResource;
use App\Models\Wiki\Studio;
use App\Pivots\Morph\Resourceable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
@@ -34,29 +33,13 @@ trait CanCreateStudio
public function ensureStudioHasResource(Studio $studio, ResourceSite $site, int $id): void
{
$studioResource = ExternalResource::query()
->where(ExternalResource::ATTRIBUTE_SITE, $site->value)
->where(ExternalResource::ATTRIBUTE_EXTERNAL_ID, $id)
->where(ExternalResource::ATTRIBUTE_LINK, $site->formatResourceLink(Studio::class, $id))
->first();
if (! $studioResource instanceof ExternalResource) {
Log::info("Creating studio resource with site '{$site->localize()}' and id '$id'");
$studioResource = ExternalResource::query()->create([
$resource = ExternalResource::query()
->firstOrCreate([
ExternalResource::ATTRIBUTE_SITE => $site->value,
ExternalResource::ATTRIBUTE_EXTERNAL_ID => $id,
ExternalResource::ATTRIBUTE_LINK => $site->formatResourceLink(Studio::class, $id),
ExternalResource::ATTRIBUTE_SITE => $site->value,
]);
}
if (Resourceable::query()
->whereMorphedTo(Resourceable::RELATION_RESOURCEABLE, $studio)
->where(Resourceable::ATTRIBUTE_RESOURCE, $studioResource->getKey())
->doesntExist()
) {
Log::info("Attaching resource '$studioResource->link' to studio '{$studio->getName()}'");
$studioResource->studios()->attach($studio);
}
$resource->studios()->attach($studio);
}
}
@@ -9,7 +9,6 @@ use App\Contracts\Models\HasHashids;
use App\Filament\Actions\BaseAction;
use App\Models\BaseModel;
use App\Models\List\Playlist;
use Exception;
use Illuminate\Support\Facades\Gate;
class AssignHashidsAction extends BaseAction
@@ -37,11 +36,7 @@ class AssignHashidsAction extends BaseAction
$action = new AssignHashids();
if ($model instanceof HasHashids) {
try {
$action->assign($model, $this->connection);
} catch (Exception $e) {
$this->failedLog($e);
}
$action->assign($model, $this->connection);
}
}
@@ -12,7 +12,6 @@ use App\Filament\Actions\BaseAction;
use App\Models\Wiki\Anime;
use App\Models\Wiki\ExternalResource;
use App\Models\Wiki\Image;
use Exception;
use Filament\Forms\Components\Checkbox;
use Filament\Notifications\Notification;
use Filament\Schemas\Components\Section;
@@ -72,20 +71,18 @@ class BackfillAnimeAction extends BaseAction
$action = new BackfillAnime($anime, $this->getToBackfill($data));
try {
$result = $action->handle();
$result = $action->handle();
if ($result->hasFailed()) {
Notification::make()
->body($result->getMessage())
->warning()
->actions([
MarkAsReadAction::make(),
])
->sendToDatabase(Auth::user());
}
} catch (Exception $e) {
$this->failedLog($e);
if ($result->hasFailed()) {
Notification::make()
->body($result->getMessage())
->warning()
->actions([
MarkAsReadAction::make(),
])
->sendToDatabase(Auth::user());
$this->failedLog($result->getMessage());
}
}
@@ -9,7 +9,6 @@ use App\Filament\Actions\BaseAction;
use App\Filament\Components\Fields\TextInput;
use App\Models\Discord\DiscordThread;
use App\Models\Wiki\Anime;
use Exception;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Illuminate\Support\Facades\Gate;
@@ -33,10 +32,10 @@ class DiscordThreadAction extends BaseAction
$this->fillForm(fn (Anime $record): array => ['name' => $record->getName()]);
$this->action(function (Anime $record, array $data): void {
$action = new DiscordThreadActionAction()->handle($record, $data);
$result = new DiscordThreadActionAction()->handle($record, $data);
if ($action instanceof Exception) {
$this->failedLog($action);
if ($result->hasFailed()) {
$this->failedLog($result->getMessage());
}
});
}
@@ -21,6 +21,7 @@ use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Sleep;
class BackfillStudioAction extends BaseAction implements ShouldQueue
@@ -71,9 +72,13 @@ class BackfillStudioAction extends BaseAction implements ShouldQueue
MarkAsReadAction::make(),
])
->sendToDatabase(Auth::user());
$this->failedLog($result->getMessage());
}
} catch (Exception $e) {
$this->failedLog($e);
Log::error($e->getMessage());
throw $e;
} finally {
// Try not to upset third-party APIs
Sleep::for(random_int(3, 5))->second();
@@ -23,6 +23,7 @@ use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Log;
class BackfillAudioAction extends BaseAction implements ShouldQueue
{
@@ -60,6 +61,7 @@ class BackfillAudioAction extends BaseAction implements ShouldQueue
try {
$result = $action->handle();
if ($result->hasFailed()) {
Notification::make()
->body($result->getMessage())
@@ -68,9 +70,13 @@ class BackfillAudioAction extends BaseAction implements ShouldQueue
MarkAsReadAction::make(),
])
->sendToDatabase(Auth::user());
$this->failedLog($result->getMessage());
}
} catch (Exception $e) {
$this->failedLog($e);
Log::error($e->getMessage());
throw $e;
}
}
@@ -45,7 +45,11 @@ class VideoDiscordNotificationBulkAction extends BaseBulkAction
$action = new DiscordVideoNotificationActionAction();
$action->handle($videos, $data);
$result = $action->handle($videos, $data);
if ($result->hasFailed()) {
$this->failedLog($result->getMessage());
}
}
/**
@@ -34,6 +34,10 @@ abstract class StorageBulkAction extends BaseBulkAction
$action->then($storageResults);
$actionResult = $storageResults->toActionResult();
if ($actionResult->hasFailed()) {
$this->failedLog($actionResult->getMessage());
}
}
}
}
-6
View File
@@ -5,18 +5,12 @@ declare(strict_types=1);
namespace App\Filament\Tabs;
use Filament\Schemas\Components\Tabs\Tab;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Cache;
abstract class BaseTab extends Tab
{
abstract public static function getSlug(): string;
public function modifyQuery(Builder $query): Builder
{
return Cache::flexible("filament_query_{$this->getSlug()}", [15, 60], fn (): Builder => $this->modifyQuery($query));
}
public function count(): mixed
{
$count = Cache::flexible("filament_badge_{$this->getSlug()}", [15, 60], fn (): string|int|float|null => $this->getBadge());
@@ -35,7 +35,7 @@ class AnimeThemeTypeField extends EnumField implements CreatableField, RequiredO
{
return [
new EqFilter($this),
new InFilter($this, [ThemeType::OP->value, ThemeType::ED->value]),
new InFilter($this),
new NotInFilter($this),
];
}
@@ -6,16 +6,17 @@ namespace App\Http\Middleware\GraphQL;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Context;
class SetServingGraphQL
{
public static $isServing = false;
/**
* @param Closure(Request): mixed $next
*/
public function handle(Request $request, Closure $next): mixed
{
Context::add('serving-graphql', true);
static::$isServing = true;
return $next($request);
}
+1 -1
View File
@@ -393,7 +393,7 @@ class ActionLog extends Model implements Nameable
/**
* Check if the model status is failed.
*/
public function isFailed(): bool
public function hasFailed(): bool
{
return $this->status === ActionLogStatus::FAILED;
}
+2 -2
View File
@@ -15,6 +15,7 @@ use App\Events\Wiki\Anime\Theme\ThemeDeleting;
use App\Events\Wiki\Anime\Theme\ThemeRestored;
use App\Events\Wiki\Anime\Theme\ThemeUpdated;
use App\Http\Api\Schema\Wiki\Anime\ThemeSchema;
use App\Http\Middleware\GraphQL\SetServingGraphQL;
use App\Models\BaseModel;
use App\Models\Wiki\Anime;
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
@@ -28,7 +29,6 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Context;
use Illuminate\Support\Str;
use Illuminate\Support\Stringable;
@@ -83,7 +83,7 @@ class AnimeTheme extends BaseModel implements InteractsWithSchema, SoftDeletable
{
parent::boot();
if (! Context::get('serving-graphql')) {
if (! SetServingGraphQL::$isServing) {
static::addGlobalScope(new WithoutInsertSongScope);
}
}
-5
View File
@@ -8,7 +8,6 @@ use App\Enums\Filament\NavigationGroup;
use App\Filament\Components\Fields\TextInput;
use App\Filament\Providers\GlobalSearchScoutProvider;
use Awcodes\Recently\RecentlyPlugin;
use Filament\Actions\ActionGroup;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
@@ -46,10 +45,6 @@ class FilamentPanelProvider extends PanelProvider
{
parent::register();
ActionGroup::configureUsing(function (ActionGroup $actionGroup): void {
$actionGroup->dropdownPlacement('bottom-end');
});
Column::configureUsing(function (Column $column): void {
$column->placeholder('-');
$column->sortable();
@@ -8,7 +8,6 @@ use App\Constants\Config\AudioConstants;
use App\Models\Wiki\Audio;
use App\Repositories\Storage\StorageRepository;
use Closure;
use Illuminate\Http\Testing\MimeType;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\File;
use League\Flysystem\StorageAttributes;
@@ -43,7 +42,7 @@ class AudioRepository extends StorageRepository
return fn (StorageAttributes $file): Audio => new Audio([
Audio::ATTRIBUTE_BASENAME => File::basename($file->path()),
Audio::ATTRIBUTE_FILENAME => File::name($file->path()),
Audio::ATTRIBUTE_MIMETYPE => MimeType::from($file->path()),
Audio::ATTRIBUTE_MIMETYPE => File::mimeType($file->path()),
Audio::ATTRIBUTE_PATH => $file->path(),
Audio::ATTRIBUTE_SIZE => $file->offsetGet(StorageAttributes::ATTRIBUTE_FILE_SIZE),
]);
@@ -8,7 +8,6 @@ use App\Constants\Config\VideoConstants;
use App\Models\Wiki\Video;
use App\Repositories\Storage\StorageRepository;
use Closure;
use Illuminate\Http\Testing\MimeType;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\File;
use League\Flysystem\StorageAttributes;
@@ -43,7 +42,7 @@ class VideoRepository extends StorageRepository
return fn (StorageAttributes $file): Video => new Video([
Video::ATTRIBUTE_BASENAME => File::basename($file->path()),
Video::ATTRIBUTE_FILENAME => File::name($file->path()),
Video::ATTRIBUTE_MIMETYPE => MimeType::from($file->path()),
Video::ATTRIBUTE_MIMETYPE => File::mimeType($file->path()),
Video::ATTRIBUTE_PATH => $file->path(),
Video::ATTRIBUTE_SIZE => $file->offsetGet(StorageAttributes::ATTRIBUTE_FILE_SIZE),
]);
+2 -2
View File
@@ -108,7 +108,7 @@ return [
* for details. Disabled by default.
*/
'security' => [
'query_max_complexity' => 0,
'query_max_complexity' => 0, // 250 in GraphQLServiceProvider
'query_max_depth' => 13,
'disable_introspection' => false,
],
@@ -116,7 +116,7 @@ return [
// Custom array
'pagination_values' => [
'default_count' => 15,
'max_count' => 10,
'max_count' => 100,
'relation' => [
'default_count' => 1000000,
'max_count' => null,