OSDN Git Service

Model: fix problem caused by Cowrapper restrucure
authorhylom <hylom@users.sourceforge.jp>
Thu, 6 Sep 2018 13:22:59 +0000 (22:22 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 6 Sep 2018 13:22:59 +0000 (22:22 +0900)
src/newslash_web/lib/Newslash/Model/Events.pm
src/newslash_web/lib/Newslash/Model/Firehose.pm
src/newslash_web/lib/Newslash/Model/Messages.pm
src/newslash_web/lib/Newslash/Model/Topics.pm
src/newslash_web/lib/Newslash/Model/Users/Class.pm
src/newslash_web/lib/Newslash/Model/Users/Messages.pm
src/newslash_web/lib/Newslash/Model/WebMessages.pm
src/newslash_web/t/models/firehose.t
src/newslash_web/t/models/messages.t
src/newslash_web/t/models/moderations.t
src/newslash_web/t/models/users.t

index a6035bf..5d400da 100644 (file)
@@ -7,6 +7,21 @@ use Mojo::Log;
 
 use constant EVENTS_TABLE_NAME => 'ns_events';
 
+sub key_definition {
+    return {
+            table => "ns_events",
+            primary => "event_id",
+            datetime => [qw(created_timestamp)],
+            timestamp => "created_timestamp",
+            other => [qw(event_type event_subtype
+                         related_id source_user_id
+                         active result)],
+            aliases => { event_id => "id",
+                         create_time => "created_timestamp",
+                       }
+           };
+}
+
 sub on_start_up {
     my $self = shift;
 
@@ -44,22 +59,7 @@ sub select {
     my $self = shift;
     my $params = {@_};
 
-    my $unique_keys = { id => "ns_events.event_id",
-                        event_id => "ns_events.event_id",
-                      };
-    my $keys = { type => "ns_events.event_type",
-                 event_type => "ns_events.event_type",
-                 event_subtype => "ns_events.event_subtype",
-                 subtype => "ns_events.event_subtype",
-                 related_id => "ns_events.related_id",
-                 source_user_id => "ns_events.source_user_id",
-                 active => "ns_events.active",
-                 result => "ns_events.result",
-               };
-    return $self->generic_select(table => "ns_events",
-                                 unique_keys => $unique_keys,
-                                 keys => $keys,
-                                 params => $params);
+    return $self->generic_select(parmas => $params);
 }
 
 
@@ -159,7 +159,7 @@ EOSQL
 sub select {
     my $self = shift;
     return $self->generic_select(table => EVENTS_TABLE_NAME,
-                                 uniques => [qw(event_id)],
+                                 unique_keys => [qw(event_id)],
                                  keys => [qw(source_type related_id source_user_id active created_timestamp)],
                                  params => {@_});
 }
index 3184fa2..4153012 100644 (file)
@@ -1,6 +1,7 @@
 package Newslash::Model::Firehose;
 use Newslash::Model::Base -base;
 use Data::Dumper;
+use List::Util qw(any);
 
 sub key_definition {
     return {
@@ -50,32 +51,6 @@ sub select {
         }
     }
 
-    # my $unique_keys = { id => "firehose.id",
-    #                     firehose_id => "firehose.id",
-    #                     globjid => "firehose.globjid",
-    #                     globj_id => "firehose.globjid",
-    #                     src_id => "firehose.srcid",
-    #                   };
-    # my $keys = { type => "firehose.type",
-    #              tagnameid => "tags.tagnameid",
-    #              tag_name_id => "tags.tagnameid",
-    #            };
-    # my $datetime_keys = { create_time => "firehose.createtime",
-    #                       update_time => "firehose.last_update",
-    #                     };
-    # my $timestamp = "firehose.createtime";
-
-    # my ($where_clause, $where_values, $unique) = $self->build_where_clause(unique_keys => $unique_keys,
-    #                                                                        keys => $keys,
-    #                                                                        datetime_keys => $datetime_keys,
-    #                                                                        timestamp => $timestamp,
-    #                                                                        params => $params);
-    # my ($limit_clause, $limit_values) = $self->build_limit_clause(params => $params);
-    # my ($orderby_clause, $orderby_values) = $self->build_order_by_clause(keys => $keys,
-    #                                                                      datetime_keys => $datetime_keys,
-    #                                                                      unique_keys => $unique_keys,
-    #                                                                      params => $params);
-
     my ($where_clause, $where_values, $unique) = $self->build_where_clause(params => $params);
     my ($limit_clause, $limit_values) = $self->build_limit_clause(params => $params, default => 50);
     my ($orderby_clause, $orderby_values) = $self->build_order_by_clause(params => $params);
@@ -122,6 +97,9 @@ SELECT firehose.id AS firehose_id, firehose.*, firehose_text.*, topics.tid
     $limit_clause
 EOSQL
 
+    #warn $sql;
+    #warn Dumper @attrs;
+
     my $sth = $dbh->prepare($sql);
     $sth->execute(@attrs);
     my $items = $sth->fetchall_arrayref({});
@@ -177,7 +155,47 @@ EOSQL
 sub update {
     my $self = shift;
     my $params = {@_};
-    return $self->generic_update(params => $params);
+
+    # keys for firehose_text table
+    my $text_params = {};
+    $text_params->{id} = $params->{id} || $params->{firehose_id};
+    $text_params->{title} = $params->{title};
+    $text_params->{introtext} = $params->{intro_text} || $params->{introtext};
+    $text_params->{bodytext} = $params->{body_text} || $params->{bodytext};
+    $text_params->{media} = $params->{media};
+
+    if (!defined $text_params->{title} &&
+        !defined $text_params->{introtext} &&
+        !defined $text_params->{bodytext} &&
+        !defined $text_params->{media}) {
+        return $self->generic_update(params => $params);
+    }
+
+    $self->start_transaction;
+
+    # update firehose_text table
+    my $rs = $self->generic_update(table => "firehose_text",
+                                   updatable_keys => [qw(title introtext bodytext media)],
+                                   condition_keys => { "id" => "firehose_text.id" },
+                                   params => $text_params);
+    if (!defined $rs) {
+        $self->rollback;
+        return;
+    }
+
+    if ($rs > 0) {
+        $params->{last_update} => { function => "NOW()" };
+    }
+
+    my $rs2 = $self->generic_update(params => $params);
+    if (!defined $rs2) {
+        $self->rollback;
+        return;
+    }
+
+    $self->commit;
+    return $rs > 0 ? $rs : $rs2;
+
 }
 
 
index 38d31c9..ebbae51 100644 (file)
@@ -79,7 +79,7 @@ sub select_message_type {
     my $self = shift;
     my $table_name = MESSAGE_TYPES_TABLE_NAME;
     return $self->generic_select(table => $table_name,
-                                 uniques => [qw(message_type_id name)],
+                                 unique_keys => [qw(message_type_id name)],
                                  params => {@_});
 }
 
@@ -99,7 +99,7 @@ sub create {
     return if (!$uid || !$title || !$body || !$code);
 
     # get message mode
-    my $message_configs = $users->message->select(uid => $uid);
+    my $message_configs = $users->messages->select(uid => $uid);
     my $mode = -1;
     for my $conf (@$message_configs) {
         if ($conf->{code} == $code) {
index 5c3f3d9..acd54a7 100644 (file)
@@ -8,7 +8,7 @@ sub select {
     my $params = {@_};
 
     my $rs = $self->generic_select(table => 'topics',
-                                   uniques => [qw(tid keyword textname)],
+                                   unique_keys => [qw(tid keyword textname)],
                                    keys => [qw(series submittable searchable storypickabe)],
                                    params => $params);
     return $rs;
index a32ce94..d131956 100644 (file)
@@ -3,7 +3,7 @@ use Newslash::Model::Base -base;
 
 sub key_definition {
     return {
-            table => "users_info",
+            table => "users_class",
             primary => "uid",
             other => [qw(rookie)],
             datetime => [qw(rookie_cleared validated_submitter
index 360ea7f..1d8805d 100644 (file)
@@ -6,8 +6,7 @@ sub key_definition {
             table => "users_messages",
             primary => "id",
             other => [qw(uid code mode)],
-            aliases => { user_id => "uid",
-                       }
+            aliases => { user_id => "uid" },
            };
 }
 
@@ -19,36 +18,47 @@ sub select {
 
     my $messages = $self->new_instance_of('Messages');
     my $message_types = $messages->select_message_type;
+    my $code_table = {};
 
-    my $settings =  $self->generic_select(params => { uid => $uid });
-    return if !$settings;
-
-    my $mode_of = {};
-    for my $item (@$settings) {
-        $mode_of->{$item->{code}} = $item->{mode};
+    for my $type (@$message_types) {
+        next if (!$type->{selectable_mode} && !$params->{select_all});
+        $code_table->{$type->{message_type_id}} = { description => $type->{description},
+                                                    code => $type->{message_type_id},
+                                                    selectable_mode => $type->{selectable_mode},
+                                                    mode => -1,
+                                                  };
     }
 
-    my $result = [];
-    for my $type (@$message_types) {
-        next if $type->{selectable_mode} == 0;
-        my $i = {
-                 description => $type->{description},
-                 code => $type->{message_type_id},
-                };
-        if (defined $mode_of->{$type->{message_type_id}}) {
-            $i->{mode} = $mode_of->{$type->{message_type_id}};
-        }
-        else {
-            $i->{mode} = -1; # 'no message'
+    # single query
+    if (defined $params->{code}) {
+        my $code = $params->{code};
+        my $rs = $code_table->{$code};
+        return if !$rs;
+
+        my $settings =  $self->generic_select(params => { uid => $uid,
+                                                          code => $code });
+        if (@$settings) {
+            $rs->{mode} = $settings->[0]->{mode};
         }
-        $i->{selectable_mode} = $type->{selectable_mode};
+        return $rs;
+    }
+
+    # all for uid query
+    my $settings =  $self->generic_select(params => {uid => $uid});
+    return if !defined $settings;
 
-        push @$result, $i;
+    for my $st (@$settings) {
+        my $code = $st->{code};
+        if ($code_table->{$code}) {
+            $code_table->{$code}->{mode} = $st->{mode};
+        }
     }
-    return $result;
+
+    my @rs = values %$code_table;
+    return \@rs;
 }
 
-sub update {
+sub set {
     my $self = shift;
     return if $self->check_readonly;
 
@@ -56,31 +66,66 @@ sub update {
     my $uid = $params->{uid};
     my $code = $params->{code};
     my $mode = $params->{mode};
-    if (!$uid || !$code || !$mode) {
+    if (!$uid || !defined $code || !defined $mode) {
         $self->set_error("uid, code and mode not given");
         return;
     }
 
-    my $dbh = $self->start_transaction;
-    my $rs = $self->generic_update(params => { mode => $mode },
-                                   where => { uid => $uid, code => $code },
-                                  );
-    if (!defined $rs) {
-        $self->rollback;
+    if ($mode == -1) {
+        return $self->delete(uid => $uid, code => $code);
+    }
+
+    my $sql = "INSERT INTO users_messages (uid, code, mode) VALUES (?, ?, ?)" .
+      " ON DUPLICATE KEY UPDATE mode = ?";
+    my $dbh = $self->connect_db;
+    my $rs = $dbh->do($sql, undef, $uid, $code, $mode, $mode);
+    $self->disconnect_db;
+    return $rs;
+}
+
+sub delete {
+    my $self = shift;
+    return if $self->check_readonly;
+
+    my $params = {@_};
+    my $uid = $params->{uid};
+    my $code = $params->{code};
+
+    if (!$uid || !defined $code) {
+        $self->set_error("uid and code not given");
         return;
     }
 
+    my $dbh = $self->connect_db;
     my $sql_cleanup = <<"EOSQL";
-DELETE FROM users_messages WHERE uid = ? AND mode = -1
+DELETE FROM users_messages WHERE uid = ? AND code = ?
 EOSQL
-    my $rs2 = $dbh->do($sql_cleanup, undef, $uid);
-    if (!defined $rs) {
-        $self->set_error($dbh->errstr, $dbh->err);
-        $self->rollback;
+    my $rs = $dbh->do($sql_cleanup, undef, $uid, $code);
+    $self->disconnect_db;
+    return $rs;
+}
+
+sub update {
+    my $self = shift;
+    return if $self->check_readonly;
+
+    my $params = {@_};
+    my $uid = $params->{uid};
+    my $code = $params->{code};
+    my $mode = $params->{mode};
+    if (!$uid || !defined $code || !defined $mode) {
+        $self->set_error("uid, code and mode not given");
         return;
     }
-    $self->commit;
-    return $rs + $rs2;
+
+    # mode == -1 means no messages settings exists
+    if ($mode == -1) {
+        return $self->delete(uid => $uid, mode => $code);
+    }
+
+    my $rs = $self->generic_update(params => { mode => $mode },
+                                   where => { uid => $uid, code => $code });
+    return $rs;
 }
 
 1;
index d542fba..0b22dfc 100644 (file)
@@ -81,7 +81,7 @@ EOSQL
     my $rs = $sth->fetchall_arrayref({});
     $self->disconnect_db;
 
-    return if !$rs;
+    return if !defined $rs;
     if ($unique) {
         return $rs->[0];
     }
index c3c0c85..7f8cdb5 100644 (file)
@@ -68,11 +68,13 @@ subtest 'then select from firehose' => sub {
     # update item
     my $new_title = "test story new item";
     my $new_dept = "new dept";
-    ok($firehose->update(firehose_id => $item->{firehose_id},
-                         title => $new_title,
-                         dept => $new_dept),
-       "update firehose item");
-    $item = $firehose->select(firehose_id => $item->{firehose_id});
+    $rs = $firehose->update(firehose_id => $item->[0]->{firehose_id},
+                            title => $new_title,
+                            dept => $new_dept);
+    ok($rs, "update firehose item");
+    diag($firehose->last_error) if !$rs;
+
+    $item = $firehose->select(firehose_id => $item->[0]->{firehose_id});
     is($item->{title}, $new_title, "title updated");
     is($item->{dept}, $new_dept, "dept updated");
 
index 462e130..89d89ad 100644 (file)
@@ -67,9 +67,17 @@ subtest 'message create and select' => sub {
     plan skip_all => "mode is not 'test'" if ($t->app->mode ne 'test');
 
     # set reply message's notification to web
-    ok($users->update_message_config(uid => $user2->{uid},
-                                     config => [ { code => 7, mode => 1 } ]),
-       "change notification mode");
+    my $rs = $users->messages->set(uid => $user2->{uid},
+                                   code => 7,
+                                   mode => 1);
+    ok(defined $rs, "change notification mode");
+    my $foo = $users->messages->generic_select();
+
+    my $msg = $users->messages->select(uid => $user2->{uid},
+                                       code => 7);
+    ok($msg, "get updateded message");
+    ok($msg->{mode} == 1, "message update succeeded");
+    diag Dumper $msg if $msg->{mode} != 1;
 
     my $title = "this is test";
     my $body = "this is test message.";
@@ -82,13 +90,16 @@ subtest 'message create and select' => sub {
     ok($msg_id, "create message");
 
     # get message
-    my $msg = $web_messages->select(id => $msg_id);
+    $msg = $web_messages->select(id => $msg_id);
     ok($msg, "message created");
-    is($msg->{user}, $user2->{uid}, "check message user");
-    is($msg->{fuser}, 0, "check message fuser");
-    is($msg->{code}, 7, "check message code");
-    is($msg->{subject}, $title, "check message subject");
-    is($msg->{message}, $body, "check message");
+    is(ref($msg), "HASH", "web_messages->select returns hashref");
+    if ($msg && ref($msg) eq "HASH") {
+        is($msg->{user}, $user2->{uid}, "check message user");
+        is($msg->{fuser}, 0, "check message fuser");
+        is($msg->{code}, 7, "check message code");
+        is($msg->{subject}, $title, "check message subject");
+        is($msg->{message}, $body, "check message");
+    }
 
     ok($web_messages->hard_delete(id => $msg_id), "delete message");
 };
index dc04cdd..0e2f86a 100644 (file)
@@ -68,7 +68,7 @@ SKIP: {
     ok($comment01, "select comment 01");
 
     # get user modtest2 users_info
-    $u_before = $users->select(target => "info", uid => $test_users->{modtest2}->{uid});
+    $u_before = $users->info->select(uid => $test_users->{modtest2}->{uid});
     ok($u_before, "get userinfo for modtest2");
 
     # create comment 02
@@ -83,7 +83,7 @@ SKIP: {
     #diag("comment02: $cid02");
 
     # get user modtest2 users_info and check diff
-    $u_after = $users->select(target => "info", uid => $test_users->{modtest2}->{uid});
+    $u_after = $users->info->select(uid => $test_users->{modtest2}->{uid});
     is($u_after->{totalcomments}, $u_before->{totalcomments} + 1, "totalcomments changed");
 
     # get comment 02
@@ -109,14 +109,14 @@ SKIP: {
     ok($reasons, "get reasons");
 
     # moderation comment01
-    $u_before = $users->select(target => "info", uid => $admin->{uid});
+    $u_before = $users->info->select(uid => $admin->{uid});
     $c_before = $comments->select(cid => $comment01->{cid});
     my $rs = $moderations->create($admin, $comment01->{cid}, 8); # id 8 is おもしろおかしい
     ok($rs, "plus moderation");
     diag($moderations->last_error) if !$rs;
 
     # check if totalmods is changed?
-    $u_after = $users->select(target => "info", uid => $admin->{uid});
+    $u_after = $users->info->select(uid => $admin->{uid});
     is($u_after->{totalmods}, $u_before->{totalmods} + 1, "totalmods changed");
 
     # check if points is updated?
@@ -126,13 +126,13 @@ SKIP: {
     # moderation comment02
     #diag("target: $comment02->{uid}");
     $c_before = $comments->select(cid => $comment02->{cid});
-    $u_before = $users->select(target => "info", uid => $comment02->{uid});
+    $u_before = $users->info->select(uid => $comment02->{uid});
     $rs = $moderations->create($admin, $comment02->{cid}, 3); # id 3 is 荒し
     ok($rs, "minus moderation");
     diag($moderations->last_error) if !$rs;
 
     # check if karma is updated?
-    $u_after = $users->select(target => "info", uid => $comment02->{uid});
+    $u_after = $users->info->select(uid => $comment02->{uid});
     isnt($u_after->{karma}, $u_before->{karma}, "karma changed");
     is($u_after->{downmods}, $u_before->{downmods} + 1, "downmods changed");
 
index 8cd2adc..d07491f 100644 (file)
@@ -6,27 +6,26 @@ use Test::More;
 use Test::Mojo;
 use Data::Dumper;
 
-use Newslash::Util::Test qw(delete_user create_admin_user srcid);
+use Newslash::Util::TestMan;
 
 my $t = Test::Mojo->new('Newslash::Web');
 my $users = $t->app->model('users');
 ok($users, "get Users instance");
+
+my $test_man = Newslash::Util::TestMan->new($t);
 my $uid;
 my $admin;
 
-if ($t->app->mode eq 'test') {
-    delete_user($t->app, 'testuser01');
-}
-
 subtest 'create users' => sub {
     plan skip_all => "mode is not 'test'" if ($t->app->mode ne 'test');
 
-    $uid = $users->create("testuser01", 'test01@example.com');
-    ok($uid, "create method returns valid value");
-    diag($users->last_error) if !$uid;
+    my $user = $test_man->create_user("testuser");
+    ok($user, "create test user");
+    $uid = $user->{uid};
+
+    $admin = $test_man->create_user("testadmin");
+    ok($user, "create admin user");
 
-    $admin = create_admin_user($t->app, "userstest_admin");
-    ok($admin, "create admin user");
 };
 
 subtest 'select/update users' => sub {
@@ -39,6 +38,7 @@ subtest 'select/update users' => sub {
                             seclev => 10000,
                             author => 1);
     ok($rs, "update users table");
+
     diag $users->last_error if (!$rs);
 
     $user = $users->select(uid => $uid);
@@ -46,18 +46,10 @@ subtest 'select/update users' => sub {
     ok($user->{seclev} == 10000, "update seclv");
     ok($user->{author} ==1, "update author");
 
-    $user = $users->select(nickname => "testuser01");
+    $user = $users->select(nickname => "testuser");
     ok($user, "select by nickname returns valid value");
     ok($user->{uid} == $uid, "select by nickname method returns valid uid");
 
-    $rs = $users->messages->update(uid => $uid, code => 3, mode => 1);
-    ok(defined $rs, "update message_config");
-    diag $users->last_error if (!defined $rs);
-
-    my $message_settings = $users->messages->select(uid => $uid);
-    ok($message_settings, "select message_config");
-    ok(@$message_settings > 0, "message_confg has value");
-
     my $anon = $users->anonymous_user;
     ok($anon, "anonymous_user method not returns undefined");
     ok($anon->{uid} == 1, "anonmous_user's uid is 1");
@@ -112,7 +104,10 @@ subtest 'acl2' => sub {
     is($log->{comment}, "testing 3", "valid comment of acl2_log");
 
     my $user = $users->select(uid => $uid);
-    my $srcid24 = srcid("192.168.1.1", 24);
+
+    my $srcid24 = $test_man->srcid("192.168.1.1", 24);
+    ok($srcid24, "get srcid24");
+
     $rs = $users->acl2->update(src_id => $srcid24,
                                admin_uid => $admin->{uid},
                                types => [qw(spammer)],
@@ -136,6 +131,42 @@ subtest 'acl2' => sub {
     ok($rs, "delete acl2 by uid");
 };
 
+subtest 'messages' => sub {
+    my $rs = $users->messages->set(uid => $uid, code => 4, mode => 1);
+    ok(defined $rs, "set message settings");
+
+    my $settings = $users->messages->select(uid => $uid);
+    ok($settings, "retrice message settings");
+    my $setting;
+    for my $s (@$settings) {
+        if ($s->{code} == 4) {
+            $setting = $s;
+            last;
+        }
+    }
+    ok($setting, "setting exists");
+    is($setting->{mode}, 1, "setting set correctly");
+
+    $setting = $users->messages->select(uid => $uid, code => 4);
+    ok($setting, "select a message setting");
+    is($setting->{code}, 4, "select a message code correctly");
+    is($setting->{mode}, 1, "select a message mode correctly");
+
+    $rs = $users->messages->set(uid => $uid, code => 4, mode => 2);
+    ok($rs, "update message settings");
+
+    $setting = $users->messages->select(uid => $uid, code => 4);
+    is($setting->{code}, 4, "select a updated message setting correctly");
+    is($setting->{mode}, 2, "setting update correctly");
+
+    $rs = $users->messages->set(uid => $uid, code => 4, mode => -1);
+    ok($rs, "delete message settings");
+    diag($users->messages->last_error) if !$rs;
+
+    $setting = $users->messages->select(uid => $uid, code => 4);
+    is($setting->{mode}, -1, "setting delete correctly");
+};
+
 subtest 'achievements' => sub {
     my $rs = $users->achievements->select(uid => $uid);
     ok($rs, "select achievements");
@@ -150,4 +181,5 @@ subtest 'delete users' => sub {
 
 };
 
+$test_man->cleanup;
 done_testing();