Paillasse/portail/app/Http/Controllers/ChatEleveController.php

65 lines
2.1 KiB
PHP
Raw Normal View History

<?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);
}
}