feat: artist member relevance (#985)

This commit is contained in:
Kyrch
2025-10-30 18:20:49 -03:00
committed by GitHub
parent 270ca8ed7b
commit e0011d8e98
9 changed files with 61 additions and 14 deletions
@@ -148,12 +148,7 @@ class ManageSongPerformances
}
});
// Update artist_member table to match memberships
ArtistMember::query()->upsert(
$memberships,
[ArtistMember::ATTRIBUTE_ARTIST, ArtistMember::ATTRIBUTE_MEMBER],
[ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_AS],
);
$this->syncArtistMembers($memberships);
$this->syncSongArtist();
@@ -169,10 +164,28 @@ class ManageSongPerformances
return $this;
}
/**
* Update artist_member table to match memberships.
*/
protected function syncArtistMembers(array $memberships): void
{
foreach ($memberships as $index => $membership) {
ArtistMember::query()
->updateOrCreate([
ArtistMember::ATTRIBUTE_ARTIST => Arr::get($membership, Membership::ATTRIBUTE_ARTIST),
ArtistMember::ATTRIBUTE_MEMBER => Arr::get($membership, Membership::ATTRIBUTE_MEMBER),
], [
ArtistMember::ATTRIBUTE_ALIAS => Arr::get($membership, Membership::ATTRIBUTE_ALIAS),
ArtistMember::ATTRIBUTE_AS => Arr::get($membership, Membership::ATTRIBUTE_AS),
ArtistMember::ATTRIBUTE_RELEVANCE => $index + 1,
]);
}
}
/**
* Temporary function where the performances feature synchronizes with the artist_song pivot table.
*/
public function syncSongArtist(): void
protected function syncSongArtist(): void
{
/** @var Song $song */
$song = Song::query()
@@ -6,6 +6,7 @@ namespace App\Events\Wiki\Song\Performance;
use App\Contracts\Events\UpdateRelatedIndicesEvent;
use App\Events\Base\Wiki\WikiCreatedEvent;
use App\Models\Wiki\Song\Membership;
use App\Models\Wiki\Song\Performance;
/**
@@ -18,7 +19,7 @@ class PerformanceCreated extends WikiCreatedEvent implements UpdateRelatedIndice
$performance = $this->getModel();
$song = $performance->song;
$artist = $performance->artist;
$artist = $performance->artist instanceof Membership ? $performance->artist->group : $performance->artist;
$artistName = $performance->alias ?? $artist->getName();
$artistName = filled($performance->as) ? "{$performance->as} (CV: {$artistName})" : $artistName;
@@ -22,7 +22,7 @@ class PerformanceDeleted extends WikiDeletedEvent implements UpdateRelatedIndice
$performance = $this->getModel();
$song = $performance->song;
$artist = $performance->artist;
$artist = $performance->artist instanceof Membership ? $performance->artist->group : $performance->artist;
$artistName = $performance->alias ?? $artist->getName();
$artistName = filled($performance->as) ? "{$performance->as} (CV: {$artistName})" : $artistName;
@@ -11,6 +11,7 @@ use App\Pivots\Wiki\ArtistMember;
use Filament\Actions\Action;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Arr;
class LoadMembersAction extends Action
@@ -36,7 +37,11 @@ class LoadMembersAction extends Action
/** @var Artist $group */
$group = Artist::query()
->with([Artist::RELATION_MEMBERS])
->with([
Artist::RELATION_MEMBERS => function (BelongsToMany $relation): void {
$relation->orderBy(ArtistMember::ATTRIBUTE_RELEVANCE);
},
])
->find($artistId);
$set(PerformanceForm::REPEATER_MEMBERSHIPS, $group->members->map(fn (Artist $member): array => [
@@ -32,7 +32,7 @@ class ImageRelationManager extends BaseRelationManager
$table
->recordTitleAttribute(Image::ATTRIBUTE_PATH)
->reorderable(Imageable::ATTRIBUTE_DEPTH)
->defaultSort(Image::TABLE.'.'.Image::ATTRIBUTE_ID, 'desc')
->defaultSort(Imageable::ATTRIBUTE_DEPTH)
);
}
@@ -62,6 +62,8 @@ class MemberArtistRelationManager extends ArtistRelationManager
$table
->inverseRelationship(Artist::RELATION_GROUPS)
)
->reorderable(ArtistMember::ATTRIBUTE_RELEVANCE)
->defaultSort(ArtistMember::ATTRIBUTE_RELEVANCE)
->heading(__('filament.resources.label.members'))
->modelLabel(__('filament.resources.singularLabel.member'));
}
+1 -1
View File
@@ -246,7 +246,7 @@ class Artist extends BaseModel implements HasImages, HasResources, SoftDeletable
{
return $this->belongsToMany(Artist::class, ArtistMember::TABLE, ArtistMember::ATTRIBUTE_ARTIST, ArtistMember::ATTRIBUTE_MEMBER)
->using(ArtistMember::class)
->withPivot([ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_AS, ArtistMember::ATTRIBUTE_NOTES])
->withPivot([ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_AS, ArtistMember::ATTRIBUTE_NOTES, ArtistMember::ATTRIBUTE_RELEVANCE])
->as(ArtistMemberResource::$wrap)
->withTimestamps();
}
+5 -2
View File
@@ -18,8 +18,9 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
* @property string|null $alias
* @property string|null $as
* @property Artist $member
* @property string|null $notes
* @property int $member_id
* @property string|null $notes
* @property int|null $relevance
*
* @method static ArtistMemberFactory factory(...$parameters)
*/
@@ -32,6 +33,7 @@ class ArtistMember extends BasePivot
final public const string ATTRIBUTE_ARTIST = 'artist_id';
final public const string ATTRIBUTE_MEMBER = 'member_id';
final public const string ATTRIBUTE_NOTES = 'notes';
final public const string ATTRIBUTE_RELEVANCE = 'relevance';
final public const string RELATION_ARTIST = 'artist';
final public const string RELATION_MEMBER = 'member';
@@ -45,8 +47,9 @@ class ArtistMember extends BasePivot
ArtistMember::ATTRIBUTE_ALIAS,
ArtistMember::ATTRIBUTE_ARTIST,
ArtistMember::ATTRIBUTE_AS,
ArtistMember::ATTRIBUTE_NOTES,
ArtistMember::ATTRIBUTE_MEMBER,
ArtistMember::ATTRIBUTE_NOTES,
ArtistMember::ATTRIBUTE_RELEVANCE,
];
/**
@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
use App\Pivots\Wiki\ArtistMember;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
if (! Schema::hasColumn(ArtistMember::TABLE, ArtistMember::ATTRIBUTE_RELEVANCE)) {
Schema::table(ArtistMember::TABLE, function (Blueprint $table) {
$table->integer(ArtistMember::ATTRIBUTE_RELEVANCE)->nullable();
});
}
}
};