diff --git a/app/Conversation.php b/app/Conversation.php index 2b4037a8f..719d33995 100644 --- a/app/Conversation.php +++ b/app/Conversation.php @@ -1070,25 +1070,27 @@ public function getAssigneeName($ucfirst = false, $user = null) */ public static function getQueryByFolder($folder, $user_id) { + // Get conversations from personal folder if ($folder->type == Folder::TYPE_MINE) { - // Get conversations from personal folder $query_conversations = self::where('user_id', $user_id) ->where('mailbox_id', $folder->mailbox_id) ->whereIn('status', [self::STATUS_ACTIVE, self::STATUS_PENDING]) ->where('state', self::STATE_PUBLISHED); - } elseif ($folder->type == Folder::TYPE_ASSIGNED) { - // Assigned - do not show my conversations + // Assigned - do not show my conversations. + } elseif ($folder->type == Folder::TYPE_ASSIGNED) { $query_conversations = $folder->conversations() // This condition also removes from result records with user_id = null ->where('user_id', '<>', $user_id) ->where('state', self::STATE_PUBLISHED); + + // Starred by user conversations. } elseif ($folder->type == Folder::TYPE_STARRED) { $starred_conversation_ids = self::getUserStarredConversationIds($folder->mailbox_id, $user_id); $query_conversations = self::whereIn('id', $starred_conversation_ids); - } elseif ($folder->isIndirect()) { - // Conversations are connected to folder via conversation_folder table. + // Conversations are connected to folder via conversation_folder table. + } elseif ($folder->isIndirect()) { $query_conversations = self::select('conversations.*') //->where('conversations.mailbox_id', $folder->mailbox_id) ->join('conversation_folder', 'conversations.id', '=', 'conversation_folder.conversation_id') @@ -1096,12 +1098,28 @@ public static function getQueryByFolder($folder, $user_id) if ($folder->type != Folder::TYPE_DRAFTS) { $query_conversations->where('state', self::STATE_PUBLISHED); } + + // Deleted. } elseif ($folder->type == Folder::TYPE_DELETED) { $query_conversations = $folder->conversations()->where('state', self::STATE_DELETED); + + // Everything else. } else { $query_conversations = $folder->conversations()->where('state', self::STATE_PUBLISHED); } + // If show only assigned to the current user conversations. + if (!\Helper::isConsole() + && $user_id + && $user = auth()->user() + ) { + if ($user->id == $user_id + && $user->hasManageMailboxPermission($folder->mailbox_id, Mailbox::ACCESS_PERM_ASSIGNED) + ) { + $query_conversations->where('user_id', '=', $user_id); + } + } + return \Eventy::filter('folder.conversations_query', $query_conversations, $folder, $user_id); } diff --git a/app/Mailbox.php b/app/Mailbox.php index e46f0547a..1541854a7 100644 --- a/app/Mailbox.php +++ b/app/Mailbox.php @@ -102,6 +102,7 @@ class Mailbox extends Model const ACCESS_PERM_PERMISSIONS = 'perm'; const ACCESS_PERM_AUTO_REPLIES = 'auto'; const ACCESS_PERM_SIGNATURE = 'sig'; + const ACCESS_PERM_ASSIGNED = 'asg'; public static $access_permissions = [ self::ACCESS_PERM_EDIT, diff --git a/app/Policies/ConversationPolicy.php b/app/Policies/ConversationPolicy.php index 14575d3f9..7bef60740 100644 --- a/app/Policies/ConversationPolicy.php +++ b/app/Policies/ConversationPolicy.php @@ -25,7 +25,14 @@ public function view(User $user, Conversation $conversation) return true; } else { if ($conversation->mailbox->users->contains($user)) { - return true; + // Maybe user can see only assigned conversations. + if ($conversation->user_id != $user->id + && $user->hasManageMailboxPermission($conversation->mailbox_id, Mailbox::ACCESS_PERM_ASSIGNED) + ) { + return false; + } else { + return true; + } } else { return false; } @@ -45,7 +52,14 @@ public function viewCached(User $user, Conversation $conversation) return true; } else { if ($conversation->mailbox->users_cached->contains($user)) { - return true; + // Maybe user can see only assigned conversations. + if ($conversation->user_id != $user->id + && $user->hasManageMailboxPermission($conversation->mailbox_id, Mailbox::ACCESS_PERM_ASSIGNED) + ) { + return false; + } else { + return true; + } } else { return false; } diff --git a/app/Policies/MailboxPolicy.php b/app/Policies/MailboxPolicy.php index d526c1e66..190fc3f3a 100644 --- a/app/Policies/MailboxPolicy.php +++ b/app/Policies/MailboxPolicy.php @@ -107,7 +107,7 @@ public function update(User $user, Mailbox $mailbox) */ public function updateAutoReply(User $user, Mailbox $mailbox) { - if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, 'auto')) { + if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, Mailbox::ACCESS_PERM_AUTO_REPLIES)) { return true; } else { return false; @@ -124,7 +124,7 @@ public function updateAutoReply(User $user, Mailbox $mailbox) */ public function updatePermissions(User $user, Mailbox $mailbox) { - if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, 'perm')) { + if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, Mailbox::ACCESS_PERM_PERMISSIONS)) { return true; } else { return false; @@ -141,7 +141,7 @@ public function updatePermissions(User $user, Mailbox $mailbox) */ public function updateSettings(User $user, Mailbox $mailbox) { - if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, 'edit')) { + if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, Mailbox::ACCESS_PERM_EDIT)) { return true; } else { return false; @@ -158,7 +158,7 @@ public function updateSettings(User $user, Mailbox $mailbox) */ public function updateEmailSignature(User $user, Mailbox $mailbox) { - if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, 'sig')) { + if ($user->isAdmin() || $user->hasManageMailboxPermission($mailbox->id, Mailbox::ACCESS_PERM_SIGNATURE)) { return true; } else { return false; diff --git a/app/User.php b/app/User.php index f4596bd35..5efdb3788 100644 --- a/app/User.php +++ b/app/User.php @@ -349,6 +349,10 @@ public function canManageMailbox($mailbox_id) } } + /** + * Main function to check if user has some exta access permission + * for a given mailbox. + */ public function hasManageMailboxPermission($mailbox_id, $perm) { if ($this->isAdmin()) { return true; @@ -357,6 +361,14 @@ public function hasManageMailboxPermission($mailbox_id, $perm) { $mailbox = $this->mailboxesSettings()->where('mailbox_id', $mailbox_id)->first(); if ($mailbox && !empty($mailbox->access) && in_array($perm, json_decode($mailbox->access))) { return true; + } else { + // Experimental feature. + // This option does not affect admin users. + $show_only_assigned_conversations = config('app.show_only_assigned_conversations'); + if (in_array($this->id, explode(',', $show_only_assigned_conversations))) { + return true; + } + return false; } } } diff --git a/config/app.php b/config/app.php index bd1414321..669e0074d 100644 --- a/config/app.php +++ b/config/app.php @@ -419,6 +419,20 @@ */ 'update_folder_counters_in_background' => env('APP_UPDATE_FOLDER_COUNTERS_IN_BACKGROUND', false), + /* + |-------------------------------------------------------------------------- + | Experimental feature allowing to specify users who can see only conversations + | assigned to themselves. For such users only Mine folder shows actual number of conversations. + | This option does not affect admin users. + | + | The option should be specified as a comma separated list of user IDs which + | can be found in the their profile URL (/users/profile/7). + | + | Example: 7,5,31 + |------------------------------------------------------------------------- + */ + 'show_only_assigned_conversations' => env('APP_SHOW_ONLY_ASSIGNED_CONVERSATIONS', ''), + /* |-------------------------------------------------------------------------- | Autoloaded Service Providers