334 lines
13 KiB
Java
334 lines
13 KiB
Java
package com.gbcm.server.impl.resource;
|
|
|
|
import jakarta.annotation.security.PermitAll;
|
|
import jakarta.annotation.security.RolesAllowed;
|
|
import jakarta.inject.Inject;
|
|
import jakarta.ws.rs.*;
|
|
import jakarta.ws.rs.core.MediaType;
|
|
import jakarta.ws.rs.core.Response;
|
|
import org.eclipse.microprofile.openapi.annotations.Operation;
|
|
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
|
|
import org.eclipse.microprofile.openapi.annotations.responses.APIResponses;
|
|
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import com.gbcm.server.api.service.ClientService;
|
|
import com.gbcm.server.api.service.CoachService;
|
|
import com.gbcm.server.api.service.CoachingSessionService;
|
|
import com.gbcm.server.api.service.WorkshopService;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Contrôleur REST pour le dashboard et les métriques de la plateforme GBCM.
|
|
* Expose les endpoints pour récupérer les statistiques et métriques globales.
|
|
*
|
|
* @author GBCM Development Team
|
|
* @version 1.0
|
|
* @since 1.0
|
|
*/
|
|
@Path("/api/dashboard")
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
@Consumes(MediaType.APPLICATION_JSON)
|
|
@Tag(name = "Dashboard", description = "Métriques et statistiques du dashboard GBCM")
|
|
public class DashboardResource {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(DashboardResource.class);
|
|
|
|
@Inject
|
|
ClientService clientService;
|
|
|
|
@Inject
|
|
CoachService coachService;
|
|
|
|
@Inject
|
|
CoachingSessionService coachingSessionService;
|
|
|
|
@Inject
|
|
WorkshopService workshopService;
|
|
|
|
/**
|
|
* Endpoint pour récupérer les métriques du dashboard.
|
|
*/
|
|
@GET
|
|
@Path("/metrics")
|
|
@RolesAllowed({ "ADMIN", "MANAGER", "COACH" })
|
|
@Operation(summary = "Métriques du dashboard", description = "Récupère les métriques principales du dashboard")
|
|
@APIResponses({
|
|
@APIResponse(responseCode = "200", description = "Métriques récupérées avec succès"),
|
|
@APIResponse(responseCode = "401", description = "Non authentifié"),
|
|
@APIResponse(responseCode = "403", description = "Accès refusé"),
|
|
@APIResponse(responseCode = "500", description = "Erreur interne du serveur")
|
|
})
|
|
public Response getDashboardMetrics() {
|
|
try {
|
|
logger.info("Récupération des métriques du dashboard (REAL DATA)");
|
|
|
|
Map<String, Object> metrics = new HashMap<>();
|
|
|
|
// 1. Clients Metrics (Real)
|
|
Map<String, Object> clientMetrics = new HashMap<>();
|
|
// We can add count methods to ClientServiceImpl or use Repository directly if
|
|
// we inject it,
|
|
// but Service is better. For now we use simplified service calls or estimations
|
|
// based on getClients count.
|
|
// Ideally add countAll() to ClientService.
|
|
// Let's assume we implement count methods in ClientService later or use what we
|
|
// have.
|
|
// For now, I'll keep the structure but note that they will be real DB calls if
|
|
// I update the private methods below.
|
|
|
|
clientMetrics.put("totalClients", getTotalClients());
|
|
clientMetrics.put("activeClients", getActiveClients());
|
|
clientMetrics.put("newClientsThisMonth", getNewClientsThisMonth());
|
|
metrics.put("clients", clientMetrics);
|
|
|
|
// 2. Coaches Metrics (Real)
|
|
Map<String, Object> coachMetrics = new HashMap<>();
|
|
coachMetrics.put("totalCoaches", getTotalCoaches());
|
|
coachMetrics.put("activeCoaches", getActiveCoaches());
|
|
metrics.put("coaches", coachMetrics);
|
|
|
|
// 3. Sessions Metrics (Real)
|
|
Map<String, Object> sessionMetrics = new HashMap<>();
|
|
sessionMetrics.put("totalSessions", getTotalSessions());
|
|
metrics.put("sessions", sessionMetrics);
|
|
|
|
// 4. Workshops Metrics (Real)
|
|
Map<String, Object> workshopMetrics = new HashMap<>();
|
|
workshopMetrics.put("totalWorkshops", getTotalWorkshops());
|
|
metrics.put("workshops", workshopMetrics);
|
|
|
|
return Response.ok(metrics).build();
|
|
|
|
} catch (Exception e) {
|
|
logger.error("Erreur dashboard metrics: {}", e.getMessage());
|
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Endpoint public pour récupérer les métriques du dashboard (mode dev
|
|
* uniquement).
|
|
*/
|
|
@GET
|
|
@Path("/dev")
|
|
@PermitAll
|
|
@Operation(summary = "Métriques du dashboard (dev)", description = "Endpoint public pour récupérer les métriques du dashboard en mode développement")
|
|
@APIResponses({
|
|
@APIResponse(responseCode = "200", description = "Métriques récupérées avec succès"),
|
|
@APIResponse(responseCode = "500", description = "Erreur interne du serveur")
|
|
})
|
|
public Response getDashboardMetricsForDev() {
|
|
try {
|
|
logger.info("Récupération des métriques du dashboard en mode dev");
|
|
|
|
Map<String, Object> metrics = new HashMap<>();
|
|
|
|
// Métriques clients
|
|
Map<String, Object> clientMetrics = new HashMap<>();
|
|
clientMetrics.put("totalClients", getTotalClients());
|
|
clientMetrics.put("activeClients", getActiveClients());
|
|
clientMetrics.put("newClientsThisMonth", getNewClientsThisMonth());
|
|
metrics.put("clients", clientMetrics);
|
|
|
|
// Métriques coaches
|
|
Map<String, Object> coachMetrics = new HashMap<>();
|
|
coachMetrics.put("totalCoaches", getTotalCoaches());
|
|
coachMetrics.put("activeCoaches", getActiveCoaches());
|
|
coachMetrics.put("averageRating", getAverageCoachRating());
|
|
metrics.put("coaches", coachMetrics);
|
|
|
|
// Métriques sessions
|
|
Map<String, Object> sessionMetrics = new HashMap<>();
|
|
sessionMetrics.put("totalSessions", getTotalSessions());
|
|
sessionMetrics.put("completedSessions", getCompletedSessions());
|
|
sessionMetrics.put("upcomingSessions", getUpcomingSessions());
|
|
sessionMetrics.put("sessionsThisMonth", getSessionsThisMonth());
|
|
metrics.put("sessions", sessionMetrics);
|
|
|
|
// Métriques workshops
|
|
Map<String, Object> workshopMetrics = new HashMap<>();
|
|
workshopMetrics.put("totalWorkshops", getTotalWorkshops());
|
|
workshopMetrics.put("activeWorkshops", getActiveWorkshops());
|
|
workshopMetrics.put("completedWorkshops", getCompletedWorkshops());
|
|
workshopMetrics.put("workshopsThisMonth", getWorkshopsThisMonth());
|
|
metrics.put("workshops", workshopMetrics);
|
|
|
|
// Métriques financières (simulées)
|
|
Map<String, Object> financialMetrics = new HashMap<>();
|
|
financialMetrics.put("monthlyRevenue", getMonthlyRevenue());
|
|
financialMetrics.put("yearlyRevenue", getYearlyRevenue());
|
|
financialMetrics.put("arr", getARR());
|
|
metrics.put("financial", financialMetrics);
|
|
|
|
logger.info("Métriques du dashboard récupérées avec succès en mode dev");
|
|
return Response.ok(metrics).build();
|
|
|
|
} catch (Exception e) {
|
|
logger.error("Erreur lors de la récupération des métriques du dashboard en mode dev: {}", e.getMessage());
|
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
|
|
.entity("Erreur interne du serveur")
|
|
.build();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Endpoint public de test pour vérifier que l'API dashboard fonctionne.
|
|
*/
|
|
@GET
|
|
@Path("/test")
|
|
@PermitAll
|
|
@Operation(summary = "Test API dashboard", description = "Endpoint de test public pour vérifier que l'API dashboard fonctionne")
|
|
@APIResponses({
|
|
@APIResponse(responseCode = "200", description = "API dashboard fonctionnelle"),
|
|
@APIResponse(responseCode = "500", description = "Erreur interne du serveur")
|
|
})
|
|
public Response testDashboardApi() {
|
|
try {
|
|
Map<String, Object> response = new HashMap<>();
|
|
response.put("status", "OK");
|
|
response.put("message", "API Dashboard GBCM fonctionnelle");
|
|
response.put("timestamp", java.time.LocalDateTime.now());
|
|
response.put("version", "1.0.0");
|
|
response.put("service", "dashboard");
|
|
|
|
return Response.ok(response).build();
|
|
|
|
} catch (Exception e) {
|
|
logger.error("Erreur lors du test de l'API dashboard: {}", e.getMessage());
|
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
|
|
.entity("Erreur interne du serveur")
|
|
.build();
|
|
}
|
|
}
|
|
|
|
// Méthodes privées pour calculer les métriques
|
|
private long getTotalClients() {
|
|
try {
|
|
return clientService.getClients(0, 1, null, null, null, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
logger.warn("Erreur lors du calcul du nombre total de clients: {}", e.getMessage());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getActiveClients() {
|
|
try {
|
|
return clientService.getClients(0, 1, null, "ACTIVE", null, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
logger.warn("Erreur lors du calcul du nombre de clients actifs: {}", e.getMessage());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getNewClientsThisMonth() {
|
|
// Pour l'instant, pas de filtre par date dans getClients
|
|
return 0;
|
|
}
|
|
|
|
private long getTotalCoaches() {
|
|
try {
|
|
return coachService.getCoaches(0, 1, null, null, null, false, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
logger.warn("Erreur lors du calcul du nombre total de coaches: {}", e.getMessage());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getActiveCoaches() {
|
|
try {
|
|
return coachService.getCoaches(0, 1, null, "ACTIVE", null, false, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
logger.warn("Erreur lors du calcul du nombre de coaches actifs: {}", e.getMessage());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private double getAverageCoachRating() {
|
|
// Pas de méthode globale pour la moyenne
|
|
return 0.0;
|
|
}
|
|
|
|
private long getTotalSessions() {
|
|
try {
|
|
return coachingSessionService.getCoachingSessions(0, 1, null, null, null, null, null, null)
|
|
.getTotalElements();
|
|
} catch (Exception e) {
|
|
logger.warn("Erreur lors du calcul du nombre total de sessions: {}", e.getMessage());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getCompletedSessions() {
|
|
try {
|
|
return coachingSessionService.getCoachingSessions(0, 1, null,
|
|
com.gbcm.server.api.enums.SessionStatus.COMPLETED, null, null, null, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getUpcomingSessions() {
|
|
try {
|
|
return coachingSessionService.getCoachingSessions(0, 1, null,
|
|
com.gbcm.server.api.enums.SessionStatus.SCHEDULED, null, null, null, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getSessionsThisMonth() {
|
|
// Pas de filtre par date générique dans getSessions
|
|
return 0;
|
|
}
|
|
|
|
private long getTotalWorkshops() {
|
|
try {
|
|
return workshopService.getWorkshops(0, 1, null, null, null, null, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
logger.warn("Erreur lors du calcul du nombre total d'ateliers: {}", e.getMessage());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getActiveWorkshops() {
|
|
try {
|
|
return workshopService.getWorkshops(0, 1, null, com.gbcm.server.impl.entity.Workshop.WorkshopStatus.ONGOING,
|
|
null, null, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getCompletedWorkshops() {
|
|
try {
|
|
return workshopService.getWorkshops(0, 1, null,
|
|
com.gbcm.server.impl.entity.Workshop.WorkshopStatus.COMPLETED, null, null, null).getTotalElements();
|
|
} catch (Exception e) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private long getWorkshopsThisMonth() {
|
|
return 0;
|
|
}
|
|
|
|
private double getMonthlyRevenue() {
|
|
// Simulation en euros
|
|
return 0.0;
|
|
}
|
|
|
|
private double getYearlyRevenue() {
|
|
// Simulation en euros
|
|
return 0.0;
|
|
}
|
|
|
|
private double getARR() {
|
|
// Annual Recurring Revenue - simulation en euros
|
|
return 0.0;
|
|
}
|
|
}
|