diff --git a/app/Enums/MessageType.php b/app/Enums/MessageType.php new file mode 100644 index 0000000..a18274b --- /dev/null +++ b/app/Enums/MessageType.php @@ -0,0 +1,38 @@ + 1, + 'public' => 2 + ]; + } + + /** + * Enum labels + * + * @return array + */ + protected static function labels(): array + { + return [ + 'private' => trans('Privé'), + 'public' => trans('Public'), + ]; + } +} diff --git a/app/Http/Controllers/TicketController.php b/app/Http/Controllers/TicketController.php index e74431f..b0395d9 100644 --- a/app/Http/Controllers/TicketController.php +++ b/app/Http/Controllers/TicketController.php @@ -433,7 +433,7 @@ class TicketController extends Controller /** @var \App\Models\User|null */ if ($assignedUser = User::whereId($request->assign)->first()) { - $message = trans(':admin à assigné le ticket n°:ticketNumber à :assignedAdmin', [ + $message = trans(':admin a assigné le ticket n°:ticketNumber à :assignedAdmin', [ 'admin' => $user->name, 'ticketNumber' => $ticket->id, 'assignedAdmin' => $assignedUser->name, @@ -441,7 +441,7 @@ class TicketController extends Controller $ticket->assignedUser()->associate($assignedUser); } else { $message = trans( - ':admin modifié l\'assignation du ticket n°:ticketNumber, il n\'est plus assigné à quelqu\'un.', + ':admin a modifié l\'assignation du ticket n°:ticketNumber, il n\'est plus assigné à quelqu\'un.', [ 'admin' => $user->name, 'ticketNumber' => $ticket->id, diff --git a/app/Http/Requests/CreateMessage.php b/app/Http/Requests/CreateMessage.php index ad93dfb..f754e0e 100644 --- a/app/Http/Requests/CreateMessage.php +++ b/app/Http/Requests/CreateMessage.php @@ -2,7 +2,9 @@ namespace App\Http\Requests; +use App\Enums\MessageType; use Illuminate\Foundation\Http\FormRequest; +use Kwaadpepper\Enum\Rules\EnumIsValidRule; class CreateMessage extends FormRequest { @@ -17,6 +19,12 @@ class CreateMessage extends FormRequest if (!($user = auth()->user())) { return false; } + if ( + !auth()->user()->can('createPrivateMessage', request()->route()->ticket) + && $this->is_private == MessageType::private() + ) { + return false; + } return auth()->check() and auth()->user()->sites and ( $user->isAdmin() or auth()->user()->sites->contains(request()->route()->ticket->site_id) @@ -33,7 +41,8 @@ class CreateMessage extends FormRequest protected function prepareForValidation() { $this->merge([ - 'subscribe' => $this->subscribe ? true : false + 'subscribe' => $this->subscribe ? true : false, + 'type' => $this->is_private ? MessageType::private()->value : MessageType::public()->value ]); } @@ -49,7 +58,11 @@ class CreateMessage extends FormRequest return [ 'subscribe' => 'required|boolean', 'message' => 'required|min:' . ($user->isAdmin() ? '5' : '20'), - 'file_message' => 'sometimes|mimes:jpeg,jpg,png,pdf|max:2048' + 'file_message' => 'sometimes|mimes:jpeg,jpg,png,pdf|max:2048', + 'type' => [ + 'required', + new EnumIsValidRule(MessageType::class) + ] ]; } } diff --git a/app/Listeners/AddStatusMessages.php b/app/Listeners/AddStatusMessages.php index cb6546a..a7e6cd7 100644 --- a/app/Listeners/AddStatusMessages.php +++ b/app/Listeners/AddStatusMessages.php @@ -2,6 +2,7 @@ namespace App\Listeners; +use App\Enums\MessageType; use App\Enums\TicketStatus; use App\Events\TicketStatusChanged; use App\Models\Message; @@ -21,7 +22,6 @@ class AddStatusMessages if ($event->message) { $message->message = $event->message; } elseif ($event->user) { - // phpcs:ignore Generic.Files.LineLength.TooLong $message->message = sprintf( "%s %s %s", $event->user->name, @@ -91,7 +91,8 @@ class AddStatusMessages __("Ce ticket est clos.") ); break; - } + } //end switch + $message->type = MessageType::public(); $message->save(); } } diff --git a/app/Models/Message.php b/app/Models/Message.php index be98669..6755a42 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -2,14 +2,17 @@ namespace App\Models; +use App\Enums\MessageType; use App\Events\NotifySubscriptions; use App\Events\NotifyTicketCreator; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Kwaadpepper\Enum\Traits\CastsEnums; class Message extends Model { use HasFactory; + use CastsEnums; /** * The attributes that are mass assignable. @@ -17,7 +20,17 @@ class Message extends Model * @var array */ protected $fillable = [ - 'message' + 'message', + 'type' + ]; + + /** + * The attributes that should be cast to Enums. + * + * @var array + */ + protected $enumCasts = [ + 'type' => MessageType::class ]; /** diff --git a/app/Policies/TicketPolicy.php b/app/Policies/TicketPolicy.php index b31d2db..8264119 100644 --- a/app/Policies/TicketPolicy.php +++ b/app/Policies/TicketPolicy.php @@ -46,6 +46,10 @@ class TicketPolicy extends RootPolicy ]), 'suscribeToTicket' => TicketStaticRules::make('ticketIsNotArchived', $model), 'createMessage' => TicketStaticRules::make('ticketIsNotArchived', $model), + 'createPrivateMessage' => StaticRules::and([ + URR::make('userIsAdmin', $user), + TicketStaticRules::make('ticketIsNotArchived', $model), + ]), 'updateMessage' => StaticRules::or([ URR::make('userIsAdmin', $user), TicketStaticRules::make('ticketIsNotArchived', $model), diff --git a/config/app.php b/config/app.php index b2c68ba..72f41ed 100644 --- a/config/app.php +++ b/config/app.php @@ -245,6 +245,7 @@ return [ 'TableRow' => App\Enums\Planning\TableRow::class, 'ActivityEnum' => App\Enums\MacroSchedule\Activity::class, 'ProjectStatus' => App\Enums\ProjectStatus::class, + 'MessageTypeEnum' => App\Enums\MessageType::class, ], ]; diff --git a/database/migrations/2023_04_06_122125_add_message_type.php b/database/migrations/2023_04_06_122125_add_message_type.php new file mode 100644 index 0000000..8911adc --- /dev/null +++ b/database/migrations/2023_04_06_122125_add_message_type.php @@ -0,0 +1,42 @@ +unsignedTinyInteger('type') + ->comment('Message Type defined by an enum.') + ->after('message'); + }); + // Set all existing messages as public. + $messages = DB::table('messages')->get(); + collect($messages)->map(function (object $message) { + DB::table('messages')->where('id', $message->id) + ->update(['type' => MessageType::public()]); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('messages', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } +} diff --git a/resources/views/ticket/show.blade.php b/resources/views/ticket/show.blade.php index aec2ebd..f6ae88a 100644 --- a/resources/views/ticket/show.blade.php +++ b/resources/views/ticket/show.blade.php @@ -126,6 +126,16 @@ + @can('createPrivateMessage', $ticket) +