From b031781e43d0ce72abb09edd358b3c87e1a247d1 Mon Sep 17 00:00:00 2001 From: Leon Morival Date: Sun, 12 Apr 2026 14:56:43 +0200 Subject: [PATCH] feat: messages images and components --- app/Http/Controllers/MessageController.php | 8 +++++- .../Requests/Messaging/MessageRequest.php | 3 +- .../Resources/Messaging/MessageResource.php | 4 ++- app/Models/Message.php | 1 + compose.yaml | 1 + ...111718_add_image_url_to_messages_table.php | 28 +++++++++++++++++++ routes/api.php | 2 ++ 7 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2026_04_12_111718_add_image_url_to_messages_table.php diff --git a/app/Http/Controllers/MessageController.php b/app/Http/Controllers/MessageController.php index 9559490..ca19f03 100644 --- a/app/Http/Controllers/MessageController.php +++ b/app/Http/Controllers/MessageController.php @@ -41,11 +41,17 @@ class MessageController extends Controller $user = $request->user(); + $imageUrl = null; + if ($request->hasFile('image')) { + $imageUrl = $request->file('image')->store('messages/images', 'public'); + } + $message = $conversation->messages()->create([ 'user_id' => $user->id, 'sender_name' => $user->name, 'sender_avatar_url' => $user->avatar_url, - 'body' => $validated['body'], + 'body' => $validated['body'] ?? null, + 'image_url' => $imageUrl, ]); broadcast(new \App\Events\MessageSent($message))->toOthers(); diff --git a/app/Http/Requests/Messaging/MessageRequest.php b/app/Http/Requests/Messaging/MessageRequest.php index 4974de9..d490c9c 100644 --- a/app/Http/Requests/Messaging/MessageRequest.php +++ b/app/Http/Requests/Messaging/MessageRequest.php @@ -22,7 +22,8 @@ class MessageRequest extends FormRequest public function rules(): array { return [ - 'body' => 'required|string', + 'body' => 'nullable|string|required_without:image', + 'image' => 'nullable|image|max:5120', // Max 5MB ]; } } diff --git a/app/Http/Resources/Messaging/MessageResource.php b/app/Http/Resources/Messaging/MessageResource.php index 3998fb7..1a3ed36 100644 --- a/app/Http/Resources/Messaging/MessageResource.php +++ b/app/Http/Resources/Messaging/MessageResource.php @@ -4,7 +4,7 @@ namespace App\Http\Resources\Messaging; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; -use App\Http\Resources\UserResource; +use Illuminate\Support\Facades\Storage; class MessageResource extends JsonResource { @@ -16,10 +16,12 @@ class MessageResource extends JsonResource public function toArray(Request $request): array { return [ + 'id' => $this->id, 'senderId' => $this->user_id, 'senderName' => $this->sender_name, 'senderAvatarUrl' => $this->sender_avatar_url, 'body' => $this->body, + 'imageUrl' => $this->image_url ? asset(Storage::url($this->image_url)) : null, 'readAt' => $this->read_at, 'createdAt' => $this->created_at, ]; diff --git a/app/Models/Message.php b/app/Models/Message.php index c7f4d2e..8079882 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -18,6 +18,7 @@ class Message extends Model 'sender_avatar_url', 'conversation_id', 'body', + 'image_url', 'read_at', ]; diff --git a/compose.yaml b/compose.yaml index abc97d0..0e89571 100644 --- a/compose.yaml +++ b/compose.yaml @@ -10,6 +10,7 @@ services: - 'host.docker.internal:host-gateway' ports: - '${APP_PORT:-8003}:80' + - '8080:8080' environment: WWWUSER: '${WWWUSER}' LARAVEL_SAIL: 1 diff --git a/database/migrations/2026_04_12_111718_add_image_url_to_messages_table.php b/database/migrations/2026_04_12_111718_add_image_url_to_messages_table.php new file mode 100644 index 0000000..394aa2a --- /dev/null +++ b/database/migrations/2026_04_12_111718_add_image_url_to_messages_table.php @@ -0,0 +1,28 @@ +string('image_url')->nullable()->after('body'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('messages', function (Blueprint $table) { + $table->dropColumn('image_url'); + }); + } +}; diff --git a/routes/api.php b/routes/api.php index b3f0ed1..1f1f672 100644 --- a/routes/api.php +++ b/routes/api.php @@ -2,6 +2,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; +use Illuminate\Support\Facades\Broadcast; use App\Http\Controllers\AuthController; use App\Http\Controllers\todoController; Route::prefix('auth')->group(function (): void { @@ -23,6 +24,7 @@ Route::middleware('auth:sanctum')->prefix('todos')->group(function (): void { }); Route::middleware('auth:sanctum')->group(function (): void { + Broadcast::routes(); Route::get('users', [\App\Http\Controllers\UserController::class, 'index']); Route::apiResource('conversations', \App\Http\Controllers\ConversationController::class);