Commit 97089da4 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Option de purge dans le connecteur personne pour supprimer les roles retirés de la source

parent 91fc7672
Loading
Loading
Loading
Loading
+1 −11
Changes for install/demo/persons.json: 1 added line, 11 removed lines.
Original line number Diff line number Diff line
@@ -10,17 +10,7 @@

    }
  },
  {
    "uid": "normanosborn",
    "firstname": "Norman",
    "lastname": "Osborn",
    "schelude": "half35",
    "dateupdated": "2019-06-10",
    "mail": "g.goblin@oscorp.com",
    "roles": {
      "OSCORP": ["Directeur de laboratoire"]
    }
  },

  {
    "firstname": "Cet enregistrement sera ignoré, pas d'UID",
    "lastname": "",
+1 −1
Changes for module/Oscar/config/module.config.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -586,7 +586,7 @@ return array(
                ],
                'oscar_persons_sync' => [
                    'options' => array(
                        'route' => 'oscar persons:sync <connectorkey> [-f|--force] [-v|--verbose]',
                        'route' => 'oscar persons:sync <connectorkey> [-f|--force] [-v|--verbose] [-p|--purge]',
                        'defaults' => array(
                            'controller' => 'Console',
                            'action' => 'personsSync',
+27 −17
Changes for module/Oscar/src/Oscar/Connector/ConnectorPersonHydrator.php: 27 added lines, 17 removed lines.
Original line number Diff line number Diff line
@@ -89,6 +89,15 @@ class ConnectorPersonHydrator
        return $this->repport;
    }

    public function setPurge( $boolean ){
        $this->purge = $boolean;
    }

    public function getPurge(){
        return $this->purge;
    }


    /**
     * @return bool
     */
@@ -133,14 +142,6 @@ class ConnectorPersonHydrator
                }
            }
        }
        if( $syncRoles ){
           // print_r($syncRoles);
            // Purge des rôles supprimés
            foreach ($syncRoles as $code=>$roles){
                echo " - $personOscar : ". implode(",", $roles) . " dans $code \n";
            }
        }


        if (property_exists($personData, 'roles')) {

@@ -156,11 +157,11 @@ class ConnectorPersonHydrator
                            if( array_key_exists($organizationCode, $syncRoles) ){
                                if( in_array($roleId, $syncRoles[$organizationCode]) ){
                                    array_splice($syncRoles[$organizationCode], array_search($roleId, $syncRoles[$organizationCode]), 1);

                                }
                            }
                            if (array_key_exists($roleId, $rolesOscar)) {
                                if (!$organization->hasPerson($personOscar,
                                    $roleId)) {
                                if (!$organization->hasPerson($personOscar, $roleId)) {
                                    $roleOscar = new OrganizationPerson();
                                    $this->entityManager->persist($roleOscar);
                                    $roleOscar->setPerson($personOscar)
@@ -168,8 +169,7 @@ class ConnectorPersonHydrator
                                        ->setOrigin($connectorName)
                                        ->setRoleObj($rolesOscar[$roleId]);
                                    $personOscar->getOrganizations()->add($roleOscar);
                                    $this->repport->addupdated(sprintf("%s a le role '%s' dans %s",
                                        $personOscar, $roleId, $organization));
                                    $this->repport->addupdated(sprintf("Ajout du rôle '%s' dans '%s' pour '%s' ", $roleId, $organization, $personOscar));
                                }
                            } else {
                                $this->repport->addwarning(sprintf("Le role '%s' n'a pas été ajouté à '%s' dans '%s' car il est absent de Oscar",
@@ -192,17 +192,27 @@ class ConnectorPersonHydrator

        // Purge des rôles supprimés
        foreach ($syncRoles as $code=>$roles){
            if( count($syncRoles[$code])<0 ){
                continue;
            }

            /** @var OrganizationPerson $organizationPerson */
            foreach ($personOscar->getOrganizations() as $organizationPerson) {
                if( $organizationPerson->getOrigin() == $connectorName &&
                    $organizationPerson->getOrganization()->getCode() == $code &&
                    in_array($organizationperson->getRoleObj()->getRoleId(), $roles)) {
                        $this->repport->addremoved(sprintf("Suppression du rôle %s de %s dans %s", $organizationPerson->getRole(), $organizationPerson->getPerson(), $organizationPerson->getOrganization()));
                        //$this->entityManager->remove($organizationPerson);
                $roleId = $organizationPerson->getRole();
                $codeOrg = $organizationPerson->getOrganization()->getCode();
                if( $codeOrg == $code ){
                    if( in_array($roleId, $syncRoles[$code]) ){
                        if( $this->getPurge() ){
                            $this->entityManager->remove($organizationPerson);
                            $this->repport->addremoved(sprintf("Suppression du rôle %s pour %s dans %s.", $roleId, $personOscar, $organizationPerson->getOrganization()));
                        } else {
                            $this->repport->addwarning(sprintf("Suppression du rôle %s pour %s dans %s dans la source (activer la purge pour le supprimer).", $roleId, $personOscar, $organizationPerson->getOrganization()));
                        }
                    }
                }
            }
        }


        return $personOscar;
    }
+3 −0
Changes for module/Oscar/src/Oscar/Connector/ConnectorPersonJSON.php: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ class ConnectorPersonJSON implements ConnectorInterface
            $repport->addRepport($this->connectorPersonHydrator->getRepport());

            if( $this->connectorPersonHydrator->isSuspect() ){
                $repport->addwarning("Données suspectes pour $person");

                continue;
            }

@@ -84,6 +86,7 @@ class ConnectorPersonJSON implements ConnectorInterface
                $repport->adderror($message . " a échoué : " . $e->getMessage());
            }
        }
        $this->flush();
        return $repport;
    }

+52 −3
Changes for module/Oscar/src/Oscar/Connector/ConnectorPersonREST.php: 52 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
namespace Oscar\Connector;


use Doctrine\DBAL\Exception\ConstraintViolationException;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Monolog\Logger;
@@ -28,6 +29,7 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
    use ServiceLocatorAwareTrait, ConnectorParametersTrait;

    private $editable = false;
    private $options;

    /** @var  ConnectorPersonHydrator */
    private $personHydrator = null;
@@ -69,6 +71,7 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
    {
        $this->setServiceLocator($sm);
        $this->loadParameters($configFilePath);
        $this->options = [];
    }


@@ -88,6 +91,7 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
            $this->personHydrator = new ConnectorPersonHydrator(
                $this->getServiceLocator()->get('Doctrine\ORM\EntityManager')
            );
            $this->personHydrator->setPurge($this->getOptionPurge());
        }
        return $this->personHydrator;
    }
