77 lines
2.5 KiB
PHP
77 lines
2.5 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers;
|
||
|
|
|
||
|
|
use App\Models\FilConversation;
|
||
|
|
use App\Models\MessageChat;
|
||
|
|
use Illuminate\Http\JsonResponse;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Support\Facades\Auth;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Chat Messenger élève ↔ prof : côté prof, une liste de fils (un par
|
||
|
|
* élève lui ayant déjà écrit), jamais de fil entre deux élèves.
|
||
|
|
*/
|
||
|
|
class ChatProfController extends Controller
|
||
|
|
{
|
||
|
|
public function index(): JsonResponse
|
||
|
|
{
|
||
|
|
$classeIds = Auth::guard('web')->user()->classes()->pluck('id');
|
||
|
|
|
||
|
|
$fils = FilConversation::whereIn('classe_id', $classeIds)
|
||
|
|
->whereHas('messages')
|
||
|
|
->with(['eleve', 'classe'])
|
||
|
|
->get()
|
||
|
|
->map(fn (FilConversation $f) => [
|
||
|
|
'id' => $f->id,
|
||
|
|
'eleve' => $f->eleve->nomAffiche(),
|
||
|
|
'classe' => $f->classe->nom,
|
||
|
|
'non_lus' => $f->nonLusPourProf(),
|
||
|
|
'dernier_message_a' => $f->messages->last()?->created_at->toIso8601String(),
|
||
|
|
])
|
||
|
|
->sortByDesc('dernier_message_a')
|
||
|
|
->values();
|
||
|
|
|
||
|
|
return response()->json(['fils' => $fils]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function etat(FilConversation $fil): JsonResponse
|
||
|
|
{
|
||
|
|
$this->verifierProprietaire($fil);
|
||
|
|
$fil->update(['lu_par_prof_a' => now()]);
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'eleve' => $fil->eleve->nomAffiche(),
|
||
|
|
'actif' => $fil->classe->chat_actif,
|
||
|
|
'messages' => $fil->messages->map(fn (MessageChat $m) => [
|
||
|
|
'id' => $m->id,
|
||
|
|
'expediteur' => $m->expediteur,
|
||
|
|
'contenu' => $m->contenu,
|
||
|
|
'envoye_a' => $m->created_at->toIso8601String(),
|
||
|
|
]),
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function envoyer(Request $request, FilConversation $fil): JsonResponse
|
||
|
|
{
|
||
|
|
$this->verifierProprietaire($fil);
|
||
|
|
abort_unless($fil->classe->chat_actif, 403, 'Le chat est désactivé pour cette classe.');
|
||
|
|
|
||
|
|
$donnees = $request->validate(['contenu' => ['required', 'string', 'max:2000']]);
|
||
|
|
|
||
|
|
// Pas de mise à jour de lu_par_prof_a ici : nonLusPourProf() ne
|
||
|
|
// compte que les messages de l'élève, jamais les siens.
|
||
|
|
$message = $fil->messages()->create([
|
||
|
|
'expediteur' => MessageChat::PROF,
|
||
|
|
'contenu' => $donnees['contenu'],
|
||
|
|
]);
|
||
|
|
|
||
|
|
return response()->json(['id' => $message->id], 201);
|
||
|
|
}
|
||
|
|
|
||
|
|
private function verifierProprietaire(FilConversation $fil): void
|
||
|
|
{
|
||
|
|
abort_if($fil->classe->user_id !== Auth::guard('web')->id(), 403);
|
||
|
|
}
|
||
|
|
}
|