summary refs log tree commit diff
path: root/lib/jitterbug
diff options
context:
space:
mode:
Diffstat (limited to 'lib/jitterbug')
-rw-r--r--lib/jitterbug/Hook.pm74
-rw-r--r--lib/jitterbug/Project.pm34
-rw-r--r--lib/jitterbug/Task.pm6
-rw-r--r--lib/jitterbug/WebService.pm2
4 files changed, 80 insertions, 36 deletions
diff --git a/lib/jitterbug/Hook.pm b/lib/jitterbug/Hook.pm
index e5d1082..9492ebe 100644
--- a/lib/jitterbug/Hook.pm
+++ b/lib/jitterbug/Hook.pm
@@ -1,15 +1,18 @@
 package jitterbug::Hook;
 
 use Dancer ':syntax';
-use jitterbug::Plugin::Redis;
+use Dancer::Plugin::DBIC;
+
+use Try::Tiny;
 
 setting serializer => 'JSON';
 
 post '/' => sub {
     my $payload = params->{payload};
 
+    # don't confuse poster, and don't care about it
     if (!defined $payload) {
-        # don't confuse poster, and don't care about it
+        error("no payload in input");
         status 200;
         return;
     }
@@ -17,29 +20,66 @@ post '/' => sub {
     $payload = from_json($payload);
     my $repo = $payload->{repository}->{name};
 
-    my $repo_key = key_project($repo);
+    my $project = schema->resultset('Project')->find( { name => $repo } );
 
-    if ( !redis->exists($repo_key) ) {
-        my $project = {
-            name        => $repo,
-            url         => $payload->{repository}->{url},
-            description => $payload->{repository}->{description},
-            owner       => $payload->{repository}->{owner},
+    if ( !$project ) {
+        debug("need to create a new project");
+        try {
+            schema->txn_do(
+                sub {
+                    $project = schema->resultset('Project')->create(
+                        {
+                            name => $repo,
+                            url  => $payload->{repository}->{url},
+                            description =>
+                              $payload->{repository}->{description},
+                            owner => to_json($payload->{repository}->{owner}),
+                        }
+                    );
+                }
+            );
+        }
+        catch {
+            error($_);
         };
-        redis->set( $repo_key, to_json($project) );
-        redis->sadd( key_projects, $repo );
     }
 
     my $last_commit = pop @{ $payload->{commits} };
-
-    $last_commit->{repo}    = $payload->{repository}->{url};
-    $last_commit->{project} = $repo;
     $last_commit->{compare} = $payload->{compare};
+    $last_commit->{pusher}  = $payload->{pushed};
+    $last_commit->{ref}     = $payload->{ref};
+
+    try {
+        schema->txn_do(
+            sub {
+                schema->resultset('Commit')->create(
+                    {
+                        sha256    => $last_commit->{id},
+                        content   => to_json($last_commit),
+                        projectid => $project->projectid,
+                        timestamp => $last_commit->{timestamp},
+                    }
+                );
+            }
+        );
+    }
+    catch {
+        debug($_);
+    };
 
-    my $task_key = key_task_repo($repo);
-    redis->set( $task_key, to_json($last_commit) );
+    try {
+        schema->txn_do(
+            sub {
+                schema->resultset('Task')->create(
+                    {sha256 => $last_commit->{id}, projectid => $project->projectid}
+                );
+            }
+        );
+    }catch{
+        debug($_);
+    };
 
-    redis->sadd( key_tasks, $task_key );
+    debug("hook accepted");
 
     { updated => $repo };
 };
diff --git a/lib/jitterbug/Project.pm b/lib/jitterbug/Project.pm
index 44c6844..30821ef 100644
--- a/lib/jitterbug/Project.pm
+++ b/lib/jitterbug/Project.pm
@@ -1,20 +1,18 @@
 package jitterbug::Project;
 
 use Dancer ':syntax';
-use jitterbug::Plugin::Redis;
+use Dancer::Plugin::DBIC;
 use jitterbug::Plugin::Template;
 
 use DateTime;
 use XML::Feed;
 
 get '/:project' => sub {
-    my $project = params->{project};
+    my $project =
+      schema->resultset('Project')->find( { name => params->{project} } );
 
-    my $res = redis->get( key_project($project) );
-
-    send_error( "Project $project not found", 404 ) if !$res;
-
-    my $desc = from_json($res);
+    send_error( "Project " . params->{project} . " not found", 404 )
+      unless $project;
 
     my $builds = _sorted_builds($project);
 
@@ -28,16 +26,20 @@ get '/:project' => sub {
     my @days = sort {$b cmp $a} keys %$commits;
 
     template 'project/index',
-      { project => $project, days => \@days, builds => $commits, %$desc };
+        {project => $project, days => \@days, commits => $commits};
 };
 
 get '/:project/feed' => sub {
-    my $project = params->{project};
+    my $project =
+      schema->resultset('Project')->find( { name => params->{project} } );
+
+    send_error( "Project " . params->{project} . " not found", 404 )
+      unless $project;
 
     my $builds = _sorted_builds($project);
 
     my $feed = XML::Feed->new('Atom');
-    $feed->title('builds for '.$project);
+    $feed->title('builds for '.$project->name);
 
     foreach my $build (@$builds) {
         foreach my $version (keys %{$build->{version}}) {
@@ -61,14 +63,16 @@ get '/:project/feed' => sub {
 sub _sorted_builds {
     my $project = shift;
 
-    my @ids = redis->smembers( key_builds_project($project) );
+    my $commits =
+      schema->resultset('Commit')
+      ->search( { projectid => $project->projectid } );
 
     my @builds;
-    foreach my $id (@ids) {
-        my $res = redis->get($id);
-        push @builds, from_json($res) if $res;
+    while ( my $c = $commits->next ) {
+        push @builds, from_json( $c->content );
     }
-    @builds = sort {$b->{timestamp} cmp $a->{timestamp}} @builds;
+
+    @builds = sort { $b->{timestamp} cmp $a->{timestamp} } @builds;
     \@builds;
 }
 
diff --git a/lib/jitterbug/Task.pm b/lib/jitterbug/Task.pm
index bef99bc..f14a9c6 100644
--- a/lib/jitterbug/Task.pm
+++ b/lib/jitterbug/Task.pm
@@ -1,19 +1,19 @@
 package jitterbug::Task;
 
 use Dancer ':syntax';
-use jitterbug::Plugin::Redis;
+use Dancer::Plugin::DBIC;
 use jitterbug::Plugin::Template;
 
 get '/:task_id' => sub {
     my $task_id = params->{task_id};
 
-    my $task = redis->get($task_id);
+    my $task = schema->resultset('Task')->search($task_id);
 
     if (!$task) {
         render_error("task doesn't exists", 404);
     }
 
-    template 'task/index', {task => from_json($task)};
+    template 'task/index', {task => $task };
 };
 
 1;
diff --git a/lib/jitterbug/WebService.pm b/lib/jitterbug/WebService.pm
index c8be8fd..65f6963 100644
--- a/lib/jitterbug/WebService.pm
+++ b/lib/jitterbug/WebService.pm
@@ -1,7 +1,7 @@
 package jitterbug::WebService;
 
 use Dancer ':syntax';
-use jitterbug::Plugin::Redis;
+use Dancer::Plugin::DBIC;
 
 use File::Spec;