OSDN Git Service

Model: restructure Model::Users
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Model / Users / Messages.pm
1 package Newslash::Model::Users::Messages;
2 use Newslash::Model::Base -base;
3
4 sub key_definition {
5     return {
6             table => "users_messages",
7             primary => "id",
8             other => [qw(uid code mode)],
9             aliases => { user_id => "uid",
10                        }
11            };
12 }
13
14 sub select {
15     my $self = shift;
16     my $params = {@_};
17     my $uid = $params->{uid};
18     return if !$uid;
19
20     my $messages = $self->new_instance_of('Messages');
21     my $message_types = $messages->select_message_type;
22
23     my $settings =  $self->generic_select(params => { uid => $uid });
24     return if !$settings;
25
26     my $mode_of = {};
27     for my $item (@$settings) {
28         $mode_of->{$item->{code}} = $item->{mode};
29     }
30
31     my $result = [];
32     for my $type (@$message_types) {
33         next if $type->{selectable_mode} == 0;
34         my $i = {
35                  description => $type->{description},
36                  code => $type->{message_type_id},
37                 };
38         if (defined $mode_of->{$type->{message_type_id}}) {
39             $i->{mode} = $mode_of->{$type->{message_type_id}};
40         }
41         else {
42             $i->{mode} = -1; # 'no message'
43         }
44         $i->{selectable_mode} = $type->{selectable_mode};
45
46         push @$result, $i;
47     }
48     return $result;
49 }
50
51 sub update {
52     my $self = shift;
53     return if $self->check_readonly;
54     my $params = {@_};
55     my $uid = $params->{uid};
56     return if !$uid;
57     my $configs = $params->{config} || {};
58
59     my $sql_insert = <<"EOSQL";
60 INSERT INTO users_messages (uid, code, mode) VALUES (?, ?, ?)
61   ON DUPLICATE KEY UPDATE mode = ?
62 EOSQL
63
64     my $dbh = $self->start_transaction;
65     my $sth = $dbh->prepare($sql_insert);
66
67     for my $item (@$configs) {
68         my $rs = $sth->execute($uid, $item->{code}, $item->{mode}, $item->{mode});
69         if (!defined $rs) {
70             $self->set_error($dbh->errstr, $dbh->err);
71             $self->rollback;
72             return;
73         }
74     }
75
76     my $sql_cleanup = <<"EOSQL";
77 DELETE FROM users_messages WHERE uid = ? AND mode = -1
78 EOSQL
79     my $rs = $dbh->do($sql_cleanup, undef, $uid);
80     if (!defined $rs) {
81         $self->set_error($dbh->errstr, $dbh->err);
82         $self->rollback;
83         return;
84     }
85
86     $self->commit;
87     return 1;
88 }
89
90 1;