diff --git a/lib/PostText/Controller/Thread.pm b/lib/PostText/Controller/Thread.pm index 780a5b7..61b0db7 100644 --- a/lib/PostText/Controller/Thread.pm +++ b/lib/PostText/Controller/Thread.pm @@ -140,13 +140,24 @@ sub feed($self) { sub bump($self) { my $thread_id = $self->param('thread_id'); + my $v = $self->validation; - $self->thread->bump($thread_id); - $self->flash(info => "Thread #$thread_id has been bumped. 🔝"); + $v->optional(captcha => 'trim')->size(4, 4)->like(qr/bump/i); - $self->redirect_to( - $self->url_for('threads_list')->fragment('info')->to_abs - ); + if ($v->is_valid) { + my $redirect_url = + $self->url_for('threads_list')->fragment('info')->to_abs; + + $self->thread->bump($thread_id); + $self->flash(info => "Thread #$thread_id has been bumped. 🔝"); + + return $self->redirect_to($redirect_url); + } + elsif ($v->has_error) { + $self->stash(status => 400) + } + + $self->render; } sub flag($self) { diff --git a/t/thread.t b/t/thread.t index 843ce41..844bc6c 100644 --- a/t/thread.t +++ b/t/thread.t @@ -87,6 +87,10 @@ subtest 'Bumping thread', sub { $t->get_ok('/thread/bump/1')->status_is(200) ->element_exists('p[class="stash-with-info"]') ->text_like(p => qr/Thread #1 has been bumped/); + + $t->get_ok('/thread/bump/1' )->status_is(200); + $t->get_ok('/thread/bump/65536')->status_is(404); + $t->get_ok('/thread/bump/1', form => {captcha => 'bump'})->status_is(400); }; subtest 'Flagging thread', sub { @@ -100,6 +104,7 @@ subtest 'Flagging thread', sub { $t->get_ok('/thread/flag/1' )->status_is(200); $t->get_ok('/thread/flag/65536')->status_is(404); + $t->get_ok('/thread/flag/1', form => {captcha => 'flag'})->status_is(400); }; done_testing; diff --git a/templates/thread/bump.html.ep b/templates/thread/bump.html.ep new file mode 100644 index 0000000..1b9d77e --- /dev/null +++ b/templates/thread/bump.html.ep @@ -0,0 +1,17 @@ +% layout 'default'; +% title $thread_id ? "Bump Thread #$thread_id" : '?'; +