summaryrefslogtreecommitdiff
path: root/lib/GitHub/Collector/Role/Relation.pm
blob: b89d0fc5dc5e7f9f553954a68df0a7d0b4dfcade (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package GitHub::Collector::Role::Relation;

use Try::Tiny;
use Moose::Role;

with qw/GitHub::Collector::Role::Pause/;

has types => (
    is          => 'ro',
    isa         => 'ArrayRef',
    auto_deref => 1,
    default     => sub { [qw/followers following/] }
);

sub add_relations {
    my ( $self, $login ) = @_;

    foreach my $type ($self->types) {
        my $users = $self->_grab_relations( $login, $type );
        foreach my $user (@$users) {
            $self->_bootstrap_profile($user);
            if ($type eq 'followers'){
                $self->_add_relation($user, $login);
            }else{
                $self->_add_relation($login, $user);
            }
        }
    }
}

sub _grab_relations {
    my ( $self, $login, $type ) = @_;

    $self->log( [ "fetching %s informations for %s", $type, $login ] );

    my $method = 'list_' . $type;
    my ( $users, $error );
    try {
        $users = $self->spore_client->$method(
            format => 'json',
            user   => $login,
        )->body->{users};
    }
    catch {
        $error = $_;
        if ( $error->status == 403 ) {
            $self->debug(
                [ "need to pause (while grabbing relations for %s)", $login ] );
            sleep($self->pause_on_error);
            $self->_grab_relations( $login, $type );
        }
        else {
            $self->debug(
                [ "can't fetch %s relation for %s: %s", $type, $login, $error ]
            );
        }
    };

    sleep( $self->pause );
    return $users;
}

sub _add_relation {
    my ($self, $source, $target) = @_;
    my $search = {source => $source, target => $target};
    my $exists = $self->db_relations->find_one($search);
    $self->db_relations->insert($search) if !$exists;
}

1;