36 lines
1.1 KiB
PHP
36 lines
1.1 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers;
|
||
|
|
|
||
|
|
use App\Models\EvenementExamen;
|
||
|
|
use App\Models\LabSession;
|
||
|
|
use Illuminate\Http\JsonResponse;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Support\Facades\Auth;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Surveillance d'examen (chantier « vrai cockpit », 2026-10-14) : le
|
||
|
|
* navigateur de l'élève signale un changement d'onglet ou une sortie du
|
||
|
|
* plein écran. Jamais de capture d'écran ni de webcam — juste un type et
|
||
|
|
* un horodatage (CLAUDE.md : minimisation).
|
||
|
|
*/
|
||
|
|
class EvenementExamenController extends Controller
|
||
|
|
{
|
||
|
|
public function store(Request $request, LabSession $labSession): JsonResponse
|
||
|
|
{
|
||
|
|
$eleve = Auth::guard('eleve')->user();
|
||
|
|
abort_if($labSession->eleve_id !== $eleve->id, 403);
|
||
|
|
|
||
|
|
$seance = $labSession->seance;
|
||
|
|
abort_unless($seance->mode_examen, 403);
|
||
|
|
|
||
|
|
$donnees = $request->validate([
|
||
|
|
'type' => ['required', 'in:'.implode(',', [EvenementExamen::CHANGEMENT_ONGLET, EvenementExamen::SORTIE_PLEIN_ECRAN])],
|
||
|
|
]);
|
||
|
|
|
||
|
|
$labSession->evenementsExamen()->create($donnees);
|
||
|
|
|
||
|
|
return response()->json([], 201);
|
||
|
|
}
|
||
|
|
}
|