diff --git a/lib/Pooru/API/V0.pm b/lib/Pooru/API/V0.pm index b9c2465..98fc88e 100644 --- a/lib/Pooru/API/V0.pm +++ b/lib/Pooru/API/V0.pm @@ -63,7 +63,7 @@ sub startup ($self) $r->get("/media/similar/")->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"); diff --git a/lib/Pooru/API/V0/Controller/Tags.pm b/lib/Pooru/API/V0/Controller/Tags.pm index c1d8b76..d38d3ae 100644 --- a/lib/Pooru/API/V0/Controller/Tags.pm +++ b/lib/Pooru/API/V0/Controller/Tags.pm @@ -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) diff --git a/lib/Pooru/Site/Controller/Random.pm b/lib/Pooru/Site/Controller/Random.pm index be89e02..74d24c3 100644 --- a/lib/Pooru/Site/Controller/Random.pm +++ b/lib/Pooru/Site/Controller/Random.pm @@ -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; }