summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2021-07-29 18:40:11 +0200
committerYorhel <git@yorhel.nl>2021-07-30 11:25:27 +0200
commit45df2ef26b7df9d43093655f56e345d717a737a3 (patch)
tree0f94d359f92af64a88c279f6362a08e014871aba /lib
parentd2b959a3ca4169fa43f9f422c2b869c3bede08a0 (diff)
Add early test implementation of VN length voting
There's no way to list or aggregate the votes yet, and I'm not fully sure the data model is what it should be. Hence testing.
Diffstat (limited to 'lib')
-rw-r--r--lib/VNWeb/Auth.pm2
-rw-r--r--lib/VNWeb/User/Edit.pm11
-rw-r--r--lib/VNWeb/VN/Elm.pm23
-rw-r--r--lib/VNWeb/VN/Page.pm11
4 files changed, 40 insertions, 7 deletions
diff --git a/lib/VNWeb/Auth.pm b/lib/VNWeb/Auth.pm
index 3408db77..06ca88ec 100644
--- a/lib/VNWeb/Auth.pm
+++ b/lib/VNWeb/Auth.pm
@@ -67,7 +67,7 @@ sub isMod { auth->permUsermod || auth->permDbmod || auth->permBoardmod || auth->
-my @perms = qw/board boardmod edit imgvote tag dbmod tagmod usermod review/;
+my @perms = qw/board boardmod edit imgvote tag dbmod tagmod usermod review lengthvote/;
sub listPerms { @perms }
diff --git a/lib/VNWeb/User/Edit.pm b/lib/VNWeb/User/Edit.pm
index d04647ad..ad74088f 100644
--- a/lib/VNWeb/User/Edit.pm
+++ b/lib/VNWeb/User/Edit.pm
@@ -128,11 +128,12 @@ elm_api UserEdit => $FORM_OUT, $FORM_IN, sub {
tuwf->dbExeci(select => sql_func user_setperm_usermod => \$data->{id}, \auth->uid, sql_fromhex(auth->token), \$data->{admin}{perm_usermod});
$set{"perm_$_"} = $data->{admin}{"perm_$_"} for grep $_ ne 'usermod', auth->listPerms;
}
- $set{perm_board} = $data->{admin}{perm_board} if auth->permBoardmod;
- $set{perm_review} = $data->{admin}{perm_review} if auth->permBoardmod;
- $set{perm_edit} = $data->{admin}{perm_edit} if auth->permDbmod;
- $set{perm_imgvote} = $data->{admin}{perm_imgvote} if auth->permDbmod;
- $set{perm_tag} = $data->{admin}{perm_tag} if auth->permTagmod;
+ $set{perm_board} = $data->{admin}{perm_board} if auth->permBoardmod;
+ $set{perm_review} = $data->{admin}{perm_review} if auth->permBoardmod;
+ $set{perm_edit} = $data->{admin}{perm_edit} if auth->permDbmod;
+ $set{perm_imgvote} = $data->{admin}{perm_imgvote} if auth->permDbmod;
+ $set{perm_lengthvote} = $data->{admin}{perm_lengthvote} if auth->permDbmod;
+ $set{perm_tag} = $data->{admin}{perm_tag} if auth->permTagmod;
if($own && $data->{password}) {
return elm_InsecurePass if is_insecurepass $data->{password}{new};
diff --git a/lib/VNWeb/VN/Elm.pm b/lib/VNWeb/VN/Elm.pm
index 3bf02d59..fb452a43 100644
--- a/lib/VNWeb/VN/Elm.pm
+++ b/lib/VNWeb/VN/Elm.pm
@@ -30,4 +30,27 @@ elm_api VN => undef, {
');
};
+
+our $LENGTHVOTE = form_compile any => {
+ uid => { vndbid => 'u' },
+ vid => { vndbid => 'v' },
+ vote => { type => 'hash', required => 0, keys => {
+ rid => { vndbid => 'r' },
+ length => { uint => 1, range => [1,32767] },
+ notes => { required => 0, default => '' },
+ } },
+};
+
+elm_api VNLengthVote => undef, $LENGTHVOTE, sub {
+ my($data) = @_;
+ return elm_Unauth if !auth->permLengthvote || $data->{uid} ne auth->uid;
+ my %where = ( uid => $data->{uid}, vid => $data->{vid} );
+ tuwf->dbExeci('DELETE FROM vn_length_votes WHERE', \%where) if !$data->{vote};
+ tuwf->dbExeci(
+ 'INSERT INTO vn_length_votes', { %where, $data->{vote}->%* },
+ 'ON CONFLICT (uid, vid) DO UPDATE SET', $data->{vote}
+ ) if $data->{vote};
+ return elm_Success;
+};
+
1;
diff --git a/lib/VNWeb/VN/Page.pm b/lib/VNWeb/VN/Page.pm
index 6a45502c..10ac10ba 100644
--- a/lib/VNWeb/VN/Page.pm
+++ b/lib/VNWeb/VN/Page.pm
@@ -355,7 +355,16 @@ sub infobox_ {
tr_ sub {
td_ 'Length';
- td_ "$VN_LENGTH{$v->{length}}{txt} ($VN_LENGTH{$v->{length}}{time})";
+ td_ sub {
+ txt_ "$VN_LENGTH{$v->{length}}{txt} ($VN_LENGTH{$v->{length}}{time})";
+ if (auth->permLengthvote && canvote $v) {
+ my $vote = tuwf->dbRowi('SELECT rid, length, notes FROM vn_length_votes WHERE vid =', \$v->{id}, 'AND uid =', \auth->uid);
+ elm_ VNLengthVote => $VNWeb::VN::Elm::LENGTHVOTE, {
+ uid => auth->uid, vid => $v->{id},
+ vote => $vote->{rid}?$vote:undef,
+ }, sub { span_ @_, ''};
+ }
+ };
} if $v->{length};
infobox_producers_ $v;