Skip to content

Commit

Permalink
Added /favorite/agg_by_distirbutions API endpoint
Browse files Browse the repository at this point in the history
This new endpoint will replace query sending from WEB.
  • Loading branch information
mickeyn committed Jun 28, 2017
1 parent fd47fe0 commit 55bb048
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 0 deletions.
53 changes: 53 additions & 0 deletions lib/MetaCPAN/Document/Favorite.pm
Expand Up @@ -122,6 +122,59 @@ sub users_by_distribution {
return { users => \@plusser_users };
}

sub agg_by_distirbutions {
my ( $self, $distributions, $user ) = @_;
return unless $distributions;

my $body = {
size => 0,
query => {
terms => { 'distribution' => $distributions }
},
aggregations => {
favorites => {
terms => {
field => 'distribution',
size => scalar @{$distributions},
},
},
$user
? (
myfavorites => {
filter => { term => { 'user' => $user } },
aggregations => {
enteries => {
terms => { field => 'distribution' }
}
}
}
)
: (),
}
};

my $ret = $self->es->search(
index => $self->index->name,
type => 'favorite',
body => $body,
);

my @favorites = map { $_->{key} => $_->{doc_count} }
@{ $ret->{aggregations}{favorites}{buckets} };

my @myfavorites;
if ($user) {
@myfavorites = map { $_->{key} => $_->{doc_count} }
@{ $ret->{aggregations}{myfavorites}{entries}{buckets} };
}

return {
favorites => \@favorites,
myfavorites => \@myfavorites,
took => $ret->{took},
};
}

sub recent {
my ( $self, $page, $size ) = @_;
$page //= 1;
Expand Down
21 changes: 21 additions & 0 deletions lib/MetaCPAN/Server/Controller/Favorite.pm
Expand Up @@ -59,5 +59,26 @@ sub leaderboard : Path('leaderboard') : Args(0) {
$c->stash($data);
}

sub agg_by_distirbutions : Path('agg_by_distributions') : Args(0) {
my ( $self, $c ) = @_;
my $body_data = $c->req->body_data;

my $distributions
= $body_data
? $body_data->{distribution}
: [ $c->req->param('distribution') ];
return unless $distributions and @{$distributions};

my $user
= $body_data
? $body_data->{user}
: $c->req->param('user');

my $data = $self->model($c)
->raw->agg_by_distirbutions( $distributions, $user );
$data or return;
$c->stash($data);
}

__PACKAGE__->meta->make_immutable;
1;

0 comments on commit 55bb048

Please sign in to comment.