Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions lib/MusicBrainz/Server/Controller/WS/js/Edit.pm
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,12 @@ our $data_processors = {

$EDIT_RELATIONSHIP_EDIT => \&process_relationship,

$EDIT_RELATIONSHIP_DELETE => sub {
my ($c, $loader, $data) = @_;

process_entered_from($c, $loader, $data);
},

$EDIT_RELATIONSHIPS_REORDER => sub {
my ($c, $loader, $data) = @_;

Expand All @@ -216,6 +222,8 @@ our $data_processors = {
$ordering->{new_order} = $new_order;
$ordering->{old_order} = $relationship->link_order;
}

process_entered_from($c, $loader, $data);
},

$EDIT_RELEASE_REORDER_MEDIUMS => sub {
Expand Down Expand Up @@ -272,6 +280,8 @@ sub process_entity {
$data->{comment} = substr($data->{comment}, 0, 255);
}

process_entered_from($c, $loader, $data);

process_artist_credit($c, $loader, $data);
}

Expand Down Expand Up @@ -351,6 +361,19 @@ sub process_artist_credit {
if defined $data->{artist_credit};
}

sub process_entered_from {
my ($c, $loader, $data) = @_;

if (defined $data->{enteredFrom}) {
my $entered_from = delete $data->{enteredFrom};
my $entity_model = type_to_model($entered_from->{entity_type});
my $entity = $c->model($entity_model)->get_by_gid($entered_from->{gid});
if ($entity) {
$data->{entered_from} = $entered_from;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest not submitting the entity name with enteredFrom, since it doesn't seem to serve a purpose and can only cause issues (either it's already identical to $entity->name, or it contains bad data).

Suggested change
$data->{entered_from} = $entered_from;
$data->{entered_from} = {
entity_type => $entity_type,
gid => $gid,
name => $entity->name,
};

}
}
}

sub process_medium {
my ($c, $loader, $data) = @_;

Expand Down Expand Up @@ -460,6 +483,8 @@ sub process_relationship {
);
}

process_entered_from($c, $loader, $data);

delete $data->{id};
delete $data->{linkTypeID};
delete $data->{entities};
Expand Down
10 changes: 9 additions & 1 deletion lib/MusicBrainz/Server/Edit/Relationship/Create.pm
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,21 @@ package MusicBrainz::Server::Edit::Relationship::Create;
use Moose;

use List::AllUtils qw( any );
use MusicBrainz::Server::Edit::Types qw( LinkAttributesArray PartialDateHash Nullable NullableOnPreview );
use MusicBrainz::Server::Edit::Types qw(
EnteredFromEntity
LinkAttributesArray
PartialDateHash
Nullable
NullableOnPreview
);
use MusicBrainz::Server::Translation qw( N_lp );

extends 'MusicBrainz::Server::Edit::Generic::Create';
with 'MusicBrainz::Server::Edit::Relationship',
'MusicBrainz::Server::Edit::Relationship::RelatedEntities',
'MusicBrainz::Server::Edit::Role::Preview',
'MusicBrainz::Server::Edit::Role::DatePeriod',
'MusicBrainz::Server::Edit::Role::EnteredFrom',
'MusicBrainz::Server::Edit::Role::AlwaysAutoEdit';

