feat(v3.0): implémentation Phases 0-8 — RBAC, lifecycle, multi-org, plans, dashboards

Phase 0 : @RolesAllowed SUPER_ADMIN sur POST/DELETE organisations ; AuthenticationFilter pages super-admin
Phase 2 : OrganisationModuleService, @RequiresModule, ModuleAccessFilter, RoleService, PermissionChecker
Phase 3 : multi-org context switching (OrganisationContextFilter, headers X-Active-Organisation-Id / X-Active-Role)
Phase 4 : feature-gating navigation par typeOrganisation (web MenuBean + mobile MorePage)
Phase 5 : MemberLifecycleService — 8 transitions (activer/suspendre/radier/archiver/inviter/accepter/expirer/rappels)
Phase 6 : FormuleAbonnement Option C (planCommercial, apiAccess, federationAccess, quotas) + SouscriptionOrganisation méthodes quota
Phase 7 : DashboardResource SUPER_ADMIN ajouté ; DashboardBean.checkAccessAndRedirect() ; dashboards distincts par rôle
Phase 8 : MembreResourceLifecycleRbacTest, SouscriptionQuotaOptionCTest, OrganisationContextHolderTest, OrganisationContextFilterMultiOrgTest, MemberLifecycleServiceTest
This commit is contained in:
dahoud
2026-04-06 16:49:47 +00:00
parent 39e98a9cb3
commit aef5548e87
34 changed files with 823 additions and 86 deletions

View File

@@ -4,6 +4,7 @@ import dev.lions.unionflow.server.api.dto.ong.ProjetOngDTO;
import dev.lions.unionflow.server.api.enums.ong.StatutProjetOng;
import dev.lions.unionflow.server.service.ong.ProjetOngService;
import dev.lions.unionflow.server.security.RequiresModule;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.validation.Valid;
@@ -17,13 +18,14 @@ import java.util.UUID;
@Path("/api/v1/ong/projets")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RequiresModule("PROJETS_ONG")
public class ProjetOngResource {
@Inject
ProjetOngService projetOngService;
@POST
@RolesAllowed({ "admin", "admin_organisation", "ong_resp" })
@RolesAllowed({ "ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION", "ONG_RESP" })
public Response creerProjet(@Valid ProjetOngDTO dto) {
ProjetOngDTO response = projetOngService.creerProjet(dto);
return Response.status(Response.Status.CREATED).entity(response).build();
@@ -31,7 +33,7 @@ public class ProjetOngResource {
@GET
@Path("/{id}")
@RolesAllowed({ "admin", "admin_organisation", "membre_actif" })
@RolesAllowed({ "ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION", "MEMBRE", "USER" })
public Response getProjetById(@PathParam("id") UUID id) {
ProjetOngDTO response = projetOngService.getProjetById(id);
return Response.ok(response).build();
@@ -39,7 +41,7 @@ public class ProjetOngResource {
@GET
@Path("/ong/{organisationId}")
@RolesAllowed({ "admin", "admin_organisation", "ong_resp" })
@RolesAllowed({ "ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION", "ONG_RESP" })
public Response getProjetsByOng(@PathParam("organisationId") UUID organisationId) {
List<ProjetOngDTO> response = projetOngService.getProjetsByOng(organisationId);
return Response.ok(response).build();
@@ -47,7 +49,7 @@ public class ProjetOngResource {
@PATCH
@Path("/{id}/statut")
@RolesAllowed({ "admin", "admin_organisation", "ong_resp" })
@RolesAllowed({ "ADMIN", "SUPER_ADMIN", "ADMIN_ORGANISATION", "ONG_RESP" })
public Response changerStatut(@PathParam("id") UUID id, @QueryParam("statut") StatutProjetOng statut) {
if (statut == null) {
return Response.status(Response.Status.BAD_REQUEST).entity("Le statut est requis").build();