@@ -100,7 +104,12 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
     */
    function syncPersons(PersonRepository $personRepository, $force)
    {
        if( $this->getOptionPurge() ){
            $exist = $personRepository->getUidsConnector($this->getName());
        }

        $repport = new ConnectorRepport();
        $this->getPersonHydrator()->setPurge($this->getOptionPurge());

        $url = $this->getParameter('url_persons');

@@ -140,7 +149,7 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
            if( !is_array($personsDatas) ){
                throw new \Exception("L'API n'a pas retourné un tableau de donnée");
            }
            $repport->addnotice(count($personsDatas). " a traiter.");
            $repport->addnotice(count($personsDatas). " résultat(s) a traiter.");
            ////////////////////////////////////

            foreach( $personsDatas as $personData ){
@@ -150,6 +159,13 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
                    continue;
                }

                if( $this->getOptionPurge() ){
                    $uid = $personData->uid;
                    if( ($index = array_search($uid, $exist)) >= 0 ){
                        array_splice($exist, $index, 1);
                    }
                }

                try {
                    /** @var Person $personOscar */
                    $personOscar = $personRepository->getPersonByConnectorID($this->getName(),
@@ -171,9 +187,7 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
                {
                    $personOscar = $this->getPersonHydrator()->hydratePerson($personOscar, $personData, $this->getName());

                    if( $this->getPersonHydrator()->isSuspect() ){
                    $repport->addRepport($this->getPersonHydrator()->getRepport());
                    }

                    $personRepository->flush($personOscar);

@@ -186,10 +200,25 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf
                    $repport->addnotice(sprintf("%s est à jour.", $personOscar->log()));
                }
            }

            if( $this->getOptionPurge() ){
                foreach ($exist as $uid){
                    $personOscarToDelete = $personRepository->getPersonByConnectorID($this->getName(), $uid);
                    try {
                        // todo Gérer les suppression
                        // $personRepository->removePerson($personOscarToDelete);
                        $repport->addremoved("Suppression (non implémentée) de $personOscarToDelete");
                    } catch (\Exception $e){
                        $repport->addwarning("$personOscarToDelete n'a pas été supprimé car il est actif dans les activités : " . $e->getMessage());
                    }
                }
            }
        } catch (\Exception $e ){
            throw new \Exception("Impossible de synchroniser les personnes : " . $e->getMessage());
        }

        $personRepository->flush(null);

        return $repport;
    }

@@ -227,6 +256,26 @@ class ConnectorPersonREST implements IConnectorPerson, ServiceLocatorAwareInterf

    }

    public function setOption($optionName, $optionValue){
        $this->options[$optionName] = $optionValue;
    }

    public function getOption($optionName, $defaultValue=null){
        if( array_key_exists($optionName, $this->options) ){
            return $this->options[$optionName];
        }
        return $defaultValue;
    }

    public function getOptionPurge(){
        return $this->getOption('purge', false);
    }

    public function setOptionPurge( $boolean ){
        return $this->setOption('purge', $boolean);
    }


    /**
     * @return Logger
     */
Loading