summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2013-01-04 14:41:59 +0100
committerYorhel <git@yorhel.nl>2013-01-04 14:41:59 +0100
commit96ef3844ee319a83fbede209b00fe4cf64377dbf (patch)
treeeef622132a2e4d4d2daf06e75a65a519e467fb71 /lib
parentf82cf5bf05bc988825dd1581be7fa850e535ff88 (diff)
Multi::API: Added 'set vnlist'
Diffstat (limited to 'lib')
-rw-r--r--lib/Multi/API.pm37
1 files changed, 31 insertions, 6 deletions
diff --git a/lib/Multi/API.pm b/lib/Multi/API.pm
index 4a20d816..6c761a23 100644
--- a/lib/Multi/API.pm
+++ b/lib/Multi/API.pm
@@ -42,7 +42,8 @@ sub spawn {
_start shutdown log server_error client_connect client_error client_input
login login_res get_results get_vn get_vn_res get_release get_release_res
get_producer get_producer_res get_votelist get_votelist_res get_vnlist
- get_vnlist_res get_wishlist get_wishlist_res set_votelist set_return admin
+ get_vnlist_res get_wishlist get_wishlist_res set_votelist set_vnlist
+ set_return admin
|],
],
heap => {
@@ -375,7 +376,7 @@ sub client_input {
if($cmd eq 'set') {
return cerr $c, parse => 'Invalid arguments to set command' if @$arg < 2 || @$arg > 3 || ref($arg->[0])
|| ref($arg->[1]) || $arg->[1] !~ /^\d+$/ || $arg->[1] < 1 || $arg->[1] > 1e6 || (defined($arg->[2]) && ref($arg->[2]) ne 'HASH');
- return cerr $c, 'settype', "Unknown set type: '$arg->[0]'" if $arg->[0] !~ /^votelist$/;
+ return cerr $c, 'settype', "Unknown set type: '$arg->[0]'" if $arg->[0] !~ /^(votelist|vnlist)$/;
return cerr $c, needlogin => 'Not logged in as a user' if !$c->{uid};
my %obj = (
c => $c,
@@ -996,14 +997,38 @@ sub set_votelist {
return $_[KERNEL]->post(pg => do => 'DELETE FROM votes WHERE uid = ? AND vid = ?',
[ $obj->{c}{uid}, $obj->{id} ], 'set_return', $obj) if !$obj->{opt};
- my $vote = $obj->{opt}{vote};
- return cerr $obj->{c}, missing => 'No vote given', field => 'vote' if !defined $vote;
- return cerr $obj->{c}, badarg => 'Invalid vote', field => 'vote' if $vote !~ /^\d+$/ || $vote < 10 || $vote > 100;
+ my($ev, $vv) = (exists($obj->{opt}{vote}), $obj->{opt}{vote});
+ return cerr $obj->{c}, missing => 'No vote given', field => 'vote' if !$ev;
+ return cerr $obj->{c}, badarg => 'Invalid vote', field => 'vote' if ref($vv) || $vv !~ /^\d+$/ || $vv < 10 || $vv > 100;
return $_[KERNEL]->post(pg => do => q{
WITH upsert AS (UPDATE votes SET vote = ? WHERE uid = ? AND vid = ? RETURNING vid)
INSERT INTO votes (uid, vid, vote) SELECT ?, ?, ? WHERE EXISTS(SELECT 1 FROM vn v WHERE v.id = ?) AND NOT EXISTS(SELECT 1 FROM upsert)
- }, [ $vote, $obj->{c}{uid}, $obj->{id}, $obj->{c}{uid}, $obj->{id}, $vote, $obj->{id} ], 'set_return', $obj);
+ }, [ $vv, $obj->{c}{uid}, $obj->{id}, $obj->{c}{uid}, $obj->{id}, $vv, $obj->{id} ], 'set_return', $obj);
+}
+
+
+sub set_vnlist {
+ my $obj = $_[ARG0];
+
+ return $_[KERNEL]->post(pg => do => 'DELETE FROM vnlists WHERE uid = ? AND vid = ?',
+ [ $obj->{c}{uid}, $obj->{id} ], 'set_return', $obj) if !$obj->{opt};
+
+ my($es, $en, $vs, $vn) = (exists($obj->{opt}{status}), exists($obj->{opt}{notes}), $obj->{opt}{status}, $obj->{opt}{notes});
+ return cerr $obj->{c}, missing => 'No status or notes given', field => 'status,notes' if !$es && !$en;
+ return cerr $obj->{c}, badarg => 'Invalid status', field => 'status' if $es && (!defined($vs) || ref($vs) || $vs !~ /^[0-4]$/);
+ return cerr $obj->{c}, badarg => 'Invalid notes', field => 'notes' if $en && (ref($vn) || (defined($vn) && $vn =~ /[\r\n]/));
+
+ $vs ||= 0;
+ $vn ||= '';
+
+ my $set = join ', ', $es ? 'status = ?' : (), $en ? 'notes = ?' : ();
+ my @set = ($es ? $vs : (), $en ? $vn : ());
+
+ return $_[KERNEL]->post(pg => do => qq{
+ WITH upsert AS (UPDATE vnlists SET $set WHERE uid = ? AND vid = ? RETURNING vid)
+ INSERT INTO vnlists (uid, vid, status, notes) SELECT ?, ?, ?, ? WHERE EXISTS(SELECT 1 FROM vn v WHERE v.id = ?) AND NOT EXISTS(SELECT 1 FROM upsert)
+ }, [ @set, $obj->{c}{uid}, $obj->{id}, $obj->{c}{uid}, $obj->{id}, $vs, $vn, $obj->{id} ], 'set_return', $obj);
}