Skip to content

Commit

Permalink
Add an option allowing to restrict users to see only tickets assigned…
Browse files Browse the repository at this point in the history
… to themselves - closes freescout-helpdesk#701
  • Loading branch information
freescout-helpdesk authored and totake0224 committed Sep 4, 2023
1 parent 0916a83 commit d7a48d9
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 11 deletions.
28 changes: 23 additions & 5 deletions app/Conversation.php
Expand Up @@ -1070,38 +1070,56 @@ 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')
->where('conversation_folder.folder_id', $folder->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);
}

Expand Down
1 change: 1 addition & 0 deletions app/Mailbox.php
Expand Up @@ -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,
Expand Down
18 changes: 16 additions & 2 deletions app/Policies/ConversationPolicy.php
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down
8 changes: 4 additions & 4 deletions app/Policies/MailboxPolicy.php
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down
12 changes: 12 additions & 0 deletions app/User.php
Expand Up @@ -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;
Expand All @@ -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;
}
}
}
Expand Down
14 changes: 14 additions & 0 deletions config/app.php
Expand Up @@ -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
Expand Down

0 comments on commit d7a48d9

Please sign in to comment.