feat: Implement chat functionality

This commit is contained in:
Daan Meijer
2026-06-15 00:40:24 +02:00
parent 8f2cf8e642
commit f8ee8165ff
16 changed files with 349 additions and 2 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ class DynamicController extends Controller
{
$this->authorize('view', $dynamic);
$dynamic->load('ledgers', 'participants');
$dynamic->load('ledgers', 'participants', 'chat.messages.user');
return Inertia::render('Dynamics/Show', [
'dynamic' => $dynamic,
+1 -1
View File
@@ -43,7 +43,7 @@ class LedgerController extends Controller
{
$this->authorize('view', $ledger);
$ledger->load('mutations.user');
$ledger->load('mutations.user', 'mutations.chat.messages.user');
return Inertia::render('Ledgers/Show', [
'dynamic' => $dynamic,
@@ -0,0 +1,72 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreMessageRequest;
use App\Models\Chat;
use App\Models\Message;
use Illuminate\Http\Request;
class MessageController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(StoreMessageRequest $request, Chat $chat)
{
$chat->messages()->create([
...$request->validated(),
'user_id' => $request->user()->id,
]);
return redirect()->back();
}
/**
* Display the specified resource.
*/
public function show(Message $message)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Message $message)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Message $message)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Message $message)
{
//
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use App\Models\Chat;
class StoreMessageRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
$chat = $this->route('chat');
return $chat && $this->user()->can('view', $chat->chatable);
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
*/
public function rules(): array
{
return [
'content' => ['required', 'string'],
];
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class Chat extends Model
{
/** @use HasFactory<\Database\Factories\ChatFactory> */
use HasFactory;
public function chatable(): MorphTo
{
return $this->morphTo();
}
public function messages(): HasMany
{
return $this->hasMany(Message::class);
}
}
+13
View File
@@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphOne;
class Dynamic extends Model
{
@@ -27,4 +28,16 @@ class Dynamic extends Model
{
return $this->hasMany(Ledger::class);
}
public function chat(): MorphOne
{
return $this->morphOne(Chat::class, 'chatable');
}
protected static function booted(): void
{
static::created(function (Dynamic $dynamic) {
$dynamic->chat()->create([]);
});
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Message extends Model
{
/** @use HasFactory<\Database\Factories\MessageFactory> */
use HasFactory;
protected $fillable = [
'chat_id',
'user_id',
'content',
];
public function chat(): BelongsTo
{
return $this->belongsTo(Chat::class);
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
+13
View File
@@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphOne;
class Mutation extends Model
{
@@ -30,4 +31,16 @@ class Mutation extends Model
{
return $this->belongsTo(User::class);
}
public function chat(): MorphOne
{
return $this->morphOne(Chat::class, 'chatable');
}
protected static function booted(): void
{
static::created(function (Mutation $mutation) {
$mutation->chat()->create([]);
});
}
}