package dev.lions.unionflow.server.resource; import dev.lions.unionflow.server.api.dto.backup.request.CreateBackupRequest; import dev.lions.unionflow.server.api.dto.backup.request.RestoreBackupRequest; import dev.lions.unionflow.server.api.dto.backup.request.UpdateBackupConfigRequest; import dev.lions.unionflow.server.api.dto.backup.response.BackupConfigResponse; import dev.lions.unionflow.server.api.dto.backup.response.BackupResponse; import dev.lions.unionflow.server.service.BackupService; import jakarta.annotation.security.RolesAllowed; import jakarta.inject.Inject; import jakarta.validation.Valid; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import java.util.List; import java.util.UUID; /** * REST Resource pour la gestion des sauvegardes système */ @Slf4j @Path("/api/backups") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Tag(name = "Sauvegardes", description = "Gestion des sauvegardes et restaurations") public class BackupResource { @Inject BackupService backupService; /** * Lister toutes les sauvegardes */ @GET @RolesAllowed({"SUPER_ADMIN", "ADMIN", "MODERATEUR"}) @Operation(summary = "Lister toutes les sauvegardes disponibles") public List getAllBackups() { log.info("GET /api/backups"); return backupService.getAllBackups(); } /** * Récupérer une sauvegarde par ID */ @GET @Path("/{id}") @RolesAllowed({"SUPER_ADMIN", "ADMIN", "MODERATEUR"}) @Operation(summary = "Récupérer une sauvegarde par ID") public BackupResponse getBackupById(@PathParam("id") UUID id) { log.info("GET /api/backups/{}", id); return backupService.getBackupById(id); } /** * Créer une nouvelle sauvegarde */ @POST @RolesAllowed({"SUPER_ADMIN", "ADMIN"}) @Operation(summary = "Créer une nouvelle sauvegarde") public Response createBackup(@Valid CreateBackupRequest request) { log.info("POST /api/backups - {}", request.getName()); BackupResponse backup = backupService.createBackup(request); return Response.status(Response.Status.CREATED).entity(backup).build(); } /** * Restaurer une sauvegarde */ @POST @Path("/restore") @RolesAllowed({"SUPER_ADMIN", "ADMIN"}) @Operation(summary = "Restaurer une sauvegarde") public Response restoreBackup(@Valid RestoreBackupRequest request) { log.info("POST /api/backups/restore - backupId={}", request.getBackupId()); backupService.restoreBackup(request); return Response.ok().entity(java.util.Map.of("message", "Restauration en cours")).build(); } /** * Supprimer une sauvegarde */ @DELETE @Path("/{id}") @RolesAllowed({"SUPER_ADMIN", "ADMIN"}) @Operation(summary = "Supprimer une sauvegarde") public Response deleteBackup(@PathParam("id") UUID id) { log.info("DELETE /api/backups/{}", id); backupService.deleteBackup(id); return Response.ok().entity(java.util.Map.of("message", "Sauvegarde supprimée avec succès")).build(); } /** * Récupérer la configuration des sauvegardes automatiques */ @GET @Path("/config") @RolesAllowed({"SUPER_ADMIN", "ADMIN", "MODERATEUR"}) @Operation(summary = "Récupérer la configuration des sauvegardes automatiques") public BackupConfigResponse getBackupConfig() { log.info("GET /api/backups/config"); return backupService.getBackupConfig(); } /** * Mettre à jour la configuration des sauvegardes automatiques */ @PUT @Path("/config") @RolesAllowed({"SUPER_ADMIN", "ADMIN"}) @Operation(summary = "Mettre à jour la configuration des sauvegardes automatiques") public BackupConfigResponse updateBackupConfig(@Valid UpdateBackupConfigRequest request) { log.info("PUT /api/backups/config"); return backupService.updateBackupConfig(request); } /** * Créer un point de restauration */ @POST @Path("/restore-point") @RolesAllowed({"SUPER_ADMIN", "ADMIN"}) @Operation(summary = "Créer un point de restauration") public Response createRestorePoint() { log.info("POST /api/backups/restore-point"); BackupResponse backup = backupService.createRestorePoint(); return Response.status(Response.Status.CREATED).entity(backup).build(); } }