Skip to content

Commit

Permalink
Merge branch 'master' into user-profile-name-history
Browse files Browse the repository at this point in the history
  • Loading branch information
wescopeland authored Feb 1, 2025
2 parents 034f412 + d1c5576 commit 4b8be1d
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 27 deletions.
4 changes: 3 additions & 1 deletion app/Filament/Resources/EventResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -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),

Expand All @@ -134,6 +135,7 @@ public static function form(Form $form): Form
->rules(['alpha_dash'])
->minLength(4)
->maxLength(20)
->unique()
->required()
->columnSpan(2),

Expand Down
29 changes: 5 additions & 24 deletions app/Filament/Resources/EventResource/Pages/Create.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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([
Expand Down
8 changes: 8 additions & 0 deletions app/Models/Event.php
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,14 @@ public function achievements(): HasManyThrough
)->with('achievement.game');
}

/**
* @return HasManyThrough<EventAchievement>
*/
public function publishedAchievements(): HasManyThrough
{
return $this->achievements()->published();
}

/**
* @return BelongsToMany<GameSet>
*/
Expand Down
13 changes: 12 additions & 1 deletion app/Models/EventAchievement.php
Original file line number Diff line number Diff line change
Expand Up @@ -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<EventAchievement> $query
* @return Builder<EventAchievement>
*/
public function scopePublished(Builder $query): Builder
{
return $query->whereHas('achievement', function ($q) {
$q->published();
});
}
}
43 changes: 43 additions & 0 deletions app/Platform/Actions/AddAchievementsToEventAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

declare(strict_types=1);

namespace App\Platform\Actions;

use App\Models\Achievement;
use App\Models\Event;
use App\Models\EventAchievement;
use App\Platform\Enums\AchievementFlag;
use App\Platform\Jobs\UpdateGameMetricsJob;

class AddAchievementsToEventAction
{
public function execute(Event $event, int $numberOfAchievements, int $user_id): void
{
$displayOrder = $event->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');
}
}

0 comments on commit 4b8be1d

Please sign in to comment.