From 592525a74a3cca9a9b9af854e0b247095c562725 Mon Sep 17 00:00:00 2001 From: hylom Date: Thu, 30 Mar 2017 21:08:01 +0900 Subject: [PATCH] Model::Moderations: rollback when error occured in create() --- src/newslash_web/lib/Newslash/Model/Moderations.pm | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/newslash_web/lib/Newslash/Model/Moderations.pm b/src/newslash_web/lib/Newslash/Model/Moderations.pm index 05bfaa10..b7b76efb 100644 --- a/src/newslash_web/lib/Newslash/Model/Moderations.pm +++ b/src/newslash_web/lib/Newslash/Model/Moderations.pm @@ -112,6 +112,7 @@ sub create { my $comment = $comments->select(cid => $cid); if (!$comment) { $self->set_error('comment cannot retrived'); + $self->rollback; return; } @@ -120,12 +121,14 @@ sub create { my $discussion = $discussions->select(id => $comment->{sid}); if (!$discussion) { $self->set_error('discussion cannot retrived'); + $self->rollback; return; } # check if discussion is not archived if ($discussion->{type} eq 'archived') { $self->set_error('discussion is archived'); + $self->rollback; return; } @@ -136,13 +139,20 @@ sub create { my $rs = $comments->select(sid => $comment->{sid}, uid => $user->{uid}); if (!$rs || @$rs > 0) { $self->set_error('you already posted to the discussion'); + $self->rollback; return; } # check the user has moderate points my $user_comments = $users->select(target => 'comments', uid => $users->{uid}); + if (!$user_comments) { + $self->set_error('select from user_comments failed'); + $self->rollback; + return; + } if ($user_comments->{points} < 1) { $self->set_error('no moderate points'); + $self->rollback; return; } } @@ -151,6 +161,7 @@ sub create { my $reason = $self->reasons->{$reason_id}; if (!$reason) { $self->set_error('invalid reason'); + $self->rollback; return; } @@ -163,8 +174,11 @@ sub create { # current score is max or min limit, so create moderate log only. my $mod_id = $self->create_log($user, $comment, $reason, 0); if (!$mod_id) { + #$self->set_error('create log failed'); + $self->rollback; return; } + $self->commit; return $mod_id; } @@ -176,6 +190,7 @@ sub create { if ($rs == 0) { # nothing updated! # already moderate point is 0, so cancel this moderate action $self->set_error('no moderate points'); + $self->rollback; return; } @@ -228,10 +243,8 @@ sub create { $self->rollback; return; } - return $mod_id; - $self->commit; - return 1; + return $mod_id; } @@ -401,6 +414,7 @@ EOSQL my $sth = $dbh->prepare($sql); my $rs = $sth->execute(@attrs); if (!$rs) { + $self->set_error($dbh->errstr, $dbh->err); return; } my $mod_id = $dbh->last_insert_id(undef, undef, undef, undef); -- 2.11.0