api/v0: simplify show_tag

Only accept an ID or the display name. Stop accepting kind_id and raw
names. As a consequence of the latter, the endpoint now always returns
exactly one tag.
This commit is contained in:
Lucas Gabriel Vuotto 2025-05-03 16:42:30 +00:00
parent d78708e619
commit f1c3d1ed0e
3 changed files with 17 additions and 26 deletions

View file

@ -63,7 +63,7 @@ sub startup ($self)
$r->get("/media/similar/<media_id:num>")->to("media#similar")
->name("search_similar_media");
$r->get("/tag")->to("tags#show")->name("show_tag");
$r->get("/tag/:tag_id_or_display")->to("tags#show")->name("show_tag");
$r->get("/tags")->to("tags#list")->name("list_tags");
$r->get("/search")->to("tags#search")->name("search_tags");

View file

@ -25,33 +25,24 @@ sub show ($self)
{
my $v = $self->validation;
my $tag_id_or_name = $v->optional("id")->num(1, undef)->param //
$v->optional("display")->param //
$v->required("name")->param;
return $self->render(
json => {error => "Invalid tag ID or name."},
status => 400,
) if $v->has_error;
my %search = ($v->topic => [$tag_id_or_name]);
my $kind_id = $v->optional("kind_id")->param;
return $self->render(
json => {error => "Invalid kind ID."},
status => 400,
) if $v->has_error;
$search{kind_id} = $kind_id if defined($kind_id);
my @tag_ids = map {$_->{id}} $self->tags_model
->get(%search)->fetchall->@*;
my @tags = $self->tags_model->ranked_for_tags(@tag_ids)->fetchall->@*;
my $tag_id_or_display = $self->stash("tag_id_or_display");
my $key = $tag_id_or_display =~ m/^[1-9][0-9]*$/ ? "id" : "display";
my $tag = $self->tags_model
->get($key => [$tag_id_or_display])->single;
return $self->render(
json => {error => "Tag not found."},
status => 404,
) if @tags == 0;
) if !defined($tag);
return $self->render(json => {tags => [@tags]});
my $tag_with_count = $self->tags_model
->ranked_for_tags($tag->{id})->single;
return $self->render(
json => {error => "Coherency error for tag $tag->{id}."},
status => 500,
) if !defined($tag_with_count);
return $self->render(json => $tag_with_count);
}
sub random ($self)
@ -64,7 +55,7 @@ sub random ($self)
) if !defined($id);
return $self->redirect_to(
$self->url_for("show_tag")->query(id => $id));
$self->url_for("show_tag", tag_id_or_display => $id));
}
sub search ($self)

View file

@ -30,9 +30,9 @@ sub tag ($self)
status => 500,
) if $tx->error;
my @tags = $tx->res->json->{tags}->@*;
my %tag = $tx->res->json->%*;
my $url = $self->url_for("list_media")
->query(tags => $tags[int(rand(@tags))]->{display} . " ");
->query(tags => $tag{display} . " ");
return $self->redirect_to($url);
})->wait;
}