Skip to content

Commit c8cd2de

Browse files
committed
MBS-14075: Adjust edits_pending for entities with open relationship edits
I can't think of any reason we shouldn't do this, and it will prevent the RemoveEmpty script from deleting entities that only have pending relationship edits, as was the case in MBS-14075.
1 parent cd115ae commit c8cd2de

File tree

6 files changed

+180
-10
lines changed

6 files changed

+180
-10
lines changed

lib/MusicBrainz/Server/Edit/Relationship/Create.pm

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,30 @@ sub adjust_edit_pending
263263
{
264264
my ($self, $adjust) = @_;
265265

266-
$self->c->model('Relationship')->adjust_edit_pending(
267-
$self->data->{type0}, $self->data->{type1},
268-
$adjust, $self->entity_id);
266+
my $c = $self->c;
267+
my $data = $self->data;
268+
269+
my $type0 = $data->{type0};
270+
my $type1 = $data->{type1};
271+
272+
$c->model('Relationship')->adjust_edit_pending(
273+
$type0, $type1,
274+
$adjust,
275+
$self->entity_id,
276+
);
277+
278+
my $model0 = type_to_model($type0);
279+
my $model1 = type_to_model($type1);
280+
if ($model0 eq $model1) {
281+
$c->model($model0)->adjust_edit_pending(
282+
$adjust,
283+
$data->{entity0}{id},
284+
$data->{entity1}{id},
285+
);
286+
} else {
287+
$c->model($model0)->adjust_edit_pending($adjust, $data->{entity0}{id});
288+
$c->model($model1)->adjust_edit_pending($adjust, $data->{entity1}{id});
289+
}
269290
}
270291

271292
sub insert

lib/MusicBrainz/Server/Edit/Relationship/Delete.pm

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,31 @@ sub adjust_edit_pending
220220
{
221221
my ($self, $adjust) = @_;
222222

223+
my $c = $self->c;
224+
225+
my $relationship = $self->data->{relationship};
226+
my $link_type = $relationship->{link}{type};
227+
my $type0 = $link_type->{entity0_type};
228+
my $type1 = $link_type->{entity1_type};
229+
223230
$self->c->model('Relationship')->adjust_edit_pending(
224-
$self->data->{relationship}{link}{type}{entity0_type},
225-
$self->data->{relationship}{link}{type}{entity1_type},
226-
$adjust, $self->data->{relationship}{id});
231+
$type0, $type1,
232+
$adjust,
233+
$relationship->{id},
234+
);
235+
236+
my $model0 = type_to_model($type0);
237+
my $model1 = type_to_model($type1);
238+
if ($model0 eq $model1) {
239+
$c->model($model0)->adjust_edit_pending(
240+
$adjust,
241+
$relationship->{entity0}{id},
242+
$relationship->{entity1}{id},
243+
);
244+
} else {
245+
$c->model($model0)->adjust_edit_pending($adjust, $relationship->{entity0}{id});
246+
$c->model($model1)->adjust_edit_pending($adjust, $relationship->{entity1}{id});
247+
}
227248
}
228249

229250
sub initialize

lib/MusicBrainz/Server/Edit/Relationship/Edit.pm

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use namespace::autoclean;
44
use Carp;
55
use Clone qw( clone );
66
use Data::Compare;
7-
use List::AllUtils qw( sort_by );
7+
use List::AllUtils qw( sort_by uniq );
88
use Moose::Util::TypeConstraints qw( as subtype find_type_constraint );
99
use MooseX::Types::Moose qw( Bool Int Str );
1010
use MooseX::Types::Structured qw( Dict Optional );
@@ -285,9 +285,41 @@ sub adjust_edit_pending
285285
{
286286
my ($self, $adjust) = @_;
287287

288-
$self->c->model('Relationship')->adjust_edit_pending(
289-
$self->data->{type0}, $self->data->{type1},
290-
$adjust, $self->data->{relationship_id});
288+
my $c = $self->c;
289+
my $data = $self->data;
290+
291+
my $type0 = $data->{type0};
292+
my $type1 = $data->{type1};
293+
my $old = $data->{old};
294+
my $new = $data->{new};
295+
my $link = $data->{link};
296+
297+
$c->model('Relationship')->adjust_edit_pending(
298+
$type0, $type1,
299+
$adjust,
300+
$data->{relationship_id},
301+
);
302+
303+
my $model0 = type_to_model($type0);
304+
my $model1 = type_to_model($type1);
305+
my (@entity0_ids, @entity1_ids);
306+
307+
for my $source ($link, $old, $new) {
308+
push @entity0_ids, $source->{entity0}{id}
309+
if exists $source->{entity0};
310+
push @entity1_ids, $source->{entity1}{id}
311+
if exists $source->{entity1};
312+
}
313+
314+
if ($model0 eq $model1) {
315+
$c->model($model0)->adjust_edit_pending(
316+
$adjust,
317+
uniq (@entity0_ids, @entity1_ids),
318+
);
319+
} else {
320+
$c->model($model0)->adjust_edit_pending($adjust, uniq @entity0_ids);
321+
$c->model($model1)->adjust_edit_pending($adjust, uniq @entity1_ids);
322+
}
291323
}
292324

