- sub (/us/) { response us => 'Users', {us => db->user_list} },
- sub (/ct/ + ?:owner~) { response ct => 'Contests', db->contest_list(%_) },
- sub (/log/ + ?:contest~&:owner~&:page~&:problem~) { response log => 'Job list', {%{db->job_list(%_)}, maybe contest => $_{contest}} },
- sub (/pb/ + ?:owner~&:contest~) { response pb => 'Problems', {%{db->problem_list(%_)}, maybe contest => $_{contest}} },
+ sub (/us/) { response us => 'Users', {us => user_list} },
+ sub (/ct/ + ?:owner~) {
+ my $cts = contest_list(%_);
+ my $first_event = min
+ map ({ $_->{start} } grep { !$_->{started} } @$cts),
+ map ({ $_->{stop} } grep { $_->{started} && !$_->{finished}} @$cts);
+ response ct => 'Contests', {ct => $cts}, 300, $first_event ? ($first_event - time) : ();
+ },
+ sub (/log/ + ?:contest~&:owner~&:page~&:problem~&:private~&:result~) {
+ forbid $_{private};
+ my ($jobs, $pageinfo) = job_list(%_);
+ response log => 'Job log', {log => $jobs, %$pageinfo}, 5
+ },
+ sub (/pb/ + ?:owner~&:contest~&:private~) {
+ forbid $_{private};
+ my $pending = $_{contest} && !contest_entry($_{contest})->{started};
+ forbid $pending;
+ response pb => 'Problems', {pb => problem_list %_}
+ },