diff --git a/Modules/Helpdesk/Models/Ticket.php b/Modules/Helpdesk/Models/Ticket.php index 6fcd183..c00d075 100644 --- a/Modules/Helpdesk/Models/Ticket.php +++ b/Modules/Helpdesk/Models/Ticket.php @@ -27,7 +27,7 @@ final class Ticket extends Model protected $table = 'helpdesk_tickets'; - protected $with = ['user']; + protected $with = ['user', 'agent']; /** @var list */ protected $fillable = [ diff --git a/Modules/Helpdesk/Services/AutomationRuleService.php b/Modules/Helpdesk/Services/AutomationRuleService.php index 5f7a5de..38594e5 100644 --- a/Modules/Helpdesk/Services/AutomationRuleService.php +++ b/Modules/Helpdesk/Services/AutomationRuleService.php @@ -13,7 +13,7 @@ final class AutomationRuleService /** @param array $context */ public function apply(Ticket $ticket, array $context = []): Ticket { - $sender = (string) ($context['sender'] ?? $ticket->owner?->email ?? ''); + $sender = (string) ($context['sender'] ?? $ticket->user?->email ?? ''); $mailbox = (string) ($context['mailbox'] ?? ''); AutomationRule::query() diff --git a/Modules/Helpdesk/Services/CannedResponseRenderer.php b/Modules/Helpdesk/Services/CannedResponseRenderer.php index 704caba..77387f8 100644 --- a/Modules/Helpdesk/Services/CannedResponseRenderer.php +++ b/Modules/Helpdesk/Services/CannedResponseRenderer.php @@ -22,7 +22,7 @@ final class CannedResponseRenderer '{{ ticket.category }}' => (string) ($ticket->category?->name ?? ''), '{{ ticket.project }}' => (string) ($ticket->project?->title ?? ''), '{{ ticket.team }}' => (string) ($ticket->team?->name ?? ''), - '{{ requester.name }}' => (string) ($ticket->owner?->name ?? ''), + '{{ requester.name }}' => (string) ($ticket->user?->name ?? ''), '{{ agent.name }}' => (string) ($ticket->agent?->name ?? ''), '{{ actor.name }}' => (string) ($actor?->name ?? ''), '{{ ticket.url }}' => route('helpdesk.tickets.show', ['ticket' => $ticket->getKey()]), diff --git a/Modules/UserManagement/Console/EnsureAdminCommand.php b/Modules/UserManagement/Console/EnsureAdminCommand.php new file mode 100644 index 0000000..bea49bd --- /dev/null +++ b/Modules/UserManagement/Console/EnsureAdminCommand.php @@ -0,0 +1,35 @@ +find((int) $this->argument('user')); + + if ($user === null) { + $this->error('User not found.'); + + return self::FAILURE; + } + + $user->forceFill([ + 'helpdesk_admin' => true, + 'helpdesk_agent' => true, + ])->save(); + + $this->info("{$user->name} is now a Helpdesk administrator."); + + return self::SUCCESS; + } +} diff --git a/Modules/UserManagement/Database/Migrations/2026_08_26_081500_ensure_initial_helpdesk_admin.php b/Modules/UserManagement/Database/Migrations/2026_08_26_081500_ensure_initial_helpdesk_admin.php new file mode 100644 index 0000000..f158430 --- /dev/null +++ b/Modules/UserManagement/Database/Migrations/2026_08_26_081500_ensure_initial_helpdesk_admin.php @@ -0,0 +1,42 @@ +where('helpdesk_admin', true)->exists()) { + return; + } + + $userId = DB::table('users')->orderBy('id')->value('id'); + + if ($userId === null) { + return; + } + + DB::table('users')->where('id', $userId)->update([ + 'helpdesk_admin' => true, + 'helpdesk_agent' => true, + 'updated_at' => now(), + ]); + } + + public function down(): void + { + // Never silently remove administrator access. + } +}; diff --git a/Modules/UserManagement/Http/Middleware/EnsureUserManagementAdmin.php b/Modules/UserManagement/Http/Middleware/EnsureUserManagementAdmin.php index f0aa76b..91d278d 100644 --- a/Modules/UserManagement/Http/Middleware/EnsureUserManagementAdmin.php +++ b/Modules/UserManagement/Http/Middleware/EnsureUserManagementAdmin.php @@ -14,14 +14,15 @@ final class EnsureUserManagementAdmin { $user = $request->user(); - $allowed = $user !== null && ( - (method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) - || (method_exists($user, 'isAdmin') && $user->isAdmin()) - || (bool) ($user->helpdesk_admin ?? false) + abort_unless( + $user !== null + && ( + (bool) ($user->helpdesk_admin ?? false) + || (method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) + ), + 403 ); - abort_unless($allowed, 403); - return $next($request); } } diff --git a/Modules/UserManagement/Providers/UserManagementServiceProvider.php b/Modules/UserManagement/Providers/UserManagementServiceProvider.php index 5abe93a..9f108c2 100644 --- a/Modules/UserManagement/Providers/UserManagementServiceProvider.php +++ b/Modules/UserManagement/Providers/UserManagementServiceProvider.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Modules\UserManagement\Providers; use Illuminate\Support\ServiceProvider; +use Modules\UserManagement\Console\EnsureAdminCommand; final class UserManagementServiceProvider extends ServiceProvider { @@ -12,4 +13,15 @@ final class UserManagementServiceProvider extends ServiceProvider { $this->app->register(RouteServiceProvider::class); } + + public function boot(): void + { + $this->loadMigrationsFrom(module_path('UserManagement', 'Database/Migrations')); + + if ($this->app->runningInConsole()) { + $this->commands([ + EnsureAdminCommand::class, + ]); + } + } } diff --git a/resources/themes/backend/views/layouts/app/sidebar.blade.php b/resources/themes/backend/views/layouts/app/sidebar.blade.php index 19b1fdc..989ca13 100644 --- a/resources/themes/backend/views/layouts/app/sidebar.blade.php +++ b/resources/themes/backend/views/layouts/app/sidebar.blade.php @@ -4,10 +4,10 @@ @php $user = auth()->user(); - $isAdmin = - (bool) ($user?->helpdesk_admin ?? false) - || ($user && method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) - || ($user && method_exists($user, 'isAdmin') && $user->isAdmin()); + $isAdmin = $user !== null && ( + (bool) ($user->helpdesk_admin ?? false) + || (method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) + ); $roleLabel = $isAdmin ? 'Administrator' : ((method_exists($user, 'isHelpdeskAgent') && $user->isHelpdeskAgent()) || (bool) ($user->helpdesk_agent ?? false) ? 'Agent' : 'User'); @endphp