From d4d1b0e242cb0087bd2d1b4ed38bc4661db70d0f Mon Sep 17 00:00:00 2001 From: hylom Date: Thu, 25 Oct 2018 20:02:53 +0900 Subject: [PATCH] Model::Users::Messages: set() now accept message name --- .../lib/Newslash/Model/Users/Messages.pm | 96 ++++++++++++++++------ src/newslash_web/lib/Newslash/Plugin/Users.pm | 9 +- src/newslash_web/t/models/messages.t | 13 ++- src/newslash_web/templates/my/settings.html.tt2 | 3 +- 4 files changed, 90 insertions(+), 31 deletions(-) diff --git a/src/newslash_web/lib/Newslash/Model/Users/Messages.pm b/src/newslash_web/lib/Newslash/Model/Users/Messages.pm index 3b848909..5ca89fe5 100644 --- a/src/newslash_web/lib/Newslash/Model/Users/Messages.pm +++ b/src/newslash_web/lib/Newslash/Model/Users/Messages.pm @@ -29,9 +29,19 @@ sub select { }; } + my $code = $params->{code}; + + # check name parameter + if (defined $params->{name}) { + my $message_types = $self->new_instance_of("Messages"); + my $msg_type = $message_types->select(name => $params->{name}); + if ($msg_type) { + $code = $msg_type->{message_type_id}; + } + } + # single query - if (defined $params->{code}) { - my $code = $params->{code}; + if (defined $code) { my $rs = $code_table->{$code}; return if !$rs; @@ -58,6 +68,19 @@ sub select { return \@rs; } +sub _is_mode_allowed { + # check given mode is selectable for the code + my ($self, $mode, $code) = @_; + return 1 if $mode < 0; + + my $mode_bit = 1 << $mode; + my $messages = $self->new_instance_of('Messages'); + my $msg_type = $messages->select(message_type_id => $code); + return if !$msg_type; + + return $mode_bit & $msg_type->{selectable_mode}; +} + sub set { my $self = shift; return if $self->check_readonly; @@ -66,15 +89,30 @@ sub set { my $uid = $params->{uid}; my $code = $params->{code}; my $mode = $params->{mode}; + + if (defined $params->{name}) { + my $message_types = $self->new_instance_of("Messages"); + my $msg_type = $message_types->select(name => $params->{name}); + if ($msg_type) { + $code = $msg_type->{message_type_id}; + } + } + if (!$uid || !defined $code || !defined $mode) { $self->set_error("uid, code and mode not given"); return; } + # mode == -1 means no messages settings exists if ($mode == -1) { return $self->delete(uid => $uid, code => $code); } + # check if mode is allowed + if (!$self->_is_mode_allowed($mode, $code)) { + return; + } + my $sql = "INSERT INTO users_messages (uid, code, mode) VALUES (?, ?, ?)" . " ON DUPLICATE KEY UPDATE mode = ?"; my $dbh = $self->connect_db; @@ -105,29 +143,39 @@ EOSQL return $rs; } +# deprecated? use set method sub update { - my $self = shift; - return if $self->check_readonly; - - # TODO: add "name" parameter support - - 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; - } - - # 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; + shift->set(@_); + + # my $self = shift; + # return if $self->check_readonly; + + # my $params = {@_}; + # my $uid = $params->{uid}; + # my $code = $params->{code}; + # my $mode = $params->{mode}; + + # if (defined $params->{name}) { + # my $message_types = $self->new_instance_of("Messages"); + # my $msg_type = $message_types->select(name => $params->{name}); + # if ($msg_type) { + # $code = $msg_type->{message_type_id}; + # } + # } + + # if (!$uid || !defined $code || !defined $mode) { + # $self->set_error("uid, mode code or name not given"); + # return; + # } + + # # 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; diff --git a/src/newslash_web/lib/Newslash/Plugin/Users.pm b/src/newslash_web/lib/Newslash/Plugin/Users.pm index cc75eca2..51115195 100644 --- a/src/newslash_web/lib/Newslash/Plugin/Users.pm +++ b/src/newslash_web/lib/Newslash/Plugin/Users.pm @@ -37,12 +37,13 @@ sub create_new_user { # check options if ($options->{message}) { + my $message_types = $self->app->model('messages'); for my $k (keys %{$options->{message}}) { - my $message_name = $k; - my $mode = $options->{message}->{$k}; - my $rs = $users->messages->update(uid => $uid, name => $message_name, mode => $mode); + my $rs = $users->messages->update(uid => $uid, + name => $k, + mode => $options->{message}->{$k}); if (!defined $rs) { - $self->app->log->error("Users: message update failed! uid: $uid, name: $message_name, mode: $mode"); + $self->app->log->error("Users: message update failed! uid: $uid, name: $k, mode: $options->{message}->{$k}"); } } } diff --git a/src/newslash_web/t/models/messages.t b/src/newslash_web/t/models/messages.t index 89d89ad0..c74dd5d7 100644 --- a/src/newslash_web/t/models/messages.t +++ b/src/newslash_web/t/models/messages.t @@ -71,14 +71,23 @@ subtest 'message create and select' => sub { 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; + # update messages setting + $rs = $users->messages->set(uid => $user2->{uid}, + name => "newsletter", + mode => 1); + ok(defined $rs, "change notification mode (2)"); + $msg = $users->messages->select(uid => $user2->{uid}, + name => "newsletter"); + ok($msg, "get message info by name"); + 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."; my $msg_id = $messages->create(from => $user1->{uid}, diff --git a/src/newslash_web/templates/my/settings.html.tt2 b/src/newslash_web/templates/my/settings.html.tt2 index f4cb949c..e60b0caf 100644 --- a/src/newslash_web/templates/my/settings.html.tt2 +++ b/src/newslash_web/templates/my/settings.html.tt2 @@ -146,12 +146,13 @@