+sub problem_list {
+ my ($self, %args) = @_;
+ my $rs = $self->problems->search(undef, {order_by => 'me.name', columns => PROBLEM_PUBLIC_COLUMNS, prefetch => 'owner'});
+ $rs = $rs->search({-or => ['contest_problems.contest' => undef, 'contest.stop' => {'<=', time}], 'me.private' => 0}, {join => {'contest_problems' => 'contest'}, distinct => 1}) unless $args{contest};
+ $rs = $rs->search({'contest_problems.contest' => $args{contest}}, {join => 'contest_problems'}) if $args{contest};
+ $rs = $rs->search({'me.owner' => $args{owner}}) if $args{owner};
+ my %params;
+ $params{contest} = $args{contest} if $args{contest};
+ for ($rs->all) {
+ $params{$_->level} //= [];
+ push @{$params{$_->level}}, {$_->get_columns, owner_name => $_->owner->name} ;
+ }
+ \%params
+}
+
+sub problem_entry {
+ my ($self, $id, $contest, $user) = @_;
+ my $running = $contest && $self->contest($contest)->is_running;
+ my $columns = PROBLEM_PUBLIC_COLUMNS;
+ push @$columns, 'solution' unless $running;
+ my $pb = $self->problems->find($id, {columns => $columns, prefetch => 'owner'});
+ eval { ## no critic (RequireCheckingReturnValueOfEval)
+ $self->opens->create({
+ contest => $contest,
+ problem => $id,
+ owner => $user,
+ time => time,
+ })
+ } if $running;
+ $contest &&= $self->contest($contest);
+ +{ $pb->get_columns, owner_name => $pb->owner->name, cansubmit => $contest ? $running : 1, $running ? (contest_start => $contest->start, contest_stop => $contest->stop) : () }
+}
+
+sub contest_list {
+ my ($self, %args) = @_;
+ my $rs = $self->contests->search(undef, {order_by => {-desc => 'start'}, prefetch => 'owner'});
+ $rs = $rs->search({owner => $args{owner}}) if $args{owner};
+ my %params;
+ for ($rs->all) {
+ my $state = $_->is_pending ? 'pending' : $_->is_running ? 'running' : 'finished';
+ $params{$state} //= [];
+ push @{$params{$state}}, { $_->get_columns, started => !$_->is_pending, owner_name => $_->owner->name };
+ }
+ \%params
+}