| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/client-portal-laravel/releases/20260626120707/config/ |
Upload File : |
<?php
declare(strict_types=1);
/**
* Plan 278-E.3 — Reference attachment allowlist + route resolver registry.
*
* Each morph alias defines:
* - model: FQCN of the target Eloquent model
* - policy: ability name passed to Gate::allows / authorize
* - resolver: (optional) override resolver class. If absent we use
* DefaultRouteResolver with `label`/`route`/`icon` keys.
* - label: column on the model that produces the display label
* - route: array {portal: route name, admin: route name}
* - icon: heroicon key for the chip
*
* Adding a new morph requires:
* 1. Registering the alias in AppServiceProvider via Relation::morphMap
* 2. Confirming a `view` policy exists on the target model
* 3. Confirming portal + admin route names resolve via route()
*/
use App\Models\Communication\Conversation;
use App\Models\Invoicing\Invoice;
use App\Models\Projects\Project;
use App\Models\Projects\ProjectMilestone;
use App\Models\Websites\Website;
use App\Services\Communication\MessageReferences\DefaultRouteResolver;
return [
'referenceable_morphs' => [
'project' => [
'model' => Project::class,
'policy' => 'view',
'resolver' => DefaultRouteResolver::class,
'label' => 'name',
'route' => [
'portal' => 'portal.projects.show',
'admin' => 'admin.projects.show',
],
'icon' => 'briefcase',
],
'invoice' => [
'model' => Invoice::class,
'policy' => 'view',
'resolver' => DefaultRouteResolver::class,
'label' => 'number',
'route' => [
'portal' => 'portal.invoices.show',
'admin' => 'admin.invoices.show',
],
'icon' => 'document-text',
],
'conversation' => [
'model' => Conversation::class,
'policy' => 'view',
'resolver' => DefaultRouteResolver::class,
'label' => 'subject',
'route' => [
'portal' => 'portal.inbox.show',
'admin' => 'admin.inbox.index',
],
'icon' => 'chat-bubble',
],
'website' => [
'model' => Website::class,
'policy' => 'view',
'resolver' => DefaultRouteResolver::class,
'label' => 'display_name',
'route' => [
'portal' => 'portal.websites.show',
'admin' => 'admin.websites.show',
],
'icon' => 'globe',
],
// Milestone needs nested route params (project + milestone) — custom resolver.
'milestone' => [
'model' => ProjectMilestone::class,
'policy' => 'view',
'resolver' => \App\Services\Communication\MessageReferences\Resolvers\MilestoneRouteResolver::class,
'icon' => 'flag',
],
],
'reference_search' => [
'min_query_length' => 2,
'result_cap' => 25,
'rate_per_minute' => 30,
],
];