| Numéro du ticket | Titre du ticket | |------------------|-----------------| | | | ## Description de la PR ## Modification du .env ## Check list - [x] Pas de régression - [x] TU/TI/TF rédigée - [x] TU/TI/TF OK - [ ] CHANGELOG modifié Co-authored-by: Matthieu <mtholot19@gmail.com> Reviewed-on: #8 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #8.
This commit is contained in:
37
src/Shared/Domain/Contract/SiteAwareInterface.php
Normal file
37
src/Shared/Domain/Contract/SiteAwareInterface.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Domain\Contract;
|
||||
|
||||
/**
|
||||
* Contrat opt-in pour les entites dont la visibilite est scopee par site.
|
||||
*
|
||||
* Une entite implementant cette interface sera :
|
||||
* - filtree en lecture par SiteScopedQueryExtension (collection + item)
|
||||
* selon le site courant de l'utilisateur authentifie ;
|
||||
* - alimentee automatiquement en POST/PATCH par SiteAwareInjectionProcessor
|
||||
* si le payload ne precise pas de site.
|
||||
*
|
||||
* L'implementation concrete doit :
|
||||
* - Declarer une relation ManyToOne vers l'entite concrete Site avec colonne
|
||||
* `site_id` NOT NULL (targetEntity: \App\Module\Sites\Domain\Entity\Site).
|
||||
* - Indexer `site_id` en base (sinon le filtre WHERE genere un full-scan).
|
||||
*
|
||||
* Les signatures utilisent SiteInterface (et non la classe concrete Site)
|
||||
* pour que Shared n'importe pas directement le module Sites.
|
||||
*
|
||||
* Ne PAS implementer cette interface pour :
|
||||
* - Des entites globales (catalogue partage, roles, permissions, users).
|
||||
* - Des entites dont le scope est "par tenant" plus large que le site
|
||||
* (utiliser TenantAwareInterface le cas echeant).
|
||||
* - Des entites transversales references par plusieurs sites.
|
||||
*
|
||||
* Voir `docs/modules/site-aware.md` pour le guide d'adoption complet.
|
||||
*/
|
||||
interface SiteAwareInterface
|
||||
{
|
||||
public function getSite(): ?SiteInterface;
|
||||
|
||||
public function setSite(SiteInterface $site): void;
|
||||
}
|
||||
20
src/Shared/Domain/Contract/SiteInterface.php
Normal file
20
src/Shared/Domain/Contract/SiteInterface.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Domain\Contract;
|
||||
|
||||
/**
|
||||
* Interface minimale exposant ce que le noyau (Shared/Core) doit connaitre
|
||||
* d'un Site, sans creer de couplage direct vers le module Sites.
|
||||
*
|
||||
* Implemente par App\Module\Sites\Domain\Entity\Site.
|
||||
* Utilisee comme type-hint dans SiteAwareInterface, User et toute entite
|
||||
* Shared/Core qui manipule un site sans avoir besoin des details metier.
|
||||
*/
|
||||
interface SiteInterface
|
||||
{
|
||||
public function getId(): ?int;
|
||||
|
||||
public function getName(): ?string;
|
||||
}
|
||||
31
src/Shared/Domain/Exception/SiteNotAuthorizedException.php
Normal file
31
src/Shared/Domain/Exception/SiteNotAuthorizedException.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Domain\Exception;
|
||||
|
||||
use App\Shared\Domain\Contract\SiteInterface;
|
||||
use DomainException;
|
||||
|
||||
/**
|
||||
* Levee lorsqu'un utilisateur tente de selectionner comme site courant un
|
||||
* site qui ne fait pas partie de ses sites autorises.
|
||||
*
|
||||
* Exception purement domaine : la traduction HTTP (403) est faite par le
|
||||
* CurrentSiteProcessor via try/catch, aligne sur le pattern
|
||||
* SystemRoleDeletionException du module Core.
|
||||
*
|
||||
* Deplacee dans Shared/Domain/Exception/ pour eviter que le module Core
|
||||
* n'importe directement depuis le module Sites (violation du principe de
|
||||
* non-couplage inter-modules).
|
||||
*/
|
||||
class SiteNotAuthorizedException extends DomainException
|
||||
{
|
||||
public static function forSite(SiteInterface $site): self
|
||||
{
|
||||
return new self(sprintf(
|
||||
'Le site "%s" ne fait pas partie de vos sites autorises.',
|
||||
$site->getName(),
|
||||
));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user