OSDN Git Service

Model::Users::Messages: set() now accept message name
[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 sub select {
14     my $self = shift;
15     my $params = {@_};
16     my $uid = $params->{uid};
17     return if !$uid;
18
19     my $messages = $self->new_instance_of('Messages');
20     my $message_types = $messages->select_message_type;
21     my $code_table = {};
22
23     for my $type (@$message_types) {
24         next if (!$type->{selectable_mode} && !$params->{select_all});
25         $code_table->{$type->{message_type_id}} = { description => $type->{description},
26                                                     code => $type->{message_type_id},
27                                                     selectable_mode => $type->{selectable_mode},
28                                                     mode => -1,
29                                                   };
30     }
31
32     my $code = $params->{code};
33
34     # check name parameter
35     if (defined $params->{name}) {
36         my $message_types = $self->new_instance_of("Messages");
37         my $msg_type = $message_types->select(name => $params->{name});
38         if ($msg_type) {
39             $code = $msg_type->{message_type_id};
40         }
41     }
42
43     # single query
44     if (defined $code) {
45         my $rs = $code_table->{$code};
46         return if !$rs;
47
48         my $settings =  $self->generic_select(params => { uid => $uid,
49                                                           code => $code });
50         if (@$settings) {
51             $rs->{mode} = $settings->[0]->{mode};
52         }
53         return $rs;
54     }
55
56     # all for uid query
57     my $settings =  $self->generic_select(params => {uid => $uid});
58     return if !defined $settings;
59
60     for my $st (@$settings) {
61         my $code = $st->{code};
62         if ($code_table->{$code}) {
63             $code_table->{$code}->{mode} = $st->{mode};
64         }
65     }
66
67     my @rs = values %$code_table;
68     return \@rs;
69 }
70
71 sub _is_mode_allowed {
72     # check given mode is selectable for the code
73     my ($self, $mode, $code) = @_;
74     return 1 if $mode < 0;
75
76     my $mode_bit = 1 << $mode;
77     my $messages = $self->new_instance_of('Messages');
78     my $msg_type = $messages->select(message_type_id => $code);
79     return if !$msg_type;
80
81     return $mode_bit & $msg_type->{selectable_mode};
82 }
83
84 sub set {
85     my $self = shift;
86     return if $self->check_readonly;
87
88     my $params = {@_};
89     my $uid = $params->{uid};
90     my $code = $params->{code};
91     my $mode = $params->{mode};
92
93     if (defined $params->{name}) {
94         my $message_types = $self->new_instance_of("Messages");
95         my $msg_type = $message_types->select(name => $params->{name});
96         if ($msg_type) {
97             $code = $msg_type->{message_type_id};
98         }
99     }
100
101     if (!$uid || !defined $code || !defined $mode) {
102         $self->set_error("uid, code and mode not given");
103         return;
104     }
105
106     # mode == -1 means no messages settings exists
107     if ($mode == -1) {
108         return $self->delete(uid => $uid, code => $code);
109     }
110
111     # check if mode is allowed
112     if (!$self->_is_mode_allowed($mode, $code)) {
113         return;
114     }
115
116     my $sql = "INSERT INTO users_messages (uid, code, mode) VALUES (?, ?, ?)" .
117       " ON DUPLICATE KEY UPDATE mode = ?";
118     my $dbh = $self->connect_db;
119     my $rs = $dbh->do($sql, undef, $uid, $code, $mode, $mode);
120     $self->disconnect_db;
121     return $rs;
122 }
123
124 sub delete {
125     my $self = shift;
126     return if $self->check_readonly;
127
128     my $params = {@_};
129     my $uid = $params->{uid};
130     my $code = $params->{code};
131
132     if (!$uid || !defined $code) {
133         $self->set_error("uid and code not given");
134         return;
135     }
136
137     my $dbh = $self->connect_db;
138     my $sql_cleanup = <<"EOSQL";
139 DELETE FROM users_messages WHERE uid = ? AND code = ?
140 EOSQL
141     my $rs = $dbh->do($sql_cleanup, undef, $uid, $code);
142     $self->disconnect_db;
143     return $rs;
144 }
145
146 # deprecated? use set method
147 sub update {
148     shift->set(@_);
149
150     # my $self = shift;
151     # return if $self->check_readonly;
152
153     # my $params = {@_};
154     # my $uid = $params->{uid};
155     # my $code = $params->{code};
156     # my $mode = $params->{mode};
157
158     # if (defined $params->{name}) {
159     #     my $message_types = $self->new_instance_of("Messages");
160     #     my $msg_type = $message_types->select(name => $params->{name});
161     #     if ($msg_type) {
162     #         $code = $msg_type->{message_type_id};
163     #     }
164     # }
165
166     # if (!$uid || !defined $code || !defined $mode) {
167     #     $self->set_error("uid, mode code or name not given");
168     #     return;
169     # }
170
171     # # mode == -1 means no messages settings exists
172     # if ($mode == -1) {
173     #     return $self->delete(uid => $uid, mode => $code);
174     # }
175
176     # my $rs = $self->generic_update(params => { mode => $mode },
177     #                                where => { uid => $uid, code => $code });
178     # return $rs;
179 }
180
181 1;