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;
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);
}
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 => {@_});
}
package Newslash::Model::Firehose;
use Newslash::Model::Base -base;
use Data::Dumper;
+use List::Util qw(any);
sub key_definition {
return {
}
}
- # 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);
$limit_clause
EOSQL
+ #warn $sql;
+ #warn Dumper @attrs;
+
my $sth = $dbh->prepare($sql);
$sth->execute(@attrs);
my $items = $sth->fetchall_arrayref({});
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;
+
}
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 => {@_});
}
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) {
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;
sub key_definition {
return {
- table => "users_info",
+ table => "users_class",
primary => "uid",
other => [qw(rookie)],
datetime => [qw(rookie_cleared validated_submitter
table => "users_messages",
primary => "id",
other => [qw(uid code mode)],
- aliases => { user_id => "uid",
- }
+ aliases => { user_id => "uid" },
};
}
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;
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;
my $rs = $sth->fetchall_arrayref({});
$self->disconnect_db;
- return if !$rs;
+ return if !defined $rs;
if ($unique) {
return $rs->[0];
}
# 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");
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.";
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");
};
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
#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
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?
# 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");
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 {
seclev => 10000,
author => 1);
ok($rs, "update users table");
+
diag $users->last_error if (!$rs);
$user = $users->select(uid => $uid);
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");
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)],
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");
};
+$test_man->cleanup;
done_testing();