65 lines
2.1 KiB
PHP
65 lines
2.1 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 de sa classe (règles d'Adam, 2026-10-13) :
|
||
|
|
* un seul fil, créé à la première ouverture. Jamais de message si le prof
|
||
|
|
* a coupé le chat de la classe.
|
||
|
|
*/
|
||
|
|
class ChatEleveController extends Controller
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* `lu=1` seulement quand la fenêtre de chat est réellement ouverte :
|
||
|
|
* le sondage du badge en arrière-plan ne doit jamais marquer comme lu.
|
||
|
|
*/
|
||
|
|
public function etat(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$eleve = Auth::guard('eleve')->user()->load('classe');
|
||
|
|
$fil = $eleve->filConversation;
|
||
|
|
|
||
|
|
if ($fil && $request->boolean('lu')) {
|
||
|
|
$fil->update(['lu_par_eleve_a' => now()]);
|
||
|
|
}
|
||
|
|
|
||
|
|
return response()->json([
|
||
|
|
'actif' => $eleve->classe->chat_actif,
|
||
|
|
'non_lus' => $fil ? $fil->nonLusPourEleve() : 0,
|
||
|
|
'messages' => $fil ? $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): JsonResponse
|
||
|
|
{
|
||
|
|
$eleve = Auth::guard('eleve')->user()->load('classe');
|
||
|
|
abort_unless($eleve->classe->chat_actif, 403, 'Le chat est désactivé pour ta classe.');
|
||
|
|
|
||
|
|
$donnees = $request->validate(['contenu' => ['required', 'string', 'max:2000']]);
|
||
|
|
|
||
|
|
$fil = FilConversation::firstOrCreate(
|
||
|
|
['eleve_id' => $eleve->id],
|
||
|
|
['classe_id' => $eleve->classe_id],
|
||
|
|
);
|
||
|
|
|
||
|
|
// Pas de mise à jour de lu_par_eleve_a ici : nonLusPourEleve() ne
|
||
|
|
// compte que les messages du prof, jamais les siens.
|
||
|
|
$message = $fil->messages()->create([
|
||
|
|
'expediteur' => MessageChat::ELEVE,
|
||
|
|
'contenu' => $donnees['contenu'],
|
||
|
|
]);
|
||
|
|
|
||
|
|
return response()->json(['id' => $message->id], 201);
|
||
|
|
}
|
||
|
|
}
|