Bläddra i källkod

Route every alias of a post, not only its first

DataModule::aliases() did @aliases{ @{ $post->{aliases} } } = $post->{local_href},
and assigning one value to a hash slice fills only its first key.  So every
alias after a post's first mapped to undef.  A series always has two,
/posts/$id and /series/$id, so every fresh tPSGI worker logged an
uninitialized value for each series while it registered the aliases.  It
has been this way since aliases were added.

The SQLite model uses this sub.  FlatFile answers from its tag index,
which stores one row per alias and was right.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
George Baugh 1 vecka sedan
förälder
incheckning
804581b84e
2 ändrade filer med 22 tillägg och 1 borttagningar
  1. 1 1
      lib/Trog/DataModule.pm
  2. 21 0
      t/Trog-Data-SQLite.t

+ 1 - 1
lib/Trog/DataModule.pm

@@ -1008,7 +1008,7 @@ sub aliases ($self) {
     my @posts = $self->get( limit => 0, acls => ['admin'] );
     my %aliases;
     foreach my $post (@posts) {
-        @aliases{ @{ $post->{aliases} } } = $post->{local_href};
+        $aliases{$_} = $post->{local_href} for @{ $post->{aliases} // [] };
     }
     return %aliases;
 }

+ 21 - 0
t/Trog-Data-SQLite.t

@@ -455,4 +455,25 @@ subtest 'indexing a custom field' => sub {
     ok( !$indexes->()->{'posts_custom_post_data'}, 'and a schema column did not pick up an index of its own' );
 };
 
+# Last, so the post it adds changes no count asserted above.
+subtest 'aliases' => sub {
+    my $aliased = post(
+        id         => 'p-aliased',
+        title      => 'Many Names',
+        local_href => '/posts/p-aliased',
+        method     => 'GET',
+        callback   => 'Trog::Routes::HTML::posts',
+        aliases    => [qw{/one /two /three}],
+    );
+    $sqlite->write( [ { %$aliased, tags => [ @{ $aliased->{tags} } ] } ] );
+    $flat->write( [ { %$aliased, tags => [ @{ $aliased->{tags} } ] } ] );
+
+    my %want = map { $_ => '/posts/p-aliased' } qw{/one /two /three};
+    foreach my $case ( [ flatfile => $flat ], [ sqlite => $sqlite ] ) {
+        my ( $name, $model ) = @$case;
+        my %got = $model->aliases();
+        is_deeply( { map { $_ => $got{$_} } grep { exists $want{$_} } keys %got }, \%want, "$name: every alias of a post leads to it, not only the first" );
+    }
+};
+
 done_testing();