From: hylom Date: Thu, 6 Sep 2018 13:22:59 +0000 (+0900) Subject: Model: fix problem caused by Cowrapper restrucure X-Git-Tag: v0.1.5~41 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=18c307c3384acee1bca6edb5fe72ce06492e3bc0;p=newslash%2Fnewslash.git Model: fix problem caused by Cowrapper restrucure --- diff --git a/src/newslash_web/lib/Newslash/Model/Events.pm b/src/newslash_web/lib/Newslash/Model/Events.pm index a6035bf2..5d400dac 100644 --- a/src/newslash_web/lib/Newslash/Model/Events.pm +++ b/src/newslash_web/lib/Newslash/Model/Events.pm @@ -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 => {@_}); } diff --git a/src/newslash_web/lib/Newslash/Model/Firehose.pm b/src/newslash_web/lib/Newslash/Model/Firehose.pm index 3184fa29..4153012d 100644 --- a/src/newslash_web/lib/Newslash/Model/Firehose.pm +++ b/src/newslash_web/lib/Newslash/Model/Firehose.pm @@ -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; + } diff --git a/src/newslash_web/lib/Newslash/Model/Messages.pm b/src/newslash_web/lib/Newslash/Model/Messages.pm index 38d31c9e..ebbae516 100644 --- a/src/newslash_web/lib/Newslash/Model/Messages.pm +++ b/src/newslash_web/lib/Newslash/Model/Messages.pm @@ -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) { diff --git a/src/newslash_web/lib/Newslash/Model/Topics.pm b/src/newslash_web/lib/Newslash/Model/Topics.pm index 5c3f3d92..acd54a70 100644 --- a/src/newslash_web/lib/Newslash/Model/Topics.pm +++ b/src/newslash_web/lib/Newslash/Model/Topics.pm @@ -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; diff --git a/src/newslash_web/lib/Newslash/Model/Users/Class.pm b/src/newslash_web/lib/Newslash/Model/Users/Class.pm index a32ce945..d1319561 100644 --- a/src/newslash_web/lib/Newslash/Model/Users/Class.pm +++ b/src/newslash_web/lib/Newslash/Model/Users/Class.pm @@ -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 diff --git a/src/newslash_web/lib/Newslash/Model/Users/Messages.pm b/src/newslash_web/lib/Newslash/Model/Users/Messages.pm index 360ea7fa..1d8805d7 100644 --- a/src/newslash_web/lib/Newslash/Model/Users/Messages.pm +++ b/src/newslash_web/lib/Newslash/Model/Users/Messages.pm @@ -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; diff --git a/src/newslash_web/lib/Newslash/Model/WebMessages.pm b/src/newslash_web/lib/Newslash/Model/WebMessages.pm index d542fba3..0b22dfc7 100644 --- a/src/newslash_web/lib/Newslash/Model/WebMessages.pm +++ b/src/newslash_web/lib/Newslash/Model/WebMessages.pm @@ -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]; } diff --git a/src/newslash_web/t/models/firehose.t b/src/newslash_web/t/models/firehose.t index c3c0c856..7f8cdb5a 100644 --- a/src/newslash_web/t/models/firehose.t +++ b/src/newslash_web/t/models/firehose.t @@ -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"); diff --git a/src/newslash_web/t/models/messages.t b/src/newslash_web/t/models/messages.t index 462e1302..89d89ad0 100644 --- a/src/newslash_web/t/models/messages.t +++ b/src/newslash_web/t/models/messages.t @@ -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"); }; diff --git a/src/newslash_web/t/models/moderations.t b/src/newslash_web/t/models/moderations.t index dc04cdd4..0e2f86a6 100644 --- a/src/newslash_web/t/models/moderations.t +++ b/src/newslash_web/t/models/moderations.t @@ -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"); diff --git a/src/newslash_web/t/models/users.t b/src/newslash_web/t/models/users.t index 8cd2adc4..d07491f5 100644 --- a/src/newslash_web/t/models/users.t +++ b/src/newslash_web/t/models/users.t @@ -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();