OSDN Git Service

Model: restructure Model::Users
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Model / Users.pm
index d143c1e..31178ba 100644 (file)
@@ -5,30 +5,45 @@ use Newslash::Model::Users::Friends;
 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;
@@ -36,25 +51,8 @@ sub on_start_up {
     # 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;
@@ -65,29 +63,34 @@ EOSQL
         $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 {
@@ -104,439 +107,137 @@ sub anonymous_user {
     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;
@@ -575,6 +276,16 @@ HASH
 
 =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;
@@ -586,7 +297,7 @@ sub create {
         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)) {
@@ -604,12 +315,11 @@ sub create {
     # 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;
 
@@ -626,8 +336,7 @@ EOSQL
     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;
     }
@@ -640,9 +349,8 @@ INSERT INTO users_info (uid, lastaccess, created_at, bio)
 EOSQL
     $result = $dbh->do($sql, undef, $uid, '');
     if (!$result) {
+        $self->rollback;
         $self->set_error($dbh->errstr, $dbh->err);
-        $dbh->rollback;
-        $self->disconnect_db;
         return;
     }
 
@@ -650,9 +358,8 @@ EOSQL
         $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;
         }
     }
@@ -663,435 +370,15 @@ INSERT INTO users_index (uid, story_never_topic, slashboxes, story_always_topic)
 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;