Merge branch 'master' into gruntmaster
[gruntmaster-page.git] / lib / Plack / App / Gruntmaster.pm
index f647783e61ac9d1b7ad4c8c7eafb98af6df3ff07..b84dc81db4b13bcf3ec79a3c65f18912d831233a 100644 (file)
@@ -52,6 +52,8 @@ use constant FORMAT_EXTENSION => {
 use constant NOT_FOUND => [404, ['Content-Type' => 'text/plain'], ['Not found']];
 use constant FORBIDDEN => [401, ['Content-Type' => 'text/plain', 'WWW-Authenticate' => 'Basic realm="Gruntmaster 6000"'], ['Forbidden']];
 
+sub development() { ($ENV{PLACK_ENV} // 'development') eq 'development' }
+
 my $env;
 
 sub db { $env->{'gruntmaster.dbic'} }
@@ -76,6 +78,7 @@ sub response {
                $params = $title;
                $title = 'No title';
        }
+       $params->{time} = time;
        bless {template => $template, title => $title, params => $params}, __PACKAGE__.'::Response'
 }
 
@@ -93,14 +96,14 @@ sub dispatch_request{
                        my $css = read_file "css/themes/$theme.css";
                        $css .= read_file $_ for <css/*.css>;
                        my @headers = ('X-Forever' => 1, 'Cache-Control' => 'public, max-age=604800', 'Content-Type' => 'text/css');
-                       [200, \@headers, [CSS::Minifier::XS::minify $css]]
+                       [200, \@headers, [development ? $css : CSS::Minifier::XS::minify $css]]
                },
 
                sub (/js.js) {
                        my $js;
                        $js .= read_file $_ for <js/*.js>;
                        my @headers = ('X-Forever' => 1, 'Cache-Control' => 'public, max-age=604800', 'Content-Type' => 'application/javascript');
-                       [200, \@headers, [JavaScript::Minifier::XS::minify $js]]
+                       [200, \@headers, [development ? $js : JavaScript::Minifier::XS::minify $js]]
                },
 
                sub (/src/:job) {
@@ -126,20 +129,16 @@ sub dispatch_request{
                        response_filter {
                                my ($r) = @_;
                                return $r if ref $r ne 'Plack::App::Gruntmaster::Response';
-                               return [200, ['Content-Type' => 'application/json', 'X-Forever' => 1], [encode 'UTF-8', encode_json $r->{params}]] if $env->{HTTP_ACCEPT} =~ m,^\s*application/json\s*$,g;
+                               return [200, ['Content-Type' => 'application/json', 'X-Forever' => 1], [encode_json $r->{params}]] if $env->{HTTP_ACCEPT} =~ m,^\s*application/json\s*$,g;
                                my $ret = render $r->{template}, 'en', title => $r->{title}, %{$r->{params}};
                                [200, ['Content-Type' => 'text/html'], [encode 'UTF-8', $ret]]
                        },
                },
 
-               sub (/st/) {
-                       response st => 'Standings', { st => [db->standings] }
-               },
-
                sub (/st/:contest) {
                        response st => 'Standings', {
-                               st => [ db->standings($_{contest}) ],
-                               problems => [map { $_->problem } contest->contest_problems]
+                               st => [ contest->standings ],
+                               problems => [map { $_->problem } contest->contest_problems],
                        }
                },
 
@@ -153,11 +152,17 @@ sub dispatch_request{
                sub (/us/:user)    { response us_entry => user->name, db->user_entry($_{user}) },
                sub (/ct/:contest) { response ct_entry => contest->name, db->contest_entry($_{contest}) },
                sub (/log/:job)    { response log_entry => "Job  $_{job}", db->job_entry($_{job}) },
-               sub (/pb/:problem + ?:contest~) {
+               sub (/pb/:problem + ?contest~) {
+                       my (undef, undef, $contest) = @_;
+                       $_{contest} = $contest;
                        return NOT_FOUND if !contest && !problem->is_in_archive || contest && !db->contest_problems->find($_{contest}, $_{problem});
                        forbid problem->is_private;
                        response pb_entry => problem->name, db->problem_entry($_{problem}, $_{contest}, remote_user && remote_user->id);
                },
+               sub (/sol/:problem) {
+                       forbid !problem->is_in_archive;
+                       response sol => 'Solution of ' . problem->name, {solution => db->problem($_{problem})->solution};
+               },
 
                sub (/) { redispatch_to '/index' },
                sub (/:article) { [200, ['Content-Type' => 'text/html'], [render_article $_{article}, 'en']] }
This page took 0.011568 seconds and 4 git commands to generate.