OSDN Git Service

Model::Submission: fix create method, and support 'signature => sig' style query...
authorhylom <hylom@users.sourceforge.jp>
Fri, 7 Oct 2016 13:04:39 +0000 (22:04 +0900)
committerhylom <hylom@users.sourceforge.jp>
Fri, 7 Oct 2016 13:04:39 +0000 (22:04 +0900)
src/newslash_web/lib/Newslash/Model/Submissions.pm

index 6647952..fb1a6c3 100644 (file)
@@ -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;