diff options
author | Yorhel <git@yorhel.nl> | 2011-01-04 17:30:57 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2011-01-04 17:30:57 +0100 |
commit | d5d55cb04e95fdf9d5185e9f8516e906eeb03831 (patch) | |
tree | ce9b50520ac3533ace8021ff8149c630dc173a23 /lib/VNDB/DB/Tags.pm | |
parent | a48a7f5b0d4e65a70337d40f7df287810f27d547 (diff) |
Added checkboxes to VN tagmod and implemented the overrule logic
This finalizes the moderation tag vote overrule. And Damnit, the logic
behind saving the tags to the database isn't fun, I hope I haven't made
any mistakes there.
Diffstat (limited to 'lib/VNDB/DB/Tags.pm')
-rw-r--r-- | lib/VNDB/DB/Tags.pm | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/lib/VNDB/DB/Tags.pm b/lib/VNDB/DB/Tags.pm index 623ac10d..b7792eb8 100644 --- a/lib/VNDB/DB/Tags.pm +++ b/lib/VNDB/DB/Tags.pm @@ -202,36 +202,31 @@ sub dbTagLinks { # Change a user's tags for a VN entry -# Arguments: uid, vid, [ [ tag, vote, spoiler ], .. ] sub dbTagLinkEdit { - my($self, $uid, $vid, $new) = @_; - - # compare with the old votes and determine which to delete, and/or insert - my %old = map +($_->{tag}, [ $_->{vote}, $_->{spoiler} // -1 ]), - @{$self->dbTagLinks(vid => $vid, uid => $self->authInfo->{id})}; - my %new = map +($_->[0], [ $_->[1], $_->[2] ]), @$new; - - my(%delete, %update, %insert); - for my $tag (keys %old, keys %new) { - if($old{$tag} && !$new{$tag}) { - $delete{$tag} = 1; - } elsif(!$old{$tag} && $new{$tag}) { - $insert{$tag} = $new{$tag}; - } elsif($old{$tag}[0] != $new{$tag}[0] || $old{$tag}[1] != $new{$tag}[1]) { - $update{$tag} = $new{$tag}; - } - } + my($self, $uid, $vid, $insert, $update, $delete, $overrule) = @_; + + # overrule + # 1. set ignore flag for everyone except $uid + $self->dbExec('UPDATE tags_vn SET ignore = ? WHERE tag = ? AND vid = ? AND uid <> ?', + $overrule->{$_}?1:0, $_, $vid, $uid) for(keys %$overrule); + # 2. make sure $uid isn't ignored when others are set to ignore + # (this happens when a mod takes over an other mods' overrule) + $self->dbExec('UPDATE tags_vn SET ignore = false WHERE tag = ? AND vid = ? AND uid = ?', + $_, $vid, $uid) for(grep $overrule->{$_}, keys %$overrule); + + # delete + $self->dbExec('DELETE FROM tags_vn WHERE vid = ? AND uid = ? AND tag IN(!l)', + $vid, $uid, [ keys %$delete ]) if keys %$delete; - # spoiler '-1' -> NULL - $new{$_}[1] == -1 && ($new{$_}[1] = undef) for keys %new; + # insert + my $val = join ',', map '(?,?,?,?,?,?)', keys %$insert; + $self->dbExec("INSERT INTO tags_vn (tag, vid, uid, vote, spoiler, ignore) VALUES $val", map + +($_, $vid, $uid, $insert->{$_}[0], $insert->{$_}[1]<0?undef:$insert->{$_}[1], $insert->{$_}[2]?1:0), + keys %$insert) if keys %$insert; - # perform the changes - $self->dbExec('DELETE FROM tags_vn WHERE vid = ? AND uid = ? AND tag IN(!l)', - $vid, $uid, [ keys %delete ]) if keys %delete; - $self->dbExec('INSERT INTO tags_vn (tag, vid, uid, vote, spoiler) VALUES (?, ?, ?, ?, ?)', - $_, $vid, $uid, $insert{$_}[0], $insert{$_}[1]) for (keys %insert); + # update $self->dbExec('UPDATE tags_vn SET vote = ?, spoiler = ?, date = NOW() WHERE tag = ? AND vid = ? AND uid = ?', - $update{$_}[0], $update{$_}[1], $_, $vid, $uid) for (keys %update); + $update->{$_}[0], $update->{$_}[1]<0?undef:$update->{$_}[1], $_, $vid, $uid) for (keys %$update); } |