Crvi/app/controllers/Incident_Controller.php
2026-01-20 07:54:37 +01:00

197 lines
6.5 KiB
PHP

<?php
declare(strict_types=1);
namespace ESI_CRVI_AGENDA\controllers;
use ESI_CRVI_AGENDA\models\CRVI_Incident_Model;
use ESI_CRVI_AGENDA\helpers\Api_Helper;
class CRVI_Incident_Controller {
/**
* Enregistre les routes REST pour les incidents
*/
public static function register_routes() {
\register_rest_route('crvi/v1', '/incidents', [
[
'methods' => 'GET',
'callback' => [self::class, 'get_all_incidents'],
'permission_callback' => [self::class, 'can_view'],
],
[
'methods' => 'POST',
'callback' => [self::class, 'create_incident'],
'permission_callback' => [self::class, 'can_view'],
],
]);
\register_rest_route('crvi/v1', '/incidents/(?P<id>\\d+)', [
[
'methods' => 'GET',
'callback' => [self::class, 'get_incident'],
'permission_callback' => [self::class, 'can_view'],
],
]);
\register_rest_route('crvi/v1', '/events/(?P<event_id>\\d+)/incidents', [
[
'methods' => 'GET',
'callback' => [self::class, 'get_incidents_by_event'],
'permission_callback' => [self::class, 'can_view'],
],
]);
}
/**
* Récupérer tous les incidents
* @param \WP_REST_Request $request
* @return \WP_REST_Response|\WP_Error
*/
public static function get_all_incidents($request) {
// Récupérer les paramètres de pagination
$page = $request->get_param('page') ?? 1;
$per_page = $request->get_param('per_page') ?? 20;
$event_id = $request->get_param('event_id') ?? null;
$beneficiaire_id = $request->get_param('beneficiaire_id') ?? null;
// Construire les filtres
$filters = [];
if ($event_id) {
$filters['event_id'] = (int) $event_id;
}
if ($beneficiaire_id) {
$filters['beneficiaire_id'] = (int) $beneficiaire_id;
}
// Récupérer les incidents
$incidents = CRVI_Incident_Model::get_all($filters);
$result = [];
foreach ($incidents as $incident) {
$result[] = [
'id' => $incident->id,
'beneficiaire_id' => $incident->beneficiaire_id,
'event_id' => $incident->event_id,
'resume_incident' => $incident->resume_incident,
'commentaire_incident' => $incident->commentaire_incident,
'created_at' => $incident->created_at ?? null,
];
}
return Api_Helper::json_success($result);
}
/**
* Créer un incident
* @param \WP_REST_Request $request
* @return \WP_REST_Response|\WP_Error
*/
public static function create_incident($request) {
$data = $request->get_json_params();
// Validation des données
if (empty($data['event_id'])) {
return Api_Helper::json_error('L\'ID de l\'événement est requis', 400);
}
if (empty($data['beneficiaire_id'])) {
return Api_Helper::json_error('L\'ID du bénéficiaire est requis', 400);
}
if (empty($data['resume_incident'])) {
return Api_Helper::json_error('Le résumé de l\'incident est requis', 400);
}
// Vérifier que l'événement existe
$event = \ESI_CRVI_AGENDA\models\CRVI_Event_Model::load((int) $data['event_id']);
if (!$event) {
return Api_Helper::json_error('Événement introuvable', 404);
}
// Vérifier que le bénéficiaire existe
$beneficiaire = \ESI_CRVI_AGENDA\models\CRVI_Beneficiaire_Model::load((int) $data['beneficiaire_id']);
if (!$beneficiaire) {
return Api_Helper::json_error('Bénéficiaire introuvable', 404);
}
// Créer l'incident
$result = CRVI_Incident_Model::create($data);
if (is_wp_error($result)) {
return Api_Helper::json_error($result->get_error_message(), $result->get_error_data()['status'] ?? 500);
}
// Charger l'incident créé pour le retourner
$incident = CRVI_Incident_Model::load($result);
return Api_Helper::json_success([
'id' => $incident->id,
'beneficiaire_id' => $incident->beneficiaire_id,
'event_id' => $incident->event_id,
'resume_incident' => $incident->resume_incident,
'commentaire_incident' => $incident->commentaire_incident,
'message' => 'Incident créé avec succès'
]);
}
/**
* Récupérer un incident par ID
* @param \WP_REST_Request $request
* @return \WP_REST_Response|\WP_Error
*/
public static function get_incident($request) {
$id = (int) $request['id'];
$incident = CRVI_Incident_Model::load($id);
if (!$incident) {
return Api_Helper::json_error('Incident introuvable', 404);
}
return Api_Helper::json_success([
'id' => $incident->id,
'beneficiaire_id' => $incident->beneficiaire_id,
'event_id' => $incident->event_id,
'resume_incident' => $incident->resume_incident,
'commentaire_incident' => $incident->commentaire_incident,
]);
}
/**
* Récupérer tous les incidents pour un événement
* @param \WP_REST_Request $request
* @return \WP_REST_Response|\WP_Error
*/
public static function get_incidents_by_event($request) {
$event_id = (int) $request['event_id'];
if (!$event_id) {
return Api_Helper::json_error('ID de l\'événement requis', 400);
}
$incidents = CRVI_Incident_Model::get_by_event($event_id);
$result = [];
foreach ($incidents as $incident) {
$result[] = [
'id' => $incident->id,
'beneficiaire_id' => $incident->beneficiaire_id,
'event_id' => $incident->event_id,
'resume_incident' => $incident->resume_incident,
'commentaire_incident' => $incident->commentaire_incident,
];
}
return Api_Helper::json_success($result);
}
/**
* Vérifie si l'utilisateur peut voir les incidents
* @return bool
*/
public static function can_view() {
return current_user_can('read');
}
}