package CMTD::Main; use strict; use warnings; use utf8; use Mojo::Base 'Mojolicious::Controller'; use Mojo::Util qw(trim b64_decode); use POSIX qw(strftime); sub index { my ($self) = @_; $self->render(text => "Go away!\n"); } sub captcha { my ($self) = @_; eval { $self->allow_cors; my ($cid, $data) = $self->app->get_captcha; $self->app->log->debug("showing captcha #$cid"); $self->render(json => {cid => $cid, data => $data}); 1; } or do { chomp $@; $self->app->log->error("error when showing captcha: $@"); $self->client_reply(500, "internal error"); }; } sub c_form { my ($self) = @_; $self->allow_cors; $self->respond_to(json => {json => {}}, any => {template => 'main/form'}); } sub c_list { my ($self) = @_; my $ref = $self->referrer; unless ($ref and ref($ref) eq 'HASH') { $self->client_reply(400, "can't detect referred page"); return; } eval { $self->allow_cors; my $site = $self->app->site_by_name($ref->{site}); if ($site and ref($site) eq 'HASH') { my @cm = (); if (my $pid = $self->app->pid_by_hash($site->{id}, $ref->{hash})) { $ref->{pid} = $pid; my @tm = $self->app->comments_by_pid($pid); foreach my $c (@tm) { $c->{date} = strftime("%Y-%m-%d %H:%M", localtime($c->{date})); $c->{text} = b64_decode($c->{text}); # TODO: processing } @cm = @tm; } $self->stash(comments => \@cm); $self->respond_to(json => {json => \@cm}, any => {template => 'main/list'}); } else { $self->client_reply(400, "no such site"); } 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->client_reply(500, "internal error"); }; } sub c_add { my ($self) = @_; my $ref = $self->referrer; unless ($ref and ref($ref) eq 'HASH') { $self->client_reply(400, "can't detect referred page"); return; } eval { $self->allow_cors; 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->client_reply(400, "empty message"); last; } my $site = $self->app->site_by_name($ref->{site}); unless ($site and ref($site) eq 'HASH') { $self->client_reply(400, "no such site"); last; } if ($site->{captcha}) { unless ($cap{cid}) { $self->client_reply(400, "missing captcha id"); last; } unless ($cap{code}) { $self->client_reply(400, "missing captcha code"); last; } if (my $error = $self->app->captcha_solve($cap{cid}, $cap{code})) { $self->client_reply(400, $error); last; } } my $pid = $self->app->pid_by_hash($site->{id}, $ref->{hash}); unless ($pid) { $self->app->add_page($site->{id}, $ref); $pid = $self->app->pid_by_hash($site->{id}, $ref->{hash}); } $self->add_comment($pid, \%msg); $self->client_reply(200, "OK"); }} 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->client_reply(500, "internal error"); }; } 1;