mourningdove/cgi-bin/DW/Controller/RPC/Poll.pm
2026-05-24 01:03:05 +00:00

179 lines
4.7 KiB
Perl

# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
#
package DW::Controller::RPC::Poll;
use strict;
use DW::Routing;
use LJ::JSON;
DW::Routing->register_rpc( "poll", \&poll_handler, format => 'json' );
DW::Routing->register_rpc( "pollvote", \&pollvote_handler, format => 'json' );
sub poll_handler {
my $r = DW::Request->get;
my $args = $r->post_args;
my $ret = {};
my $err = sub {
my $msg = shift;
$r->print(
to_json(
{
error => "Error: $msg",
}
)
);
return $r->OK;
};
my $pollid = ( ( $args->{pollid} || 0 ) + 0 ) or return $err->("No pollid");
my $pollqid = ( $args->{pollqid} || 0 ) + 0;
my $userid = ( $args->{userid} || 0 ) + 0;
my $action = $args->{action};
my $page = ( $args->{page} || 0 ) + 0;
my $pagesize = ( $args->{pagesize} || 2000 ) + 0;
my $poll = LJ::Poll->new($pollid) or return $err->("Error loading poll $pollid");
my $remote = LJ::get_remote();
unless ( $poll->can_view($remote) ) {
return $err->("You cannot view this poll");
}
if ( $action eq 'get_answers' ) {
return $err->("No pollqid") unless $pollqid;
my $question = $poll->question($pollqid)
or return $err->("Error loading question $pollqid");
my $pages = $question->answers_pages( $poll->journalid, $pagesize );
$ret->{paging_html} =
$question->paging_bar_as_html( $page, $pages, $pagesize, $poll->journalid, $pollid,
$pollqid );
$ret->{answer_html} =
$question->answers_as_html( $poll->journalid, $poll->isanon, $page, $pagesize, $pages );
}
elsif ( $action eq 'get_respondents' ) {
$ret->{answer_html} = $poll->respondents_as_html;
}
elsif ( $action eq 'get_user_answers' ) {
return $err->("No userid") unless $userid;
$ret->{answer_html} = $poll->user_answers_as_html($userid);
}
else {
return $err->("Invalid action $action");
}
$ret = {
%$ret,
pollid => $pollid,
pollqid => $pollqid,
userid => $userid,
page => $page,
};
$r->print( to_json($ret) );
return $r->OK;
}
sub pollvote_handler {
my $r = DW::Request->get;
my $args = $r->post_args;
my $ret = {};
my $err = sub {
my $msg = shift;
$r->print(
to_json(
{
error => "Error: $msg",
}
)
);
return $r->OK;
};
# Flatten multi-arg into comma seperated
my %values;
foreach my $key ( keys %$args ) {
$values{$key} = join( ",", $args->get_all($key) );
}
my $remote = LJ::get_remote();
my $pollid = $args->{pollid} or return $err->("No pollid");
my $poll = LJ::Poll->new($pollid);
unless ( $poll && $poll->valid ) {
return $err->("Poll not found");
}
my $u = $poll->journal;
# load the item being shown
my $entry = $poll->entry;
unless ($entry) {
return $err->("Post was deleted");
}
unless ( $entry->visible_to($remote) ) {
return $err->("You don't have the permissions to view this poll");
}
my $action = $args->{action};
if ( $action eq "vote" ) {
unless ( $r->did_post ) {
# I am not sure we can even get here
return $err->("Post is required");
}
unless ( LJ::check_form_auth( $args->{lj_form_auth} ) ) {
return $err->("Form is invalid; reload and try again");
}
my $error;
LJ::Poll->process_submission( \%values, \$error );
if ($error) {
return $err->($error);
}
$ret->{results_html} = $poll->render( mode => "results" );
$ret = { %$ret, pollid => $pollid };
}
elsif ( $action eq "change" ) {
$ret->{results_html} = $poll->render( mode => "enter" );
$ret = { %$ret, pollid => $pollid };
}
elsif ( $action eq "display" ) {
$ret->{results_html} = $poll->render( mode => "results" );
$ret = { %$ret, pollid => $pollid };
}
$r->print( to_json($ret) );
return $r->OK;
}
1;