about summary refs log tree commit diff
path: root/lib/jitterbug.pm
blob: dadfbe8241cdd15477ea3c01693017369b0fa5c3 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
package jitterbug;

use Dancer ':syntax';
use Dancer::Plugin::DBIC;
use jitterbug::Plugin::Template;

our $VERSION = '0.1';

load_app 'jitterbug::Hook',       prefix => '/hook';
load_app 'jitterbug::Project',    prefix => '/project';
load_app 'jitterbug::WebService', prefix => '/api';
load_app 'jitterbug::Task',       prefix => '/task';

get '/' => sub {
    my $projects = _get_projects();
    my ( $builds, $runnings ) = _get_builds();

    template 'index',
      { projects => $projects, builds => $builds, runnings => $runnings };
};

sub _get_projects {

    my @projects = ();

    my $projects = schema->resultset('Project')->search();
    while ( my $project = $projects->next ) {
        my $owner     = from_json( $project->owner );
        my $proj_desc = {
            description => $project->description,
            name        => $project->name,
            url         => $project->url,
            owner_name  => $owner->{name},
        };

        my $last_commit =
          schema->resultset('Commit')
          ->search( { projectid => $project->projectid }, {order_by => {-desc => 'timestamp'}} )->first();

        if ($last_commit) {
            # XXX see what data to store here
            my $json = from_json($last_commit->content);
            $proj_desc->{last_build}        = $json;
            $proj_desc->{last_build_author} = $json->{author}{name};
            # get the status of the last build
            my $last_build_status = "PASS";
            foreach my $version (keys %{$json->{build}->{version}}){
                if ($json->{build}->{version}->{$version} eq "FAIL"){
                    $last_build_status = "FAIL";
                    last;
                }
            }
            $proj_desc->{last_build_status} = $last_build_status;
        }
        push @projects, $proj_desc;
    }

    @projects =
      sort { $b->{last_build}->{timestamp} cmp $a->{last_build}->{timestamp} }
      @projects;

    return \@projects;
}

sub _get_builds {

    my @builds   = ();
    my @runnings = ();

    my $builds = schema->resultset('Task')->search();
    while ( my $build = $builds->next ) {
        my $build_desc = {
            project => $build->project->name,
            id      => $build->id,
            running => $build->running,
        };
        $build->running ? push @runnings, $build_desc : push @builds,
          $build_desc;
    }
    return ( \@builds, \@runnings );
}

true;