use MooseX::Types::Moose qw( Bool Int Str );
Expand Down Expand Up @@ -54,6 +61,7 @@ has '+data' => (
reverse_link_phrase => Str,
long_link_phrase => Str,
],
entered_from => EnteredFromEntity,
attributes => Nullable[LinkAttributesArray],
begin_date => Nullable[PartialDateHash],
end_date => Nullable[PartialDateHash],
Expand Down
9 changes: 8 additions & 1 deletion lib/MusicBrainz/Server/Edit/Relationship/Delete.pm
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ use MusicBrainz::Server::Data::Utils qw(
type_to_model
);
use MusicBrainz::Server::Edit::Utils qw( gid_or_id );
use MusicBrainz::Server::Edit::Types qw( LinkAttributesArray PartialDateHash );
use MusicBrainz::Server::Edit::Types qw(
EnteredFromEntity
LinkAttributesArray
PartialDateHash
);
use MusicBrainz::Server::Entity::Types;
use MusicBrainz::Server::Entity::Util::JSON qw( to_json_object );
use MooseX::Types::Moose qw( Int Str Bool );
Expand All @@ -30,6 +34,7 @@ use MusicBrainz::Server::Translation qw( N_l N_lp );
extends 'MusicBrainz::Server::Edit';
with 'MusicBrainz::Server::Edit::Relationship',
'MusicBrainz::Server::Edit::Relationship::RelatedEntities',
'MusicBrainz::Server::Edit::Role::EnteredFrom',
'MusicBrainz::Server::Edit::Role::Preview';

sub edit_type { $EDIT_RELATIONSHIP_DELETE }
Expand Down Expand Up @@ -68,6 +73,7 @@ has '+data' => (
],
],
],
entered_from => EnteredFromEntity,
edit_version => Optional[Int],
],
);
Expand Down Expand Up @@ -268,6 +274,7 @@ sub initialize
},
},
edit_version => 2,
defined $opts{entered_from} ? (entered_from => $opts{entered_from}) : (),
});
}

Expand Down
13 changes: 12 additions & 1 deletion lib/MusicBrainz/Server/Edit/Relationship/Edit.pm
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@ use MusicBrainz::Server::Edit::Exceptions;
use MusicBrainz::Server::Entity::LinkAttribute;
use MusicBrainz::Server::Entity::Types;
use MusicBrainz::Server::Entity::Util::JSON qw( to_json_object );
use MusicBrainz::Server::Edit::Types qw( LinkAttributesArray PartialDateHash Nullable NullableOnPreview );
use MusicBrainz::Server::Edit::Types qw(
EnteredFromEntity
LinkAttributesArray
PartialDateHash
Nullable
NullableOnPreview
);
use MusicBrainz::Server::Data::Utils qw(
boolean_to_json
partial_date_to_hash
Expand All @@ -34,6 +40,7 @@ extends 'MusicBrainz::Server::Edit::WithDifferences';
with 'MusicBrainz::Server::Edit::Relationship',
'MusicBrainz::Server::Edit::Relationship::RelatedEntities',
'MusicBrainz::Server::Edit::Role::Preview',
'MusicBrainz::Server::Edit::Role::EnteredFrom',
'MusicBrainz::Server::Edit::Role::DatePeriod';

sub edit_type { $EDIT_RELATIONSHIP_EDIT }
Expand Down Expand Up @@ -101,6 +108,7 @@ has '+data' => (
entity0_credit => Optional[Str],
entity1_credit => Optional[Str],
link => find_type_constraint('LinkHash'),
entered_from => EnteredFromEntity,
new => find_type_constraint('RelationshipHash'),
old => find_type_constraint('RelationshipHash'),
edit_version => Optional[Int],
Expand Down Expand Up @@ -366,6 +374,8 @@ sub initialize
my ($self, %opts) = @_;

my $relationship = delete $opts{relationship};
my $entered_from = delete $opts{entered_from};

my $link = $relationship->link;
my $type0 = $link->type->entity0_type;
my $type1 = $link->type->entity1_type;
Expand Down Expand Up @@ -461,6 +471,7 @@ sub initialize
entity0_credit => $relationship->entity0_credit,
entity1_credit => $relationship->entity1_credit,
edit_version => 2,
defined $entered_from ? (entered_from => $entered_from) : (),
$self->_change_data($relationship, %opts),
});
}
Expand Down
8 changes: 7 additions & 1 deletion lib/MusicBrainz/Server/Edit/Relationship/Reorder.pm
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ use MusicBrainz::Server::Constants qw(
);
use MusicBrainz::Server::Data::Utils qw( partial_date_to_hash type_to_model );
use MusicBrainz::Server::Edit::Exceptions;
use MusicBrainz::Server::Edit::Types qw( PartialDateHash LinkAttributesArray );
use MusicBrainz::Server::Edit::Types qw(
EnteredFromEntity
PartialDateHash
LinkAttributesArray
);
use MusicBrainz::Server::Entity::Util::JSON qw( to_json_object );
use MusicBrainz::Server::Translation qw ( N_lp );
use aliased 'MusicBrainz::Server::Entity::Link';
Expand All @@ -21,6 +25,7 @@ use aliased 'MusicBrainz::Server::Entity::Relationship';
extends 'MusicBrainz::Server::Edit';
with 'MusicBrainz::Server::Edit::Role::AlwaysAutoEdit',
'MusicBrainz::Server::Edit::Role::Preview',
'MusicBrainz::Server::Edit::Role::EnteredFrom',
'MusicBrainz::Server::Edit::Relationship',
'MusicBrainz::Server::Edit::Relationship::RelatedEntities';

