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:
parent
d78708e619
commit
f1c3d1ed0e
3 changed files with 17 additions and 26 deletions
|
@ -63,7 +63,7 @@ sub startup ($self)
|
||||||
$r->get("/media/similar/<media_id:num>")->to("media#similar")
|
$r->get("/media/similar/<media_id:num>")->to("media#similar")
|
||||||
->name("search_similar_media");
|
->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("/tags")->to("tags#list")->name("list_tags");
|
||||||
$r->get("/search")->to("tags#search")->name("search_tags");
|
$r->get("/search")->to("tags#search")->name("search_tags");
|
||||||
|
|
||||||
|
|
|
@ -25,33 +25,24 @@ sub show ($self)
|
||||||
{
|
{
|
||||||
my $v = $self->validation;
|
my $v = $self->validation;
|
||||||
|
|
||||||
my $tag_id_or_name = $v->optional("id")->num(1, undef)->param //
|
my $tag_id_or_display = $self->stash("tag_id_or_display");
|
||||||
$v->optional("display")->param //
|
my $key = $tag_id_or_display =~ m/^[1-9][0-9]*$/ ? "id" : "display";
|
||||||
$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 = $self->tags_model
|
||||||
|
->get($key => [$tag_id_or_display])->single;
|
||||||
return $self->render(
|
return $self->render(
|
||||||
json => {error => "Tag not found."},
|
json => {error => "Tag not found."},
|
||||||
status => 404,
|
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)
|
sub random ($self)
|
||||||
|
@ -64,7 +55,7 @@ sub random ($self)
|
||||||
) if !defined($id);
|
) if !defined($id);
|
||||||
|
|
||||||
return $self->redirect_to(
|
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)
|
sub search ($self)
|
||||||
|
|
|
@ -30,9 +30,9 @@ sub tag ($self)
|
||||||
status => 500,
|
status => 500,
|
||||||
) if $tx->error;
|
) if $tx->error;
|
||||||
|
|
||||||
my @tags = $tx->res->json->{tags}->@*;
|
my %tag = $tx->res->json->%*;
|
||||||
my $url = $self->url_for("list_media")
|
my $url = $self->url_for("list_media")
|
||||||
->query(tags => $tags[int(rand(@tags))]->{display} . " ");
|
->query(tags => $tag{display} . " ");
|
||||||
return $self->redirect_to($url);
|
return $self->redirect_to($url);
|
||||||
})->wait;
|
})->wait;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue