package CMTD::Main; use strict; use warnings; use utf8; use Mojo::Base 'Mojolicious::Controller'; use Mojo::Util qw(trim); sub index { my ($self) = @_; $self->render(text => "Go away!\n"); } sub captcha { my ($self) = @_; eval { my $table = $self->app->config->{captcha}->{table}; my @sort = qw(shown tries); $self->app->db->begin; my ($cid, $data) = $self->app->db->select($table, ['id', 'data'], undef, \@sort)->list; $self->app->db->update($table, {shown => time()}, {id => $cid}); $self->app->db->commit; $self->app->log->debug("showing captcha #$cid"); $self->render(json => {id => $cid, data => $data}); 1; } or do { chomp $@; $self->app->log->error("error when showing captcha: $@"); $self->res->code(500); $self->render(text => "internal error\n"); }; } sub c_list { my ($self) = @_; my $ref = $self->referrer; unless ($ref and ref($ref) eq 'HASH') { $self->res->code(400); $self->render(text => "can't detect referred page\n"); return; } eval { if (my $sid = $self->app->sid_by_name($ref->{site})) { my @cm = (); if (my $pid = $self->app->pid_by_hash($sid, $ref->{hash})) { my @tm = $self->app->comments_by_pid($pid); # TODO: processing @cm = @tm; } $self->render(json => \@cm); } else { $self->res->code(400); $self->render(text => "no such site\n"); } 1; } or do { chomp $@; my $msg = sprintf "Error when listing comments for %s/%s: %s", $ref->{site}, $ref->{pid}, $@; $self->app->log->error($msg); $self->res->code(500); $self->render(text => "internal error\n"); }; } sub c_add { my ($self) = @_; my $ref = $self->referrer; unless ($ref and ref($ref) eq 'HASH') { $self->res->code(400); $self->render(text => "can't detect referred page\n"); return; } eval { my (%msg, %cap); $msg{addr} = $self->tx->remote_address; foreach my $param (qw(name email text reply)) { $msg{$param} = trim($self->req->param($param) || ''); } foreach my $param (qw(cid code)) { $cap{$param} = trim($self->req->param($param) || ''); } do {{ unless ($msg{text}) { $self->res->code(400); $self->render(text => "empty message\n"); last; } my $sid = $self->app->sid_by_name($ref->{site}); unless ($sid) { $self->res->code(400); $self->render(text => "no such site\n"); last; } if ($cap{cid}) { unless ($cap{code}) { $self->res->code(400); $self->render(text => "missing captcha code\n"); last; } my $cap = $self->captcha_by_id($cap{cid}); unless ($cap and $cap eq 'HASH') { $self->res->code(400); $self->render(text => "no captcha with this id\n"); last; } unless ($cap->{code} eq $cap{code}) { $self->res->code(400); $self->render(text => "captcha code mismatch\n"); last; } } my $pid = $self->app->pid_by_hash($sid, $ref->{hash}); unless ($pid) { $self->app->add_page($sid, $ref); $pid = $self->app->pid_by_hash($sid, $ref->{hash}); } $self->add_comment($pid, \%msg); }} while (0); 1; } or do { chomp $@; my $msg = sprintf "Error when listing comments for %s/%s: %s", $ref->{site}, $ref->{pid}, $@; $self->app->log->error($msg); $self->res->code(500); $self->render(text => "internal error\n"); }; } 1;