Expand Down Expand Up @@ -67,6 +72,7 @@ has '+data' => (
new_order => Int,
],
],
entered_from => EnteredFromEntity,
edit_version => Optional[Int],
],
);
Expand Down
45 changes: 45 additions & 0 deletions lib/MusicBrainz/Server/Edit/Role/EnteredFrom.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package MusicBrainz::Server::Edit::Role::EnteredFrom;
use Moose::Role;

use MusicBrainz::Server::Constants qw( %ENTITIES );

around build_display_data => sub {
my ($orig, $self, @args) = @_;

my $data = $self->$orig(@args);

my $entered_from_data = $self->data->{entered_from};

if ($entered_from_data) {
my $entity_properties = $ENTITIES{ $entered_from_data->{entity_type} };
my $model = $entity_properties->{model};

my $entity_class = "MusicBrainz::Server::Entity::$model";

my $entity = $self->c->model($model)->get_by_gid($entered_from_data->{gid}) ||
$entity_class->new(
name => $entered_from_data->{name},
);

$self->c->model('ArtistCredit')->load($entity)
if $entity_properties->{artist_credits};

$data->{entered_from} = $entity->TO_JSON;
}

return $data;
};

no Moose::Role;
1;

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2025 MetaBrainz Foundation

This file is part of MusicBrainz, the open internet music database,
and is licensed under the GPL version 2, or (at your option) any
later version: http://www.gnu.org/licenses/gpl-2.0.txt

=cut