293325
sub _mapping {

t/lib/t/MusicBrainz/Server/Edit/Relationship/Create.pm

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,27 @@ test 'MBS-13862: entity0 is loaded for display when it has the same type as enti
187187
);
188188
};
189189

190+
test 'MBS-14075: edits_pending is adjusted for both entities' => sub {
191+
my $test = shift;
192+
my $c = $test->c;
193+
194+
MusicBrainz::Server::Test->prepare_test_database($c, '+edit_relationship_edit');
195+
196+
my $edit = _create_edit($c);
197+
198+
my $e0 = $c->model('Artist')->get_by_id(3);
199+
my $e1 = $c->model('Artist')->get_by_id(4);
200+
is($e0->edits_pending, 1, 'edits_pending was incremented for entity0');
201+
is($e1->edits_pending, 1, 'edits_pending was incremented for entity1');
202+
203+
accept_edit($c, $edit);
204+
205+
$e0 = $c->model('Artist')->get_by_id(3);
206+
$e1 = $c->model('Artist')->get_by_id(4);
207+
is($e0->edits_pending, 0, 'edits_pending was decremented for entity0');
208+
is($e1->edits_pending, 0, 'edits_pending was decremented for entity1');
209+
};
210+
190211
sub _create_edit {
191212
my ($c, %args) = @_;
192213

t/lib/t/MusicBrainz/Server/Edit/Relationship/Delete.pm

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,37 @@ test 'MBS-13862: entity0 is loaded for display when it has the same type as enti
250250
);
251251
};
252252

253+
test 'MBS-14075: edits_pending is adjusted for both entities' => sub {
254+
my $test = shift;
255+
my $c = $test->c;
256+
257+
MusicBrainz::Server::Test->prepare_test_database($c, '+edit_relationship_delete');
258+
259+
my $relationship = _get_relationship($c, 'artist', 'url', 1);
260+
my $edit = $c->model('Edit')->create(
261+
edit_type => $EDIT_RELATIONSHIP_DELETE,
262+
editor => $c->model('Editor')->get_by_id(1),
263+
type0 => 'artist',
264+
type1 => 'url',
265+
relationship => $relationship,
266+
);
267+
268+
ok($edit->is_open, 'edit is still open');
269+
270+
my $artist = $c->model('Artist')->get_by_id(3);
271+
my $url = $c->model('URL')->get_by_id(1);
272+
is($artist->edits_pending, 1, 'edits_pending was incremented for entity0');
273+
is($url->edits_pending, 1, 'edits_pending was incremented for entity1');
274+
275+
accept_edit($c, $edit);
276+
277+
$artist = $c->model('Artist')->get_by_id(3);
278+
$url = $c->model('URL')->get_by_id(1);
279+
is($artist->edits_pending, 0, 'edits_pending was decremented for entity0');
280+
is($url->edits_pending, 0, 'edits_pending was decremented for entity1');
281+
282+
};
283+
253284
sub _get_relationship {
254285
my ($c, $type0, $type1, $id) = @_;
255286

t/lib/t/MusicBrainz/Server/Edit/Relationship/Edit.pm

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,50 @@ test 'MBS-13862: entity0 is loaded for display when it has the same type as enti
546546
);
547547
};
548548

549+
test 'MBS-14075: edits_pending is adjusted for all entities' => sub {
550+
my $test = shift;
551+
my $c = $test->c;
552+
553+
MusicBrainz::Server::Test->prepare_test_database($c, '+edit_relationship_edit');
554+
555+
my $rel = $c->model('Relationship')->get_by_id('release', 'url', 1);
556+
$c->model('Link')->load($rel);
557+
$c->model('LinkType')->load($rel->link);
558+
559+
my ($release, $old_url);
560+
my $new_url = $c->model('URL')->find_or_insert(
561+
'https://www.amazon.com/gp/product/B00000000Y',
562+
);
563+
564+
my $edit = $c->model('Edit')->create(
565+
edit_type => $EDIT_RELATIONSHIP_EDIT,
566+
editor_id => 1,
567+
relationship => $rel,
568+
link_type => $c->model('LinkType')->get_by_id(77),
569+
begin_date => undef,
570+
end_date => undef,
571+
entity1 => $new_url,
572+
);
573+
574+
ok($edit->is_open, 'edit is still open');
575+
576+
$release = $c->model('Release')->get_by_id(2);
577+
$old_url = $c->model('URL')->get_by_id(263685);
578+
$new_url = $c->model('URL')->get_by_gid($new_url->gid);
579+
is($release->edits_pending, 1, 'edits_pending was incremented for entity0');
580+
is($old_url->edits_pending, 1, 'edits_pending was incremented for the old entity1');
581+
is($new_url->edits_pending, 1, 'edits_pending was incremented for the new entity1');
582+
583+
accept_edit($c, $edit);
584+
585+
$release = $c->model('Release')->get_by_id(2);
586+
$old_url = $c->model('URL')->get_by_id(263685);
587+
$new_url = $c->model('URL')->get_by_gid($new_url->gid);
588+
is($release->edits_pending, 0, 'edits_pending was decremented for entity0');
589+
is($old_url->edits_pending, 0, 'edits_pending was decremented for the old entity1');
590+
is($new_url->edits_pending, 0, 'edits_pending was decremented for the new entity1');
591+
};
592+
549593
sub _create_edit {
550594
my ($c, %args) = @_;
551595

0 commit comments

Comments
 (0)