diff --git a/lib/AmuseWikiFarm/Archive/OAI/PMH.pm b/lib/AmuseWikiFarm/Archive/OAI/PMH.pm index 41aaa904..ae8795bf 100644 --- a/lib/AmuseWikiFarm/Archive/OAI/PMH.pm +++ b/lib/AmuseWikiFarm/Archive/OAI/PMH.pm @@ -71,9 +71,7 @@ sub update_site_records { } # create the sets for nodes here. Build a tree of them for fast lookup my $node_tree = $site->node_title_tree->{titles}; - - - + # Dlog_debug { "Node tree is $_" } [ $node_tree, [ keys %node_sets ] ]; my @files; @@ -198,6 +196,7 @@ sub update_site_records { $f->{metadata_type} = $dc_type; my $sets = delete $f->{sets} || []; my $rec = $site->oai_pmh_records->update_or_create($f, { key => 'identifier_site_id_unique' }); + Dlog_debug { "Setting the record's sets $_" } [ map { $_->set_spec } @$sets ] if @$sets; $rec->set_oai_pmh_sets($sets); } } diff --git a/lib/AmuseWikiFarm/Controller/Nodes.pm b/lib/AmuseWikiFarm/Controller/Nodes.pm index 941c680d..71410788 100644 --- a/lib/AmuseWikiFarm/Controller/Nodes.pm +++ b/lib/AmuseWikiFarm/Controller/Nodes.pm @@ -92,7 +92,7 @@ sub create :Chained('admin') :PathPart('create') :Args(0) { if (my $uri = $params{uri}) { log_info { $c->user->get('username') . " is creating nodes/$uri" }; if (my $node = $site->nodes->update_or_create_from_params(\%params, { create => 1 })) { - $c->flash(status_msg => 'COLLECTION_UPDATE'); + $c->flash(status_msg => $c->loc("Collection created")); return $c->response->redirect($c->uri_for($node->full_uri)); } else { @@ -130,12 +130,12 @@ sub update_node :Chained('edit') :PathPart('') :Args(0) { if ($params{update}) { Dlog_info { $c->user->get('username') . " is updating " . $node->full_uri . " with $_" } \%params; $node->update_from_params(\%params); - $c->flash(status_msg => 'COLLECTION_UPDATE'); + $c->flash(status_msg => $c->loc("Collection has been updated")); } elsif ($params{delete}) { Dlog_info { $c->user->get('username') . " deleted $_" } +{ $node->get_columns }; $node->delete; - $c->flash(status_msg => 'COLLECTION_UPDATE'); + $c->flash(status_msg => $c->loc("Collection has been deleted")); $c->response->redirect($c->uri_for_action('/nodes/node_root')); return; } diff --git a/lib/AmuseWikiFarm/Schema/Result/Node.pm b/lib/AmuseWikiFarm/Schema/Result/Node.pm index e0df4131..83b3e64c 100644 --- a/lib/AmuseWikiFarm/Schema/Result/Node.pm +++ b/lib/AmuseWikiFarm/Schema/Result/Node.pm @@ -284,12 +284,7 @@ sub is_root { return !shift->parent_node_id; } -has ancestors_cache => (is => 'ro', - lazy => 1, - isa => 'ArrayRef', - builder => '_build_ancestors_cache'); - -sub _build_ancestors_cache { +sub ancestors { my $self = shift; my @ancestors; my $rec = $self; @@ -298,11 +293,7 @@ sub _build_ancestors_cache { while (++$max < 10 and $rec = $rec->parent) { push @ancestors, $rec; } - return \@ancestors; -} - -sub ancestors { - return @{shift->ancestors_cache}; + return @ancestors; } sub full_uri { @@ -312,17 +303,21 @@ sub full_uri { sub update_from_params { my ($self, $params) = @_; + $params ||= {}; Dlog_debug { "Updating " . $self->full_uri . " with $_" } $params; my $site = $self->site; my @locales = $site->supported_locales; my $guard = $self->result_source->schema->txn_scope_guard; - my $oai_pmh_set = $site->oai_pmh_sets->find_or_create({ - set_spec => $self->oai_pmh_set_spec, - set_name => $self->canonical_title, - }, - { key => 'set_spec_site_id_unique' }); + my %nodes; + foreach my $n ($self, $self->ancestors) { + $nodes{$n->node_id} = $site->oai_pmh_sets->find_or_create({ + set_spec => $n->oai_pmh_set_spec, + set_name => $n->canonical_title, + }, + { key => 'set_spec_site_id_unique' }); + } # collect existing records. We will need to bump them. - my @oai_pmh_record_ids = map { $_->oai_pmh_record_id } $oai_pmh_set->oai_pmh_record_sets->all; + my @oai_pmh_record_ids = map { $_->oai_pmh_record_id } map { $_->oai_pmh_record_sets->all } values %nodes; LANG: foreach my $lang (@locales) { @@ -339,11 +334,13 @@ sub update_from_params { $body{body_html} = muse_to_object($body{body_muse})->as_html; $self->node_bodies->update_or_create(\%body); } - if (my $parent = $site->nodes->find_by_uri($params->{parent_node_uri})) { - $self->parent_node($parent); - } - else { - $self->parent_node(undef); + if (defined $params->{parent_node_uri}) { + if (my $parent = $site->nodes->find_by_uri($params->{parent_node_uri})) { + $self->parent_node($parent); + } + else { + $self->parent_node(undef); + } } if (defined $params->{sorting_pos} and $params->{sorting_pos} =~ m/\A[1-9][0-9]*\z/) { log_debug { "Setting sorting pos to $params->{sorting_pos}" }; @@ -387,12 +384,12 @@ sub update_from_params { # bumps the new ones. my $tree = $site->node_title_tree; my $self_node_id = $self->node_id; - my ($tree_spec) = grep { $_->{node_id} == $self_node_id } @{ $tree->{nodes} || []}; Dlog_debug { "Initial list of PMH records is $_" } \@oai_pmh_record_ids; - if ($tree_spec) { + foreach my $tree_spec (grep { $nodes{$_->{node_id}} } @{ $tree->{nodes} || []}) { + Dlog_debug { "Updating $_" } $tree_spec; my @new_oai_pmh_records = $site->oai_pmh_records->by_title_id($tree_spec->{title_ids})->landing_pages_only->all; # this should clear the existing one and relink - $oai_pmh_set->set_oai_pmh_records(\@new_oai_pmh_records); + $nodes{$tree_spec->{node_id}}->set_oai_pmh_records(\@new_oai_pmh_records); push @oai_pmh_record_ids, map { $_->oai_pmh_record_id } @new_oai_pmh_records; } Dlog_debug { "Final list of PMH records is $_" } \@oai_pmh_record_ids; @@ -592,13 +589,13 @@ sub title_ids { columns => [qw/id/], %hri, }); - Dlog_debug { "Direct ids for " . $self->uri . " are $_" } \@ids; + # Dlog_debug { "Direct ids for " . $self->uri . " are $_" } \@ids; my @catids = map { $_->{title_id} } $self->categories->search_related('title_categories')->search(undef, { columns => [qw/title_id/], %hri, }); - Dlog_debug { "Ids via category for " . $self->uri . " are $_" } \@catids; + # Dlog_debug { "Ids via category for " . $self->uri . " are $_" } \@catids; return [ @ids, @catids]; } @@ -618,7 +615,18 @@ sub oai_pmh_set_spec { } after insert => sub { - shift->update_full_path; + my $self = shift; + $self->update_full_path; + $self->update_from_params; +}; + +before delete => sub { + my $self = shift; + if (my $oaipmh_set = $self->site->oai_pmh_sets->find({ set_spec => $self->oai_pmh_set_spec })) { + $self->update_from_params; + log_debug { "Deleting the OAI_PMH set" }; + $oaipmh_set->delete; + } }; __PACKAGE__->meta->make_immutable; diff --git a/root/src/layout.tt b/root/src/layout.tt index 14ff309c..9dd64b32 100644 --- a/root/src/layout.tt +++ b/root/src/layout.tt @@ -698,10 +698,6 @@ [% loc('The text was added to the bookbuilder') %] - [% ELSIF c.flash.status_msg == 'COLLECTION_UPDATE' %] - - [% loc('Collections have been updated. You may want to refresh the OAI-PMH repository') %] - [% ELSE %] [% c.flash.status_msg | html %] [% END %] diff --git a/t/nodes.t b/t/nodes.t index 4e969b57..6046c81e 100644 --- a/t/nodes.t +++ b/t/nodes.t @@ -9,7 +9,7 @@ use File::Spec::Functions qw/catfile catdir/; use lib catdir(qw/t lib/); use AmuseWikiFarm::Schema; use Data::Dumper::Concise; -use Test::More tests => 35; +use Test::More tests => 64; use AmuseWikiFarm::Archive::OAI::PMH; my $builder = Test::More->builder; @@ -131,7 +131,7 @@ foreach my $node ($site->nodes) { } # now we need the tree for each title -$site->node_title_tree; +diag Dumper($site->node_title_tree); my $oai_pmh = AmuseWikiFarm::Archive::OAI::PMH->new(site => $site, oai_pmh_url => URI->new($site->canonical_url . '/oai-pmh')); @@ -196,4 +196,85 @@ foreach my $set ("category:author:author-one-1", diag $mech->content; $mech->content_lacks('noRecordsMatch'); + sleep 1; + $now = DateTime->now(time_zone => 'UTC'); + + $uri->query_form({ from => $now->iso8601 . 'Z', + metadataPrefix => 'oai_dc', verb => 'ListIdentifiers' }); + $mech->get_ok($uri); + $mech->content_contains('noRecordsMatch'); + + # create one + my $root_node = $site->nodes->create({ uri => 'root-oai-pmh' }); + my $child_node = $site->nodes->create({ + uri => 'child-oai-pmh', + parent_node => $root_node, + }); + $root_node->update_from_params({ + attached_uris => "/library/four-2", + }); + + $child_node->update_from_params({ + attached_uris => "/library/seven /category/topic/cat-one-1", + }); + sleep 1; + $mech->get_ok($uri); + $mech->content_lacks('noRecordsMatch'); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/one-1', "one-1 is there because of category"); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/seven', "seven is there because of direct child"); + + # now, ask for the root + $uri->query_form({ from => $now->iso8601 . 'Z', + metadataPrefix => 'oai_dc', verb => 'ListIdentifiers', + set => 'collection:root-oai-pmh', + }); + $mech->get_ok($uri); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/one-1', "one-1 is there because of category"); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/seven', "seven is there because of direct child"); + diag $mech->content; + # diag Dumper($site->node_title_tree); + sleep 1; + $now = DateTime->now(time_zone => 'UTC'); + $uri->query_form({ from => $now->iso8601 . 'Z', + metadataPrefix => 'oai_dc', verb => 'ListIdentifiers' }); + + $mech->get_ok($uri); + $mech->content_contains('noRecordsMatch'); + + # now update the child and ask for the parent + $child_node->update_from_params({ attached_uris => "/library/one-2" }); + + $uri->query_form({ from => $now->iso8601 . 'Z', + metadataPrefix => 'oai_dc', verb => 'ListIdentifiers' }); + $mech->get_ok($uri); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/one-1', "one-1 is there because of category"); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/seven', "seven is there because of direct child"); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/one-2', "one-2 is there because of category"); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/four-2', "four-2 is attached to the parent"); + + + foreach my $set ('collection:root-oai-pmh', 'collection:child-oai-pmh') { + $uri->query_form({ from => $now->iso8601 . 'Z', + metadataPrefix => 'oai_dc', verb => 'ListIdentifiers', + set => $set, + }); + $mech->get_ok($uri); + $mech->content_lacks('oai:0nodes1.amusewiki.org:/library/one-1', "one-1 is there because of category"); + $mech->content_lacks('oai:0nodes1.amusewiki.org:/library/seven', "seven is there because of direct child"); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/one-2', "one-2 is there because of category"); + diag $mech->content; + } + sleep 1; + diag "Trying a deletion now"; + $now = DateTime->now(time_zone => 'UTC'); + $uri->query_form({ from => $now->iso8601 . 'Z', + metadataPrefix => 'oai_dc', verb => 'ListIdentifiers' }); + $mech->get_ok($uri); + $mech->content_contains('noRecordsMatch'); + + $child_node->delete; + $mech->get_ok($uri); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/one-2', "one-2 is there because of category"); + $mech->content_contains('oai:0nodes1.amusewiki.org:/library/four-2', "four-2 is attached to the parent"); + diag $mech->content; }