9 changes: 9 additions & 0 deletions lib/MusicBrainz/Server/Edit/Types.pm
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use warnings;
use MooseX::Types -declare => [qw(
ArtistCreditDefinition
CoordinateHash
EnteredFromEntity
LinkAttributesArray
PartialDateHash
RecordingMergesArray
Expand All @@ -15,6 +16,7 @@ use Sub::Exporter -setup => { exports => [qw(
ArtistCreditDefinition
Changeset
CoordinateHash
EnteredFromEntity
LinkAttributesArray
Nullable
NullableOnPreview
Expand Down Expand Up @@ -66,6 +68,13 @@ subtype ArtistCreditDefinition,
preview => Optional[Str],
];

subtype EnteredFromEntity,
as Optional[Dict[
entity_type => Str,
gid => NullableOnPreview[Str],
name => Str,
]];

subtype LinkAttributesArray,
as ArrayRef[Dict[
type => Dict[
Expand Down
4 changes: 3 additions & 1 deletion lib/MusicBrainz/Server/Edit/Work/Create.pm
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ use Moose;
use MooseX::Types::Moose qw( ArrayRef Int Maybe Str );
use MooseX::Types::Structured qw( Dict Optional );
use MusicBrainz::Server::Constants qw( $EDIT_WORK_CREATE );
use MusicBrainz::Server::Edit::Types qw( Nullable );
use MusicBrainz::Server::Edit::Types qw( EnteredFromEntity Nullable );
use MusicBrainz::Server::Entity::Util::JSON qw( to_json_array to_json_object );
use MusicBrainz::Server::Translation qw( N_lp );

extends 'MusicBrainz::Server::Edit::Generic::Create';
with 'MusicBrainz::Server::Edit::Work::RelatedEntities',
'MusicBrainz::Server::Edit::Work',
'MusicBrainz::Server::Edit::Role::AlwaysAutoEdit',
'MusicBrainz::Server::Edit::Role::EnteredFrom',
'MusicBrainz::Server::Edit::Role::CheckOverlongString' => {
get_string => sub { shift->{name} },
};
Expand All @@ -28,6 +29,7 @@ has '+data' => (
isa => Dict[
name => Str,
comment => Nullable[Str],
entered_from => EnteredFromEntity,
type_id => Nullable[Int],
language_id => Nullable[Int],
languages => Optional[ArrayRef[Int]],
Expand Down
3 changes: 3 additions & 0 deletions root/edit/EditIndex.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {editorMayAddNote, editorMayVoteOnEdit}
from '../utility/edit.js';
import formatUserDate from '../utility/formatUserDate.js';

import EditEnteredFrom from './components/EditEnteredFrom.js';
import EditHeader from './components/EditHeader.js';
import EditNotes from './components/EditNotes.js';
import EditorTypeInfo from './components/EditorTypeInfo.js';
Expand All @@ -50,6 +51,8 @@ component EditIndex(
<Layout fullWidth={fullWidth} title={texp.l('Edit #{id}', {id: edit.id})}>
<div id="content">
<EditHeader edit={edit} />
<EditEnteredFrom edit={edit} />


<h2>{l('Changes')}</h2>
{edit.data ? detailsElement : (
Expand Down
32 changes: 32 additions & 0 deletions root/edit/components/EditEnteredFrom.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* @flow strict
* Copyright (C) 2025 MetaBrainz Foundation
*
* This file is part of MusicBrainz, the open internet music database,
* and is licensed under the GPL version 2, or (at your option) any
* later version: http://www.gnu.org/licenses/gpl-2.0.txt
*/

import DescriptiveLink
from '../../static/scripts/common/components/DescriptiveLink.js';

component EditEnteredFrom(
edit: {
+display_data?: {
+entered_from?: NonUrlRelatableEntityT,
...
},
...
},
) {
const enteredFrom = edit.display_data?.entered_from;
return enteredFrom ? (
<div className="entered-from">
{addColonText(l('Entered from'))}
{' '}
<DescriptiveLink entity={enteredFrom} />
</div>
) : null;
}

export default EditEnteredFrom;
2 changes: 2 additions & 0 deletions root/edit/components/ListEdit.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {SanitizedCatalystContext} from '../../context.mjs';
import {getEditStatusClass} from '../../utility/edit.js';
import getEditDetailsElement from '../utility/getEditDetailsElement.js';

import EditEnteredFrom from './EditEnteredFrom.js';
import EditHeader from './EditHeader.js';
import EditNotes from './EditNotes.js';
import EditSummary from './EditSummary.js';
Expand All @@ -29,6 +30,7 @@ component ListEdit(
return (
<div className="edit-list">
<EditHeader edit={edit} isSummary voter={voter} />
<EditEnteredFrom edit={edit} />

<input
name={`enter-vote.vote.${index}.edit_id`}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,15 @@ async function wsJsEditSubmission(
}
const submissionData = {
editNote: state.editNoteField.value,
edits: edits.map(([/* relationships */, wsJsEdit]) => wsJsEdit),
edits: edits.map(([/* relationships */, wsJsEdit]) => {
const enteredFrom = {
entity_type: state.entity.entityType,
gid: state.entity.gid,
name: state.entity.name,
};
const amendedWsJsEdit = {...wsJsEdit, enteredFrom};
return amendedWsJsEdit;
}),
makeVotable: state.enterEditForm.field.make_votable.value,
};
await sleep(500);
Expand Down
Loading