From d1c5576be34c554dc4d44ff073c2796006e46637 Mon Sep 17 00:00:00 2001 From: Jamiras <32680403+Jamiras@users.noreply.github.com> Date: Sat, 1 Feb 2025 09:01:31 -0700 Subject: [PATCH] Support adding additional achievements to existing event (#3161) --- app/Filament/Resources/EventResource.php | 4 +- .../Resources/EventResource/Pages/Create.php | 29 +++---------- .../AchievementsRelationManager.php | 26 ++++++++++- app/Models/Event.php | 8 ++++ app/Models/EventAchievement.php | 13 +++++- .../Actions/AddAchievementsToEventAction.php | 43 +++++++++++++++++++ 6 files changed, 96 insertions(+), 27 deletions(-) create mode 100644 app/Platform/Actions/AddAchievementsToEventAction.php diff --git a/app/Filament/Resources/EventResource.php b/app/Filament/Resources/EventResource.php index d4a4451378..ffc0fae601 100644 --- a/app/Filament/Resources/EventResource.php +++ b/app/Filament/Resources/EventResource.php @@ -113,8 +113,9 @@ public static function form(Form $form): Form ->columns(['md' => 2, 'xl' => 3, '2xl' => 4]) ->schema([ Forms\Components\TextInput::make('Title') - ->required() ->label('Title') + ->unique() + ->required() ->minLength(2) ->maxLength(80), @@ -134,6 +135,7 @@ public static function form(Form $form): Form ->rules(['alpha_dash']) ->minLength(4) ->maxLength(20) + ->unique() ->required() ->columnSpan(2), diff --git a/app/Filament/Resources/EventResource/Pages/Create.php b/app/Filament/Resources/EventResource/Pages/Create.php index 51582350cc..ed582cba6a 100644 --- a/app/Filament/Resources/EventResource/Pages/Create.php +++ b/app/Filament/Resources/EventResource/Pages/Create.php @@ -7,12 +7,10 @@ use App\Filament\Actions\ProcessUploadedImageAction; use App\Filament\Enums\ImageUploadType; use App\Filament\Resources\EventResource; -use App\Models\Achievement; -use App\Models\EventAchievement; +use App\Models\Event; use App\Models\Game; use App\Models\System; -use App\Platform\Enums\AchievementFlag; -use App\Platform\Jobs\UpdateGameMetricsJob; +use App\Platform\Actions\AddAchievementsToEventAction; use Filament\Resources\Pages\CreateRecord; use Illuminate\Database\Eloquent\Model; @@ -37,35 +35,18 @@ protected function handleRecordCreation(array $data): Model ]); $data['legacy_game_id'] = $game->id; + // these fields don't actually exist on the event record. don't pass to create(). $numberOfAchievements = (int) $data['numberOfAchievements']; unset($data['numberOfAchievements']); $user_id = $data['user_id']; unset($data['user_id']); // create the event record + /** @var Event $event */ $event = static::getModel()::create($data); // create the number of requested achievements - for ($i = 0; $i < $numberOfAchievements; $i++) { - $achievement = Achievement::create([ - 'Title' => 'Placeholder', - 'Description' => 'TBD', - 'MemAddr' => '0=1', - 'Points' => 1, - 'Flags' => AchievementFlag::OfficialCore->value, - 'GameID' => $game->id, - 'user_id' => $user_id, - 'BadgeName' => '00000', - 'DisplayOrder' => $i + 1, - ]); - - EventAchievement::create([ - 'achievement_id' => $achievement->id, - ]); - } - - // update metrics and sync to game_achievement_set - dispatch(new UpdateGameMetricsJob($game->id))->onQueue('game-metrics'); + (new AddAchievementsToEventAction())->execute($event, $numberOfAchievements, $user_id); return $event; } diff --git a/app/Filament/Resources/EventResource/RelationManagers/AchievementsRelationManager.php b/app/Filament/Resources/EventResource/RelationManagers/AchievementsRelationManager.php index 75ef75ab22..b13dcad0d8 100644 --- a/app/Filament/Resources/EventResource/RelationManagers/AchievementsRelationManager.php +++ b/app/Filament/Resources/EventResource/RelationManagers/AchievementsRelationManager.php @@ -7,6 +7,7 @@ use App\Models\Event; use App\Models\EventAchievement; use App\Models\User; +use App\Platform\Actions\AddAchievementsToEventAction; use App\Platform\Jobs\UnlockPlayerAchievementJob; use Carbon\Carbon; use Filament\Forms; @@ -79,7 +80,30 @@ public function table(Table $table): Table ]) ->headerActions([ - + Tables\Actions\Action::make('add-achievements') + ->label('Add additional achievements') + ->modalHeading('Add additional achievements') + ->form([ + Forms\Components\TextInput::make('numberOfAchievements') + ->label('Number of achievements') + ->numeric() + ->default(1) + ->required(), + ]) + ->action(function (array $data): void { + $numberOfAchievements = (int) $data['numberOfAchievements']; + /** @var Event $event */ + $event = $this->getOwnerRecord(); + $user_id = $event->publishedAchievements->first()?->achievement->user_id ?? EventAchievement::RAEVENTS_USER_ID; + + (new AddAchievementsToEventAction())->execute($event, $numberOfAchievements, $user_id); + + Notification::make() + ->title("Created $numberOfAchievements new " . Str::plural('achievement', $numberOfAchievements)) + ->success() + ->send(); + }) + ->visible(fn () => $user->can('manage', Event::class)), ]) ->actions([ Tables\Actions\ActionGroup::make([ diff --git a/app/Models/Event.php b/app/Models/Event.php index ad1511d428..5e07d6c6c2 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -136,6 +136,14 @@ public function achievements(): HasManyThrough )->with('achievement.game'); } + /** + * @return HasManyThrough + */ + public function publishedAchievements(): HasManyThrough + { + return $this->achievements()->published(); + } + /** * @return BelongsToMany */ diff --git a/app/Models/EventAchievement.php b/app/Models/EventAchievement.php index abd297f0e9..62c59c1564 100644 --- a/app/Models/EventAchievement.php +++ b/app/Models/EventAchievement.php @@ -146,11 +146,22 @@ public function scopeActive(Builder $query, ?Carbon $timestamp = null): Builder { $timestamp ??= Carbon::now(); - return $query->where(function ($q) use ($timestamp) { + return $query->published()->where(function ($q) use ($timestamp) { $q->where('active_from', '<=', $timestamp)->orWhereNull('active_from'); }) ->where(function ($q) use ($timestamp) { $q->where('active_until', '>', $timestamp)->orWhereNull('active_until'); }); } + + /** + * @param Builder $query + * @return Builder + */ + public function scopePublished(Builder $query): Builder + { + return $query->whereHas('achievement', function ($q) { + $q->published(); + }); + } } diff --git a/app/Platform/Actions/AddAchievementsToEventAction.php b/app/Platform/Actions/AddAchievementsToEventAction.php new file mode 100644 index 0000000000..48475f01eb --- /dev/null +++ b/app/Platform/Actions/AddAchievementsToEventAction.php @@ -0,0 +1,43 @@ +achievements->max('achievement.DisplayOrder') ?? 0; + + // create the number of requested achievements + for ($i = 0; $i < $numberOfAchievements; $i++) { + $displayOrder++; + + $achievement = Achievement::create([ + 'Title' => 'Placeholder', + 'Description' => 'TBD', + 'MemAddr' => '0=1', + 'Points' => 1, + 'Flags' => AchievementFlag::OfficialCore->value, + 'GameID' => $event->legacyGame->id, + 'user_id' => $user_id, + 'BadgeName' => '00000', + 'DisplayOrder' => $displayOrder, + ]); + + EventAchievement::create([ + 'achievement_id' => $achievement->id, + ]); + } + + // update metrics and sync to game_achievement_set + dispatch(new UpdateGameMetricsJob($event->legacyGame->id))->onQueue('game-metrics'); + } +}