summaryrefslogtreecommitdiff
path: root/lib/githubexplorer/Repository.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/githubexplorer/Repository.pm')
-rw-r--r--lib/githubexplorer/Repository.pm85
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/githubexplorer/Repository.pm b/lib/githubexplorer/Repository.pm
new file mode 100644
index 0000000..7a402dd
--- /dev/null
+++ b/lib/githubexplorer/Repository.pm
@@ -0,0 +1,85 @@
+package githubexplorer::Repository;
+use 5.010;
+use Moose::Role;
+use Net::GitHub::V2::Repositories;
+use YAML::Syck;
+
+sub fetch_repositories {
+ my ( $self, $profile ) = @_;
+
+ my $github_profile = Net::GitHub::V2::Users->new(
+ owner => $profile->login,
+ login => $self->api_login,
+ token => $self->api_token,
+ );
+
+ my $repo_list = $github_profile->list();
+
+ foreach my $repos (@$repo_list) {
+ next if $self->_repo_exists( $profile, $repos->{name} );
+ say "-> check " . $profile->login . "'s " . $repos->{name};
+ if ( $repos->{forks} == 0 ) {
+ say "<- not forked, skip";
+ next;
+ }
+ my $repo_rs;
+ unless ( $repo_rs = $self->_repo_exists( $profile, $repos->{name} ) ) {
+ $repo_rs = $self->_create_repo( $profile, $repos );
+ say "== repository " . $repos->{name} . " created";
+ }
+ sleep(1);
+ my $api_repos = Net::GitHub::V2::Repositories->new(
+ owner => $profile->login,
+ repo => $repos->{name},
+ login => $self->api_login,
+ token => $self->api_token,
+ );
+ my $langs = $api_repos->languages;
+ foreach my $lang ( keys %$langs ) {
+ my $lang_rs = $self->_lang_exists($lang);
+ $self->schema->resultset('RepoLang')->create(
+ {
+ repository => $repo_rs->id,
+ language => $lang_rs->name,
+ size => $langs->{$lang},
+ }
+ );
+ }
+ sleep(1);
+ }
+ sleep(1);
+}
+
+sub _lang_exists {
+ my ( $self, $lang ) = @_;
+ $self->schema->resultset('Language')->find_or_create({name => $lang});
+}
+
+sub _repo_exists {
+ my ( $self, $profile, $repo_name ) = @_;
+ $self->schema->resultset('Repositories')
+ ->find( { name => $repo_name, id_profile => $profile->id } );
+}
+
+sub _create_repo {
+ my ( $self, $profile, $repo_desc ) = @_;
+
+ my $repo_rs = $self->schema->resultset('Repositories')
+ ->find( { id_profile => $profile->id, name => $repo_desc->{name} } );
+ if ( !$repo_rs ) {
+ my $repo_insert = {
+ id_profile => $profile->id,
+ map { $_ => $repo_desc->{$_} }
+ (qw/description name homepage url watchers forks fork/)
+ };
+ $self->schema->txn_do(
+ sub {
+ $repo_rs = $self->schema->resultset('Repositories')
+ ->create($repo_insert);
+ }
+ );
+ }
+ $repo_rs;
+}
+
+1;