mirror of
https://github.com/AnimeThemes/animethemes-server.git
synced 2026-07-11 01:24:46 +02:00
feat: artist member relevance (#985)
This commit is contained in:
@@ -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'));
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user