OSDN Git Service

Model::Users::Messages: set() now accept message name
authorhylom <hylom@users.sourceforge.jp>
Thu, 25 Oct 2018 11:02:53 +0000 (20:02 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 25 Oct 2018 11:04:14 +0000 (20:04 +0900)
src/newslash_web/lib/Newslash/Model/Users/Messages.pm
src/newslash_web/lib/Newslash/Plugin/Users.pm
src/newslash_web/t/models/messages.t
src/newslash_web/templates/my/settings.html.tt2

index 3b84890..5ca89fe 100644 (file)
@@ -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;
index cc75eca..5111519 100644 (file)
@@ -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}");
             }
         }
     }
index 89d89ad..c74dd5d 100644 (file)
@@ -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},
index f4cb949..e60b0ca 100644 (file)
               <span class="glyphicon glyphicon-ban-circle" aria-hidden="true">通知しない</span>
             </button>
             <button type="button" title="メールで通知"
+                    v-if="conf.selectable_mode & 1 > 0"
                     :class="{active: (conf.mode == 0)}"
                     v-on:click="setMessageMode(conf.code, 0)">
               <span class="glyphicon glyphicon-envelope" aria-hidden="true">メールで通知</span>
             </button>
             <button type="button"  title="サイト上で通知"
-                    v-if="conf.selectable_mode > 1"
+                    v-if="conf.selectable_mode & 2 > 0"
                     :class="{active: (conf.mode == 1)}"
                     v-on:click="setMessageMode(conf.code, 1)">
               <span class="glyphicon glyphicon-comment" aria-hidden="true">サイト上で通知</span>