use Newslash::Model::Users::Auth;
use Newslash::Model::Users::Util;
use Newslash::Model::Users::ACL2;
-
use Newslash::Model::Users::Prefs;
use Newslash::Model::Users::Configs;
use Newslash::Model::Users::Achievements;
use Newslash::Model::Users::Passwords;
+use Newslash::Model::Users::Info;
+use Newslash::Model::Users::ACL;
+use Newslash::Model::Users::Comments;
+use Newslash::Model::Users::User;
+use Newslash::Model::Users::Sidebar;
+use Newslash::Model::Users::Messages;
+use Newslash::Model::Users::Index;
+use Newslash::Model::Users::Class;
+use Newslash::Model::Users::Param;
use Newslash::Util::Timezones;
use Email::Valid;
-
use Data::Dumper;
use Mojo::JSON qw(to_json from_json);
use Encode qw(encode_utf8 decode_utf8);
use Mojo::Log;
-use constant SIDEBAR_TABLE_NAME => 'ns_users_sidebar';
-
-use constant { PERMIT_ACCESS => 'access',
- PERMIT_COMMENT => 'comment',
- PERMIT_SUBMISSION => 'submission',
- PERMIT_M1 => 'm1',
- };
-
+# nickname, matchname, and realemail columns doesn't have UNIQUE limitation,
+# but practically they are unique
+sub key_definition {
+ return {
+ table => "users",
+ primary => "uid",
+ unique => [qw(nickname realemail matchname)],
+ datetime => [qw(newpasswd_ts journal_last_entry_date)],
+ other => [qw(fakeemail homepage
+ passwd sig seclev newpasswd
+ author shill_id)],
+ aliases => { user_id => "uid",
+ id => "uid",
+ }
+ };
+}
sub on_start_up {
my $self = shift;
# create tables
return 1 if $self->check_readonly;
- my $table_name = SIDEBAR_TABLE_NAME;
- if (!$self->table_exists($table_name)) {
- my $dbh = $self->connect_db;
-
- my $sql = <<"EOSQL";
-CREATE TABLE IF NOT EXISTS $table_name (
- uid mediumint(8) unsigned NOT NULL UNIQUE,
- items varchar(256) DEFAULT ""
-) DEFAULT CHARSET=utf8mb4
-EOSQL
- my $rs = $dbh->do($sql, undef);
- $self->disconnect_db;
- if ($rs) {
- $self->warn("create table: $table_name");
- }
- else {
- $self->warn("cannot create table: $table_name");
- }
- }
+ # sidebar
+ $self->sidebar->on_start_up;
# create `ns_users_config` table
$self->configs->_check_and_create_table;
$self->hard_delete(1);
$self->create("Anonymous Coward", 'AnonymousCoward@example.com', {uid => 1});
$self->update(uid => 1, seclev => 0);
- $self->update_info(uid => 1,
- realname => "名無しのゴンベエ",
- karma => -25);
+ $self->info->update(uid => 1,
+ realname => "名無しのゴンベエ",
+ karma => -25);
$self->warn("create anonymous_user");
}
# convert AC (uid==1) user's data
- $self->convert_old_prefs(1);
+ $self->prefs->convert_old_prefs(1);
return 1;
}
-# friends related
-sub _friends { return shift->new_instance_of('::Users::Friends'); }
-sub friends { return shift->_friends->friends(@_); }
-sub foes { return shift->_friends->foes(@_); }
-sub fans { return shift->_friends->fans(@_); }
-sub freaks { return shift->_friends->freaks(@_); }
-
-# sub models
+##### sub models
+sub friends { return shift->new_instance_of('::Users::Friends'); }
sub prefs { return shift->new_instance_of('::Users::Prefs'); }
sub configs { return shift->new_instance_of('::Users::Configs'); }
sub achievements { return shift->new_instance_of('::Users::Achievements'); }
sub passwords { return shift->new_instance_of('::Users::Passwords'); }
+sub info { return shift->new_instance_of('::Users::Info'); }
+sub acl { return shift->new_instance_of('::Users::ACL'); }
+sub acl2 { return shift->new_instance_of('::Users::ACL2'); }
+sub comments { return shift->new_instance_of('::Users::Comments'); }
+sub sidebar { return shift->new_instance_of('::Users::Sidebar'); }
+sub messages { return shift->new_instance_of('::Users::Messages'); }
+sub index { return shift->new_instance_of('::Users::Index'); }
+sub class { return shift->new_instance_of('::Users::Class'); }
+sub param { return shift->new_instance_of('::Users::Param'); }
+
+##### utility functions
# auth related
sub authentification {
return $self->select(uid => 1);
}
-sub sidebar_items {
- my ($self, $key, $value) = @_;
- return if ($key ne 'uid');
- my $boxes = $self->new_instance_of("Newslash::Model::Boxes");
- my $user_sidebar = $self->select(target => "sidebar", uid => $value);
- if (!$user_sidebar) {
- $user_sidebar = $self->select(target => "sidebar", uid => $self->anonymous_user->{uid});
- }
- # fallback
- my $items = $user_sidebar ? $user_sidebar->{items} : [1, 2];
-
- my $user_boxes = [];
- for my $box_id (@$items) {
- my $box = $boxes->select(id => $box_id);
- if (!$box) {
- $box = {template => "error: invalid sidebar item; ID is $box_id"};
- }
- push @$user_boxes, $box;
- }
- return $user_boxes;
-}
+#========================================================================
-sub _create_user_object {
- my ($self, $user) = @_;
+=head2 nickname_to_matchname
- my $_fn = sub {
- my $user = shift;
- my $result = {};
- for my $k (qw{uid nickname fakeemail homepage sig seclev matchname author}) {
- $result->{$k} = $user->{$k};
- }
- # if seclev is greater than 10000, the user is admin
- # if seclev is 0, the user is Anonymous user
- $result->{is_admin} = $result->{seclev} >= 10000 ? 1 : 0;
- $result->{is_login} = $result->{seclev} != 0 ? 1 : 0;
- #$result->{config} = $self->select(target => 'config', uid => $user->{uid});
- $result->{config} = $self->configs->select(id => $user->{uid});
- $result->{configJSON} = to_json($result->{config});
+Convert nickname to matchname.
- return $result;
- };
+nickname consists of almost all alphabet, number, symbol.
- if (ref($user) eq 'ARRAY') {
- my @ret = map { $_fn->($_) } @$user;
- return \@ret;
- }
- else {
- return $_fn->($user);
- }
-}
+matchname consists of lower alphabet and number.
-sub select {
- my $self = shift @_;
- my %params = @_;
-
- my $type = $params{target} || 'user';
+=cut
- # select from `users` table
- if ($type eq 'user') {
- my $user;
- if (exists $params{nickname}) {
- my $u = $self->_select("users", nickname => $params{nickname});
- $user = $u->[0] if $u;
- }
- elsif (exists $params{uid}) {
- my $u = $self->_select("users", uid => $params{uid});
- $user = $u->[0] if $u;
- }
- elsif (exists $params{matchname}) {
- my $u = $self->_select("users", matchname => $params{matchname});
- $user = $u->[0] if $u;
- }
- elsif (exists $params{email}) {
- my $u = $self->_select("users", realemail => $params{email});
- $user = $u->[0] if $u;
- }
- elsif (exists $params{author}) {
- $user = $self->_select("users", author => $params{author});
- }
- else {
- return $self->_select_user(\%params);
- }
- if ($user) {
- return $self->_create_user_object($user);
- }
- return;
- }
+sub nickname_to_matchname {
+ my $self = shift;
+ my $nick = shift;
+ $nick = lc $nick;
+ $nick =~ s/[^a-zA-Z0-9]//g;
+ return $nick;
+}
- # select from other table
- my $ret;
- if ($type eq 'acl') {
- if (exists $params{uid}) {
- $ret = $self->_select("users_acl", uid => $params{uid});
- }
- }
- elsif ($type eq 'acl2') {
- if (exists $params{uid}) {
- return $self->_acl2->_select_acl2(uid => $params{uid});
- }
- elsif (exists $params{srcid}) {
- return $self->_acl2->_select_acl2(srcid => $params{srcid});
- }
- }
- elsif ($type eq 'acl2_log') {
- if (exists $params{uid}) {
- return $self->_acl2->_select_acl2_log(uid => $params{uid});
- }
- elsif (exists $params{srcid}) {
- return $self->_acl2->_select_acl2_log(srcid => $params{srcid});
- }
- }
- elsif ($type eq 'prefs') {
- warn "'type=>prefs' is deprecated!";
- if (exists $params{uid}) {
- $ret = $self->_select("users_prefs", uid => $params{uid});
- }
- }
- elsif ($type eq 'info') {
- if (exists $params{uid}) {
- $ret = $self->_select("users_info", uid => $params{uid});
- }
- }
- elsif ($type eq 'comments') {
- if (exists $params{uid}) {
- $ret = $self->_select("users_comments", uid => $params{uid});
- }
- }
- elsif ($type eq 'param') {
- if (exists $params{uid}) {
- $ret = $self->_select("users_param", uid => $params{uid});
- my $params = {};
- for my $item (@$ret) {
- $params->{$item->{name}} = $item->{value};
- }
- return $params;
- }
- }
- elsif ($type eq 'sidebar') {
- if (exists $params{uid}) {
- $ret = $self->_select(SIDEBAR_TABLE_NAME, uid => $params{uid});
- return if !$ret;
- return if !@$ret;
- my @items = split /\s+/, $ret->[0]->{items};
- return {uid => $ret->[0]->{uid}, items => \@items};
- }
- }
- elsif ($type eq 'config') {
- warn "users->select(type => 'config') is deprecated!";
- if (exists $params{uid}) {
- $ret = $self->_select("ns_users_config", uid => $params{uid});
- return if !$ret;
- if (!@$ret) {
- #return $self->_prefs_to_config($params{uid});
- return $self->prefs->to_config($params{uid});
- #return;
- }
- my $configs = $ret->[0]->{configs};
- return from_json($configs) || {};
- }
- }
- elsif ($type eq 'message_config') {
- if (exists $params{uid}) {
- $ret = $self->select_message_config(uid => $params{uid});
- return $ret;
- }
- }
+=head2 clear_rookie($uid, uid => $uid, time => $time)
- return if !$ret;
- return $ret->[0];
-}
+clear Rookie flag.
-sub _get_prefs_of {
- my ($self, $user) = @_;
- return if !$user;
- return if !$user->{uid};
+=over 4
- #my $prefs = $self->select(target => "prefs", uid => $user->{uid});
- my $prefs = $self->prefs->select(id => $user->{uid});
- return if !$prefs;
+=item Return value
- if ($prefs->{tzcode}) {
- $prefs->{offset_sec} = Newslash::Util::Timezones::get_timezone_offset($prefs->{tzcode});
- }
+1/0
- return $prefs;
+=back
-}
+=cut
-sub get_permissions_of {
- my ($self, $user) = @_;
- return if !$user;
- return if !$user->{uid};
-
- my $permissions = {
- PERMIT_ACCESS() => 1,
- PERMIT_COMMENT() => 1,
- PERMIT_SUBMISSION() => 1,
- PERMIT_M1() => 1,
- };
-
- if ($user->{is_login}) {
- my $acl2 = $self->_acl2->_select_acl2(uid => $user->{uid});
- my $acl_of = {};
- if ($acl2 && $acl2->{values}) {
- for my $item (@{$acl2->{values}}) {
- $acl_of->{$item->{name}} = $item;
- }
- }
+sub clear_rookie {
+ my $self = shift;
+ return if $self->check_readonly;
+ my $params = {@_};
+ my $uid = $params->{uid};
+ return if !$uid;
- $permissions->{access} = 0 if $acl_of->{ban};
- $permissions->{comment} = 0 if $acl_of->{nopost};
- $permissions->{submission} = 0 if $acl_of->{nosubmit};
- $permissions->{m1} = 0 if $acl_of->{nom1};
- if ($acl_of->{spammer}) {
- $permissions->{comment} = 0;
- $permissions->{submission} = 0;
- $permissions->{m1} = 0;
- }
+ my $time = $params->{time};
+ if ($time) {
+ return $self->class->update(uid => $uid,
+ rookie => 0,
+ rookie_cleared => $time);
}
else {
- # check by src_id
- for my $srcid (values %{$user->{srcid}->{24}}) {
- next if !$srcid;
- my $acl2 = $self->_acl2->_select_acl2(srcid => $srcid);
- my $acl_of = {};
- if ($acl2 && $acl2->{values}) {
- for my $item (@{$acl2->{values}}) {
- $acl_of->{$item->{name}} = $item;
- }
- }
- $permissions->{access} = 0 if $acl_of->{ban};
- $permissions->{comment} = 0 if $acl_of->{nopost};
- $permissions->{submission} = 0 if $acl_of->{nosubmit};
- $permissions->{m1} = 0 if $acl_of->{nom1};
- if ($acl_of->{spammer}) {
- $permissions->{comment} = 0;
- $permissions->{submission} = 0;
- $permissions->{m1} = 0;
- }
- }
+ return $self->class->update(uid => $uid,
+ rookie => 0,
+ rookie_cleared => { FUNCTION => "NOW()" });
}
- return $permissions;
+ return;
}
-sub select_message_config {
+sub update_karma {
my $self = shift;
my $params = {@_};
+
my $uid = $params->{uid};
return if !$uid;
- my $messages = $self->new_instance_of('Messages');
- my $message_types = $messages->select_message_type;
+ my $add = $params->{add};
+ my $karma => $params->{karma};
+ return if (!defined $karma && !defined $add);
- my $settings = $self->_select('users_messages', 'uid', $uid);
- return if !$settings;
-
- my $mode_of = {};
- for my $item (@$settings) {
- $mode_of->{$item->{code}} = $item->{mode};
+ my $rs = 0;
+ if (defined $karma) {
+ $rs = $self->info->update(uid => $uid, karma => $karma);
+ return if !defined $rs;
}
- 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'
- }
- $i->{selectable_mode} = $type->{selectable_mode};
-
- push @$result, $i;
+ if (defined $add) {
+ my $rs1 = $self->info->update(uid => $uid,
+ karma => {add => $add});
+ return if !defined $rs1;
+ $rs += $rs1;
}
- return $result;
-}
-
-sub convert_old_prefs {
- my ($self, $uid) = @_;
- my $new_cfg = $self->prefs->to_config($uid);
- # apply configs
- my $cfg = {};
- my $cfg = $self->configs->select(id => $uid);
+ return $rs;
+}
- return if !$cfg;
+##### select/create/update/delete
+sub select {
+ my $self = shift;
+ my $params = {@_};
+ my $rs = $self->generic_select(params => $params);
+ return if (!defined $rs);
+ return $self->_create_user_object($rs);
+}
- my $updated = 0;
- for my $k (keys %$new_cfg) {
- if (!defined $cfg->{$k}) {
- $cfg->{$k} = $new_cfg->{$k};
- $updated = 1;
- }
- }
+sub _create_user_object {
+ my ($self, $user) = @_;
- # sidebar settings
- my $sidebar_items = $self->_select("ns_users_sidebar", uid => $uid);
- if (@$sidebar_items == 0) {
- # no sidebar items configured, try to convert
- my $ret = $self->_select("users_index", uid => $uid);
- if ($ret && @$ret && $ret->[0]->{slashboxes}) {
- my @slashboxes = split(/,/, $ret->[0]{slashboxes});
- my @boxes;
- my $boxes = $self->new_instance_of("Boxes");
- for my $box_name (@slashboxes) {
- my $box = $boxes->select(name => $box_name);
- if (!$box) {
- $self->warn("no box item: $box_name");
- next;
- }
- push @boxes, $box->{id};
- }
- my $rs = $self->update_sidebar(uid => $uid, config => \@boxes);
- if (!$rs) {
- $self->warn("convert slashboxes failed: " . $self->last_error);
- }
+ my $_fn = sub {
+ my $user = shift;
+ my $result = {};
+ for my $k (qw{uid nickname fakeemail homepage sig seclev matchname author}) {
+ $result->{$k} = $user->{$k};
}
- }
+ # if seclev is greater than 10000, the user is admin
+ # if seclev is 0, the user is Anonymous user
+ $result->{is_admin} = $result->{seclev} >= 10000 ? 1 : 0;
+ $result->{is_login} = $result->{seclev} != 0 ? 1 : 0;
+ $result->{config} = $self->configs->select(id => $user->{uid});
+ $result->{configJSON} = to_json($result->{config});
- # add some default values
- if ($new_cfg->{timezone}) {
- my $offset_sec = Newslash::Util::Timezones::get_timezone_offset($new_cfg->{timezone});
- if (!defined $cfg->{offset_sec} || $cfg->{offset_sec} != $offset_sec) {
- $cfg->{offset_sec} = $offset_sec;
- $updated = 1;
- }
- }
+ return Newslash::Model::Users::User->new($self, $result);
+ };
- if (!defined $cfg->{time_format} || length($cfg->{time_format}) ) {
- $cfg->{time_format} = '%Y年%m月%d日 %H時%M分';
- $updated = 1;
+ if (ref($user) eq 'ARRAY') {
+ my @ret = map { $_fn->($_) } @$user;
+ return \@ret;
}
-
- if ($updated) {
- #my $rs = $self->update_config(target => 'config', uid => $uid, config => $cfg);
- my $rs = $self->configs->update(id => $uid, config => $cfg);
-
- if (!$rs) {
- warn "update config failed. uid: $uid";
- }
- return $cfg;
+ else {
+ return $_fn->($user);
}
- return;
}
-sub _select {
- my ($self, $table, $key, $value) = @_;
- my $sql = "SELECT * FROM $table WHERE $key = ?";
- my $dbh = $self->connect_db;
- my $sth = $dbh->prepare($sql);
- $sth->execute($value);
- my $rs = $sth->fetchall_arrayref(+{});
- $self->disconnect_db();
-
- return $rs;
-}
-
-sub _select_user {
- my ($self, $params) = @_;
-
- my $unique_keys = { id => "users.uid",
- uid => "users.uid",
- nickname => "users.nickname",
- matchname => "users.matchname",
- };
- my $keys = { realemail => "users.realemail",
- fakeemail => "users.fakeemail",
- seclev => "users.seclev",
- security_level => "users.seclev",
- author => "users.author",
- };
- my $datetime_keys = { journal_last_entry_date => "users.journal_last_entry_date",
- newpasswd_ts => "users.newpasswd_ts",
- };
-
- my ($where_clause, $where_values, $unique) = $self->build_where_clause(unique_keys => $unique_keys,
- keys => $keys,
- datetime_keys => $datetime_keys,
- params => $params);
- my ($limit_clause, $limit_values) = $self->build_limit_clause(params => $params);
- my ($orderby_clause, $orderby_values) = $self->build_order_by_clause(unique_keys => $unique_keys,
- keys => $keys,
- params => $params);
-
- # TODO: give reasonable LIMIT Value...
- $limit_clause = "LIMIT 50" if !$limit_clause;
-
- my @attrs;
- push @attrs, @$where_values, @$limit_values, @$orderby_values;
-
- my $dbh = $self->connect_db;
- my $sql = <<"EOSQL";
-SELECT * from users
- $where_clause
- $orderby_clause
- $limit_clause
-EOSQL
-
- my $sth = $dbh->prepare($sql);
- $sth->execute(@attrs);
- my $users = $sth->fetchall_arrayref({});
+sub update {
+ my $self = shift;
+ my $params = {@_};
- if (!$users) {
- $self->disconnect_db;
- return;
- }
- if (@$users == 0) {
- $self->disconnect_db;
- return $unique ? undef : [];
+ # check password
+ if ($params->{passwd}) {
+ $params->{passwd} = $self->passwords->encrypt_password($params->{passwd});
}
- return $users->[0] if $unique;
- return $users;
-
+ return $self->generic_update(params => $params);
}
-sub _acl2 { return shift->new_instance_of("::Users::ACL2"); }
-sub acl2_types { return shift->_acl2->acl2_types; }
-
-use constant ERROR_BASE => 1000;
-use constant {
- ERROR_INVALID_ADDRESS => ERROR_BASE + 10,
- ERROR_NICKNAME_NOT_GIVEN => ERROR_BASE + 20,
- ERROR_USER_EXISTS => ERROR_BASE + 30,
- ERROR_INSERT_USER_FAILED => ERROR_BASE + 40,
- ERROR_MAIL_REGISTERED => ERROR_BASE + 50,
- ERROR_DO_SQL => ERROR_BASE + 50,
-};
-
sub hard_delete {
my ($self, $uid) = @_;
return if $self->check_readonly;
=cut
+use constant ERROR_BASE => 1000;
+use constant {
+ ERROR_INVALID_ADDRESS => ERROR_BASE + 10,
+ ERROR_NICKNAME_NOT_GIVEN => ERROR_BASE + 20,
+ ERROR_USER_EXISTS => ERROR_BASE + 30,
+ ERROR_INSERT_USER_FAILED => ERROR_BASE + 40,
+ ERROR_MAIL_ALREADY_REGISTERED => ERROR_BASE + 50,
+ ERROR_DO_SQL => ERROR_BASE + 50,
+};
+
sub create {
my ($self, $nickname, $email, $passwd, $opts) = @_;
return if $self->check_readonly;
return;
}
- my $matchname = Newslash::Model::Users::Util::nickname_to_matchname($nickname);
+ my $matchname = $self->nickname_to_matchname($nickname);
# check: email is valid?
if (!Email::Valid->address($email)) {
# check: mail already registered?
$user = $self->select(email => $email);
if ($user) {
- $self->set_error("Mail registered", ERROR_MAIL_REGISTERED);
+ $self->set_error("Mail already registered", ERROR_MAIL_ALREADY_REGISTERED);
return;
}
- # start transaction
- my $dbh = $self->connect_db({AutoCommit => 0,});
+ my $dbh = $self->start_transaction;
my $sql;
my $sth;
my $uid = $dbh->last_insert_id(undef, undef, undef, undef);
if (!$uid) {
- $dbh->rollback;
- $self->disconnect_db;
+ $self->rollback;
$self->set_error('insert user failed', ERROR_INSERT_USER_FAILED);
return;
}
EOSQL
$result = $dbh->do($sql, undef, $uid, '');
if (!$result) {
+ $self->rollback;
$self->set_error($dbh->errstr, $dbh->err);
- $dbh->rollback;
- $self->disconnect_db;
return;
}
$sql = "INSERT INTO $table (uid) VALUES (?)";
$result = $dbh->do($sql, undef, $uid);
if (!$result) {
+ $self->rollback;
$self->set_error($dbh->errstr, $dbh->err);
- $dbh->rollback;
- $self->disconnect_db;
return;
}
}
EOSQL
$result = $dbh->do($sql, undef, $uid, '', '', '');
if (!$result) {
+ $self->rollback;
$self->set_error($dbh->errstr, $dbh->err);
- $dbh->rollback;
- $self->disconnect_db;
return;
}
# finish
- $dbh->commit;
- $self->disconnect_db;
-
- return $uid;
-}
-
-=head2 clearRookie($uid, $time)
-
-clear Rookie flag.
-
-=over 4
-
-=item Return value
-
-1/0
-
-=back
-
-=cut
-
-sub clearRookie {
- my ($self, $uid, $time) = @_;
- return if $self->check_readonly;
- return if !$uid;
- return if $self->is_anonymous_uid($uid);
-
- my $dbh = $self->connect_db;
- my $rs;
-
- if ($time) {
- my $sql = <<"EOSQL";
-UPDATE users_class SET rookie = 0, rookie_cleared = NOW() WHERE uid = ?
-EOSQL
- $rs = $dbh->do($sql, undef, $uid);
- }
- else {
- my $sql = <<"EOSQL";
-UPDATE users_class SET rookie = 0, rookie_cleared = ? WHERE uid = ?
-EOSQL
- $rs = $dbh->do($sql, undef, $time, $uid);
- }
- $self->disconnect_db;
- return $rs;
-}
-
-sub clear_rookie {
- my $self = shift;
- return if $self->check_readonly;
- my $params = {@_};
- my $uid = $params->{uid};
- if ($uid) {
- return $self->update_class(uid => $uid,
- rookie => 0,
- rookie_cleared => 'now');
- }
- return;
-}
-
-
-#========================================================================
-
-=head2 add_to_param($table, $column, $value, \%opts, @params)
-
-add value to given column in users_* tables
-
-=item Parameters
-
-=over 4
-
-=item $table
-
-target table
-
-=item $column
-
-target column
-
-=item $value
-
-value to add
-
-=item \%opts
-
-options.
-
- * $opts->{max}
- * $opts->{min}
-
-=item $params
-
-query parameters
-
-=back
-
-=over 4
-
-=item Return value
-
-succeed: 1, else: 0
-
-=back
-
-=cut
-
-sub add_to_param {
- my $self = shift;
- return if $self->check_readonly;
- my $table = shift;
- my $column = shift;
- my $value = shift;
- my $opts = shift || {};
- my @params = @_;
-
- if (!$table || !$column || !$value || !@params) {
- return;
- }
-
- my ($where_clause, $values, $unique) = $self->build_where_clause(unique_keyss => [qw(uid)],
- params => \@params);
- return if @$values != 1;
-
- my $new_value = "$column + ?";
- if (defined $opts->{max} && $opts->{max} =~ m/\A[-+]?\d+\z/) {
- $new_value = "LEAST($new_value, $opts->{max})"
- }
- if (defined $opts->{min} && $opts->{max} =~ m/\A[-+]?\d+\z/) {
- $new_value = "GREATEST($new_value, $opts->{min})"
- }
-
- my $sql = <<"EOSQL";
-UPDATE $table SET $column = $new_value $where_clause;
-EOSQL
- my $dbh = $self->connect_db();
- my $rs = $dbh->do($sql, undef, $value, @$values);
- if (!defined $rs) {
- $self->set_error($dbh->errstr, $dbh->err);
- $self->disconnect_db;
- return;
- }
- $self->disconnect_db;
- return $rs;
-}
-
-#========================================================================
-
-=head2 update
-
-update user infomation.
-
-=over 4
-
-=item Return value
-
-HASH
-
-=back
-
-=cut
-
-sub update {
- my $self = shift;
- return if $self->check_readonly;
- my $params = {@_};
-
- my $uid = $params->{uid};
- if (!$uid) {
- $self->set_error("invalid uid");
- return;
- }
-
- if ($params->{passwd}) {
- $params->{passwd} = $self->passwords->encrypt_password($params->{passwd});
- }
-
- my $columns = [qw(realemail fakeemail passwd
- sig seclev journal_last_entry_date author)];
-
- return $self->generic_update(table => "users",
- updatable_keys => $columns,
- condition_keys => [qw(uid)],
- params => $params);
-}
-
-sub update_acl2_by_srcid {
- return shift->_acl2->_update_acl2("srcid", @_);
-}
-
-sub update_acl2 {
- return shift->_acl2->_update_acl2("uid", @_);
-}
-
-sub update_message_config {
- my $self = shift;
- return if $self->check_readonly;
- my $params = {@_};
- my $uid = $params->{uid};
- return if !$uid;
- my $configs = $params->{config} || {};
-
-
- my $sql_insert = <<"EOSQL";
-INSERT INTO users_messages (uid, code, mode) VALUES (?, ?, ?)
- ON DUPLICATE KEY UPDATE mode = ?
-EOSQL
-
- my $dbh = $self->start_transaction;
- my $sth = $dbh->prepare($sql_insert);
-
- for my $item (@$configs) {
- my $rs = $sth->execute($uid, $item->{code}, $item->{mode}, $item->{mode});
- if (!defined $rs) {
- $self->set_error($dbh->errstr, $dbh->err);
- $self->rollback;
- return;
- }
- }
-
- my $sql_cleanup = <<"EOSQL";
-DELETE FROM users_messages WHERE uid = ? AND mode = -1
-EOSQL
- my $rs = $dbh->do($sql_cleanup, undef, $uid);
- if (!defined $rs) {
- $self->set_error($dbh->errstr, $dbh->err);
- $self->rollback;
- return;
- }
-
$self->commit;
- return 1;
-}
-
-
-sub update_sidebar {
- my $self = shift;
- return if $self->check_readonly;
- my $params = {@_};
- my $uid = $params->{uid};
- return if !$uid;
- my $value = $params->{config} || {};
-
- # check params
- return if ref($value) ne "ARRAY";
- for my $k (@$value) {
- return if ($k !~ /^\d+$/);
- }
- my $val = join(" ", @$value);
-
- my $table_name = SIDEBAR_TABLE_NAME;
- my $sql = <<"EOSQL";
-INSERT $table_name (uid, items) VALUES (?, ?)
- ON DUPLICATE KEY UPDATE items = ?
-EOSQL
-
- my $dbh = $self->connect_db;
- my $rs = $dbh->do($sql, undef, $uid, $val, $val);
- if (!defined $rs) {
- $self->disconnect_db;
- return;
- }
-
- $self->disconnect_db;
- return $value;
-}
-
-sub update_class {
- my $self = shift;
- return if $self->check_readonly;
- my $params = {@_};
- my $uid = $params->{uid};
- return if !$uid;
-
- my @columns_ts = qw(rookie_cleared validated_submitter validated_commenter
- validated_moderator story_passive story_casual story_rater
- story_creator story_hardcore comment_passive comment_casual
- comment_rater comment_creator comment_hardcore);
- my @columns = qw(rookie);
-
- my @params;
- my @set_clauses;
- for my $k (@columns) {
- if (defined $params->{$k}) {
- push @set_clauses, "$k = ?";
- push @params, $params->{$k};
- }
- }
- for my $k (@columns_ts) {
- if (defined $params->{$k}) {
- if (uc($params->{$k}) eq 'NOW') {
- push @set_clauses, "$k = NOW()";
- }
- else {
- push @set_clauses, "$k = ?";
- push @params, $params->{$k};
- }
- }
- }
-
- my $clauses = join(", ", @set_clauses);
- push @params, $uid;
- my $sql = <<"EOSQL";
-UPDATE users_class SET $clauses WHERE uid = $uid
-EOSQL
-
- my $dbh = $self->connect_db;
- my $rs = $dbh->do($sql, undef, @params);
- $self->disconnect_db;
- return $rs;
-}
-
-sub _update_users_class_now {
- my ($self, $uid, $column) = @_;
- return if $self->check_readonly;
- my $sql = "UPDATE users_class SET ? = NOW() WHERE uid = ?";
- my $dbh = $self->connect_db();
- my $rs = $dbh->do($sql, undef, $column, $uid);
- if (!$rs) {
- return;
- }
- $self->disconnect_db;
- return 1;
-}
-
-sub _update_users_class {
- my ($self, $uid, $column, $value) = @_;
- return if $self->check_readonly;
- my $sql = "UPDATE users_class SET ? = ? WHERE uid = ?";
- my $dbh = $self->connect_db();
- my $rs = $dbh->do($sql, undef, $column, $value, $uid);
- if (!$rs) {
- return;
- }
- $self->disconnect_db;
- return 1;
-}
-
-sub _update_users_info_add {
- my ($self, $uid, $field, $value) = @_;
- return if $self->check_readonly;
-
- my $sql = "UPDATE users_info SET $field = $field + ? WHERE uid = ?";
- my $dbh = $self->connect_db();
- my $rs = $dbh->do($sql, undef, $value, $uid);
- if (!$rs) {
- return;
- }
- $self->disconnect_db;
- return 1;
+ return $uid;
}
-#========================================================================
-
-=head2 update_info
-
-update users_info table.
-
-=over 4
-
-=item Return value
-
-HASH
-
-=back
-
-=cut
-
-sub update_info {
- my $self = shift;
- return if $self->check_readonly;
- my $params = {@_};
-
- my $addables = [qw(totalmods
- tokens
- karma
- totalcomments
- m2fair
- up_fair
- down_fair
- m2unfair
- up_unfair
- down_unfair
- m2fairvotes
- m2voted_up_fair
- m2voted_down_fair
- m2unfairvotes
- m2voted_up_unfair
- m2voted_down_unfair
- m2voted_lonedissent
- m2voted_majority
- upmods
- downmods
- stirred
- )];
-
- my $others = [qw(realname
- bio
- lastgranted
- m2info
- maillist
- lastm2
- m2_mods_saved
- lastaccess
- session_login
- cookie_location
- registered
- reg_id
- expiry_days
- expiry_comm
- user_expiry_days
- user_expiry_comm
- initdomain
- created_ipid
- created_at
- tag_clout
- people
- people_status
- csq_bonuses)];
-
- return $self->generic_update(table => "users_info",
- addable_keys => $addables,
- updatable_keys => $others,
- condition_keys => [qw(uid)],
- params => $params);
-}
1;