guestbook-ng/guestbook-ng.pl

115 lines
3.1 KiB
Perl
Raw Normal View History

2021-12-04 00:11:37 -05:00
#!/usr/bin/env perl
# Dec 2021
# Daniel Bowling <swaggboi@slackware.uk>
use Mojolicious::Lite -signatures;
2021-12-04 18:34:35 -05:00
use Mojo::Pg;
2021-12-31 22:32:39 -05:00
use List::Util qw{shuffle};
use Data::Dumper; # Uncomment for debugging
# Load the model
2021-12-04 02:26:25 -05:00
use lib 'lib';
use GuestbookNg::Model::Message;
2021-12-04 02:26:25 -05:00
2021-12-04 18:34:35 -05:00
# Plugins
plugin 'Config';
2021-12-11 21:02:54 -05:00
plugin 'TagHelpers::Pagination';
2021-12-22 23:18:35 -05:00
plugin AssetPack => {pipes => [qw{Css JavaScript Combine}]};
2021-12-04 18:34:35 -05:00
# Helpers
helper pg => sub {
2021-12-19 00:43:18 -05:00
my $env = app->mode() eq 'development' ? 'dev_env' : 'prod_env';
2021-12-11 18:48:00 -05:00
2021-12-04 18:34:35 -05:00
state $pg = Mojo::Pg->new(
2021-12-19 17:43:58 -05:00
'postgres://' .
app->config->{$env}{'pg_user'} .
':' .
app->config->{$env}{'pg_pw'} .
'@' .
app->config->{$env}{'pg_host'} .
'/' .
app->config->{$env}{'pg_db'}
2021-12-04 18:34:35 -05:00
);
};
2021-12-04 23:06:05 -05:00
helper message => sub {
state $message = GuestbookNg::Model::Message->new(pg => shift->pg)
2021-12-04 23:06:05 -05:00
};
# Routes
2021-12-18 23:03:53 -05:00
under sub ($c) {
# Opt out of Google FLoC
# https://paramdeo.com/blog/opting-your-website-out-of-googles-floc-network
$c->res->headers->header('Permissions-Policy', 'interest-cohort=()');
2022-01-01 23:37:41 -05:00
$c->session();
2021-12-18 23:03:53 -05:00
1;
};
2021-12-04 00:11:37 -05:00
get '/' => sub ($c) {
my $this_page = $c->param('page') || 1;
2021-12-22 22:23:10 -05:00
my $last_page = $c->message->get_last_page();
my $view_posts = $c->message->get_posts($this_page);
2021-12-11 21:02:54 -05:00
$c->stash(
2021-12-22 22:23:10 -05:00
view_posts => $view_posts,
2021-12-11 21:02:54 -05:00
this_page => $this_page,
last_page => $last_page
);
$c->render();
2021-12-04 02:26:25 -05:00
} => 'index';
2021-12-19 00:43:18 -05:00
any [qw{GET POST}], '/sign' => sub ($c) {
2022-01-01 23:37:41 -05:00
if ($c->req->method() eq 'POST') {
2021-12-31 23:05:34 -05:00
my $name = $c->param('name') || 'Anonymous';
my $url = $c->param('url');
my $message = $c->param('message');
2021-12-18 23:03:53 -05:00
my $answer = $c->param('answer');
2022-01-01 23:37:41 -05:00
if ($message && $answer) {
$c->message->create_post($name, $message, $url);
$c->redirect_to('index');
}
else {
$c->flash(error => 'Uh-oh!! Please try again.');
$c->redirect_to('sign');
}
}
else {
2022-01-01 21:39:04 -05:00
# Try to randomize things for the CAPTCHA challenge. The
# string 'false' actually evaluates to true so this is an
# attempt to confuse a (hypothetical) bot that would try to
# select what it thinks is the right answer
2021-12-31 22:32:39 -05:00
my @answers = shuffle(0, 'false', undef);
my $right_answer_label = 'I\'m ready to sign (choose this one)';
my @wrong_answer_labels = shuffle(
'I don\'t want to sign (wrong answer)',
'This is spam/I\'m a bot, do not sign'
);
$c->stash(
answers => \@answers,
right_answer_label => $right_answer_label,
wrong_answer_labels => \@wrong_answer_labels
);
$c->render();
}
};
2021-12-04 18:34:35 -05:00
# Send it
2021-12-05 03:32:22 -05:00
app->secrets(app->config->{'secrets'}) || die $@;
2021-12-12 01:50:07 -05:00
app->message->max_posts(app->config->{'max_posts'})
if app->config->{'max_posts'};
app->pg->migrations->from_dir('migrations')->migrate(4);
2021-12-12 01:50:07 -05:00
2021-12-22 23:18:35 -05:00
app->asset->store->paths(['assets']);
app->asset->process('swagg.css', 'css/swagg.css');
2021-12-04 00:11:37 -05:00
app->start();