197 lines
6.5 KiB
PHP
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');
|
|
}
|
|
}
|
|
|