about summary refs log tree commit diff
path: root/lib/jitterbug/Hook.pm
blob: 87cfba2ebb030c364371a02f4e33bcef5ea3ff64 (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
84
85
86
87
package jitterbug::Hook;

use Dancer ':syntax';
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) {
        error("no payload in input");
        status 200;
        return;
    }

    $payload = from_json($payload);
    my $repo = $payload->{repository}->{name};

    my $project = schema->resultset('Project')->find( { name => $repo } );

    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($_);
        };
    }

    my $last_commit = pop @{ $payload->{commits} };
    $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 {
        error($_);
    };

    try {
        schema->txn_do(
            sub {
                schema->resultset('Task')->create(
                    {sha256 => $last_commit->{id}, projectid => $project->projectid}
                );
            }
        );
    }catch{
        error($_);
    };

    debug("hook accepted");

    { updated => $repo };
};

1;