From 99668c1df628ff6774d1d7e840296e2ac676cf3d Mon Sep 17 00:00:00 2001 From: hylom Date: Fri, 7 Oct 2016 22:04:39 +0900 Subject: [PATCH] Model::Submission: fix create method, and support 'signature => sig' style query in select method --- src/newslash_web/lib/Newslash/Model/Submissions.pm | 111 +++++++++++++++------ 1 file changed, 79 insertions(+), 32 deletions(-) diff --git a/src/newslash_web/lib/Newslash/Model/Submissions.pm b/src/newslash_web/lib/Newslash/Model/Submissions.pm index 66479525..fb1a6c3f 100644 --- a/src/newslash_web/lib/Newslash/Model/Submissions.pm +++ b/src/newslash_web/lib/Newslash/Model/Submissions.pm @@ -5,12 +5,12 @@ use Data::Dumper; use Mojo::Log; use Mail::Address; -use MD5::Digest qw(md5_hex); +use Digest::MD5 qw(md5_hex); use Encode; use Newslash::Model::Globjs; use Newslash::Model::Discussions; - +use Newslash::Model::Urls; #======================================================================== =head2 latest(\%options) @@ -145,14 +145,16 @@ HASH of story contents =cut sub select { - my ($self, $query_type, $value) = @_; + my $self = shift; + my $query_type = shift; + my $value = shift; - if ($query_type !~ m/\A(subid)\z/) { - return undef; - } + if ($query_type !~ m/\A(subid|signature)\z/) { + return undef; + } - my $dbh = $self->connect_db; - my $sql = <<"EOSQL"; + my $dbh = $self->connect_db; + my $sql = <<"EOSQL"; SELECT submissions.*, users.nickname as author, firehose.toptags, firehose.discussion, topics.* FROM submissions LEFT JOIN users ON submissions.uid = users.uid @@ -197,6 +199,23 @@ sub _generalize { return $submission; } +sub _email_to_domain { + my ($email) = @_; + if (!$email) { + return ''; + } + my $addr = Mail::Address->new('', $email); + return '' if !$addr; + my $host = $addr->host(); + return '' if !$host; + return fullhost_to_domain($host); +} + +sub generate_signature { + my ($self, $intro_text, $title) = @_; + return md5_hex(encode_utf8($intro_text . $title)); +} + #======================================================================== =head2 insert(\%params, \%options) @@ -240,17 +259,9 @@ sub create { } $opts ||= {}; $extra_params ||= {}; - my $primaryskid = 1; + my $primaryskid = 1; #mainpage; # temporary function from slash (Slash::Utility::Data) - my $email_to_domain = sub { - my($email) = @_; - my $addr = Mail::Address->new('', $email); - return '' if !$addr; - my $host = $addr->host(); - return '' if !$host; - return fullhost_to_domain($host); - }; my $dbh = $self->connect_db({AutoCommit => 0,}); my $sql = <<"EOSQL"; @@ -260,22 +271,36 @@ INSERT INTO submissions (?, ?, ?, NOW(), ?, ?, ?, ?, ?, ?, ?, ?) EOSQL + $params->{email} ||= ''; + if ($params->{url}) { + #my $urls = Newslash::Model::Urls->new($self->{options}); + my $urls = $self->new_instance_of("Newslash::Model::Urls"); + my $url_data = {url => $params->{url}}; + my $url_id = $urls->getUrlCreate($url_data); + $params->{url_id} = $url_id; + } else { + $params->{url_id} = 0; + } + + $dbh->do($sql, undef, $params->{email}, #email - $email_to_domain->($params->{email}), #emaildomain + _email_to_domain($params->{email}), #emaildomain $user->{nickname}, #name $params->{title}, #subj $params->{intro_text}, #story - $params->{primary_tag}->tid, #tid + $params->{tid}, #tid $primaryskid, #primaryskid $user->{uid}, #uid, $user->{ipid}, #ipid, $user->{subnetid}, #subnetid, - md5_hex(encode_utf8($params->{intro_text} . $params->{title})) #signature + $self->generate_signature($params->{intro_text}, $params->{title}) #signature ); my $sub_id = $dbh->last_insert_id(undef, undef, undef, undef); if (!$sub_id) { # error occured + $self->set_errorno($dbh->{mysql_errno}); + $self->set_error("mysql_error"); $dbh->rollback; $dbh->disconnect; return undef; @@ -285,9 +310,11 @@ EOSQL my @param_ids; if ($extra_params) { for my $k (keys %$extra_params) { - my $param_id = $dbh->do($sqlm undef, $sub_id, $k, $extra_params->{$k}); + my $param_id = $dbh->do($sql, undef, $sub_id, $k, $extra_params->{$k}); if (!$param_id) { # error occured + $self->set_errorno($dbh->{mysql_errno}); + $self->set_error("mysql_error"); $dbh->rollback; $dbh->disconnect; return undef; @@ -302,23 +329,35 @@ EOSQL my $rs = $sth->fetchrow_hashref; if (!$rs) { # error occured + $self->set_errorno($dbh->{mysql_errno}); + $self->set_error("mysql_error"); $dbh->rollback; $dbh->disconnect; return undef; } + $sth->finish; my $create_time = $rs->{time}; # create firehose entry - my $globjs = Newslash::Model::Globjs->new($self->options); - my $globj_id = $globjs->getGlobjidCreate("submissions", $submission->{subid}); + my $globjs = Newslash::Model::Globjs->new($self->{options}); + my $globj_id = $globjs->getGlobjidCreate("submissions", $sub_id); + if (!$globj_id) { + # error occured + warn "invalid globjid"; + $self->set_error("invalid globjid"); + $dbh->rollback; + $dbh->disconnect; + return undef; + } + # TODO: sprite_info column don't have default value... $sql = <<"EOSQL"; INSERT INTO firehose (uid, globjid, type, createtime, popularity, editorpop, public, attention_needed, primaryskid, tid, srcid, - url_id, email, emaildomain, name, ipid, subnetid) + url_id, email, emaildomain, name, ipid, subnetid, sprite_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, - ?, ?, ?, ?, ?, ?) + ?, ?, ?, ?, ?, ?, "") EOSQL # my $midpop = $self->getEntryPopularityForColorLevel(5); @@ -336,17 +375,19 @@ EOSQL "yes", #public "yes", #attention_needed $primaryskid, #primaryskid - $params->{primary_tag}->tid, #tid + $params->{tid}, #tid $sub_id, #srcid $params->{url_id}, #url_id $params->{email}, #email - $email_to_domain->($params->{email}), #emaildomain + _email_to_domain($params->{email}), #emaildomain $user->{nickname}, #name $user->{ipid}, #ipid $user->{subnetid} #subnetid ); if (!$rs) { # error occured + $self->set_errorno($dbh->{mysql_errno}); + $self->set_error("mysql_error"); $dbh->rollback; $dbh->disconnect; return undef; @@ -357,6 +398,8 @@ EOSQL $rs = $dbh->do($sql, undef, $params->{title}, $params->{intro_text}); if (!$rs) { # error occured + $self->set_errorno($dbh->{mysql_errno}); + $self->set_error("mysql_error"); $dbh->rollback; $dbh->disconnect; return undef; @@ -366,23 +409,25 @@ EOSQL # in old slash, add 'nod' tag when author is not anonymous, but ommit them. # create discussion - my $discuss = Newslash::Model::Discussions->new($self->options); + my $discuss = Newslash::Model::Discussions->new($self->{options}); my $default_comment_status = 'logged_in'; #my $defualt_url = "$constants->{rootdir}/firehose.pl?op=view&id=$firehose_id"; - my $defualt_url = "/firehose.pl?op=view&id=$firehose_id"; + my $default_url = "/firehose.pl?op=view&id=$firehose_id"; my $d = { uid => 0, kind => 'submission', - title => $param->{title}, - topic => $param->{primary_tag}->{tid}, + title => $params->{title}, + topic => $params->{tid}, primaryskid => $primaryskid, commentstatus => $default_comment_status, url => $default_url, ts => $create_time, }; - my $discussion_id = $discuss->create(d, {dbh => $dbh}); + my $discussion_id = $discuss->create($d, {dbh => $dbh}); if (!$discussion_id) { # error occured + $self->set_errorno($discuss->last_error); + $self->set_error("mysql_error"); $dbh->rollback; $dbh->disconnect; return undef; @@ -391,6 +436,8 @@ EOSQL $rs = $dbh->do($sql, undef, $discussion_id, $firehose_id); if (!$rs) { # error occured + $self->set_errorno($dbh->{mysql_errno}); + $self->set_error("mysql_error"); $dbh->rollback; $dbh->disconnect; return undef; -- 2.11.0