Exemplo n.º 1
0
/**
 * Renomme un élément et met à jour le serverPath de ses enfants dans le cas d'un dossier
 * $options est un tableau de booléens avec comme indexes possibles:
 * - returnImpactedElements à true pour retourner les éléments à modifier
 * - returnUpdatedElements à true pour retourner les éléments modifiés
 * On peut se retrouver avec la structure de retour suivante:
 *  array(
 *          'operationSuccess' => true ou false,
 *          'error' => 'message d'erreur',
 *          'impactedElements' => array(),
 *          'updatedElements' => array(),
 *          'failedToUpdate' => array()
 *  )
 * @author Alban Truc
 * @param string|MongoId $idElement
 * @param string|MongoId $idUser
 * @param string $newName
 * @param array $options
 * @return array
 */
function renameHandler($idElement, $idUser, $newName, $options = array())
{
    $idElement = new MongoId($idElement);
    $idUser = new MongoId($idUser);
    $impactedElements = array();
    $updatedElements = array();
    $failedToUpdate = array();
    $operationSuccess = FALSE;
    /*
     * 11 correspond au droit de lecture et écriture.
     * Si on souhaite accepter la copie avec des droits de plus bas niveau, il suffit d'ajouter les codes correspondant
     * au tableau en 3e paramètre ci-dessous.
     */
    $hasRight = actionAllowed($idElement, $idUser, array('11'));
    if (!is_array($hasRight)) {
        if ($hasRight === TRUE) {
            //récupère l'élément
            $elementManager = new ElementManager();
            $element = $elementManager->findById($idElement);
            if (!array_key_exists('error', $element)) {
                if ($element['state'] == 1) {
                    $criteria = array('state' => (int) 1, 'name' => $newName, 'serverPath' => $element['serverPath'], 'idOwner' => $idUser);
                    $elementsWithSameName = $elementManager->find($criteria);
                    if (is_array($elementsWithSameName) && array_key_exists('error', $elementsWithSameName)) {
                        if ($elementsWithSameName['error'] != 'No match found.') {
                            return $elementsWithSameName;
                        }
                    } else {
                        return array('error' => 'There is already an element with this name.');
                    }
                    //File Server -- 13/06/2014
                    $refElementManager = new RefElementManager();
                    $refElementFieldsToReturn = array('code' => TRUE, 'extension' => TRUE);
                    $refElement = $refElementManager->findById($element['idRefElement'], $refElementFieldsToReturn);
                    if (array_key_exists('error', $refElement)) {
                        return $refElement;
                    }
                    if (preg_match('/^4/', $refElement['code']) || preg_match('/^9/', $refElement['code'])) {
                        $oldCompleteName = $element['name'];
                        $newCompleteName = $newName;
                    } else {
                        $oldCompleteName = $element['name'] . $refElement['extension'];
                        $newCompleteName = $newName . $refElement['extension'];
                    }
                    $FSRenameResult = renameFSElement($idUser, $element['serverPath'], $oldCompleteName, $newCompleteName);
                    if (!is_bool($FSRenameResult) || $FSRenameResult != TRUE) {
                        return $FSRenameResult;
                    }
                    //Fin File Server
                    if ($refElement['code'] != '4002' && preg_match('/^4/', $refElement['code'])) {
                        $serverPath = $element['serverPath'] . $element['name'] . '/';
                        //récupération des éléments contenus dans le dossier
                        $seekElementsInFolder = array('state' => (int) 1, 'serverPath' => new MongoRegex("/^{$serverPath}/i"), 'idOwner' => $idUser);
                        $elementsInFolder = $elementManager->find($seekElementsInFolder);
                    }
                    if (isset($elementsInFolder) && !array_key_exists('error', $elementsInFolder)) {
                        $impactedElements = $elementsInFolder;
                    }
                    $impactedElements[] = $element;
                    $count = 0;
                    foreach ($impactedElements as $key => $impactedElement) {
                        $updateCriteria = array('_id' => $impactedElement['_id'], 'state' => (int) 1);
                        //préparation de la copie
                        $elementCopy = $impactedElement;
                        if (count($impactedElements) != $key + 1) {
                            $impactedElementPath = $impactedElement['serverPath'];
                            $newPath = preg_replace('/' . $element['name'] . '/i', $newName, $impactedElementPath);
                            $elementCopy['serverPath'] = $newPath;
                        } else {
                            $elementCopy['name'] = $newName;
                        }
                        //mise à jour
                        $updateResult = $elementManager->update($updateCriteria, $elementCopy);
                        //gestion des erreurs
                        if (!is_bool($updateResult)) {
                            $failedToUpdate[$count]['elementToUpdate'] = $impactedElement;
                            $failedToUpdate[$count]['elementUpdated'] = $elementCopy;
                            $failedToUpdate[$count]['error'] = $updateResult['error'];
                            $count++;
                        } elseif ($updateResult == TRUE) {
                            $updatedElements[] = $elementCopy;
                        }
                    }
                    $operationSuccess = TRUE;
                    return prepareRenameReturn($options, $operationSuccess, array(), $impactedElements, $updatedElements, $failedToUpdate);
                } else {
                    return prepareRenameReturn($options, $operationSuccess, array('error' => 'Element inactivated, nothing to do'), $impactedElements, $updatedElements, $failedToUpdate);
                }
            } else {
                return prepareRenameReturn($options, $operationSuccess, $element, $impactedElements, $updatedElements, $failedToUpdate);
            }
        } else {
            return prepareRenameReturn($options, $operationSuccess, array('error' => 'Access denied'), $impactedElements, $updatedElements, $failedToUpdate);
        }
    } else {
        return prepareRenameReturn($options, $operationSuccess, $hasRight, $impactedElements, $updatedElements, $failedToUpdate);
    }
}
Exemplo n.º 2
0
/**
 * Renomme un élément et met à jour le serverPath de ses enfants dans le cas d'un dossier
 * $options est un tableau de booléens avec comme indexes possibles:
 * - returnImpactedElements à true pour retourner les éléments à modifier
 * - returnUpdatedElements à true pour retourner les éléments modifiés
 * On peut se retrouver avec la structure de retour suivante:
 *  array(
 *          'operationSuccess' => true ou false,
 *          'error' => 'message d'erreur',
 *          'impactedElements' => array(),
 *          'updatedElements' => array(),
 *          'failedToUpdate' => array()
 *  )
 * @author Alban Truc
 * @param string|MongoId $idElement
 * @param string|MongoId $idUser
 * @param string $newName
 * @param array $options
 * @return array
 */
function renameHandler($idElement, $idUser, $newName, $options = array())
{
    $idElement = new MongoId($idElement);
    $idUser = new MongoId($idUser);
    $impactedElements = array();
    $updatedElements = array();
    $failedToUpdate = array();
    $operationSuccess = FALSE;
    /*
     * 11 correspond au droit de lecture et écriture.
     * Si on souhaite accepter la copie avec des droits de plus bas niveau, il suffit d'ajouter les codes correspondant
     * au tableau en 3e paramètre ci-dessous.
     */
    $hasRight = actionAllowed($idElement, $idUser, array('11'));
    if (!is_array($hasRight)) {
        if ($hasRight === TRUE) {
            //récupère l'élément
            $elementManager = new ElementManager();
            $element = $elementManager->findById($idElement);
            if (!array_key_exists('error', $element)) {
                if ($element['state'] == 1) {
                    $criteria = array('state' => (int) 1, 'name' => $newName, 'serverPath' => $element['serverPath'], 'idOwner' => $idUser);
                    $elementsWithSameName = $elementManager->find($criteria);
                    if (is_array($elementsWithSameName) && array_key_exists('error', $elementsWithSameName)) {
                        if ($elementsWithSameName['error'] != 'No match found.') {
                            return $elementsWithSameName;
                        }
                    }
                    //@todo rename sur le serveur de fichier et obtention du nouveau hash si l'élément est un dossier. Puis màj de ce hash
                    $isFolder = isFolder($element['idRefElement'], TRUE);
                    if (!is_array($isFolder)) {
                        if ($isFolder == TRUE) {
                            $serverPath = $element['serverPath'] . $element['name'] . '/';
                            //récupération des éléments contenus dans le dossier
                            $seekElementsInFolder = array('state' => (int) 1, 'serverPath' => new MongoRegex("/^{$serverPath}/i"), 'idOwner' => $idUser);
                            $elementsInFolder = $elementManager->find($seekElementsInFolder);
                        }
                        if (isset($elementsInFolder) && !array_key_exists('error', $elementsInFolder)) {
                            $impactedElements = $elementsInFolder;
                        }
                        $impactedElements[] = $element;
                        $count = 0;
                        foreach ($impactedElements as $key => $impactedElement) {
                            $updateCriteria = array('_id' => $impactedElement['_id'], 'state' => (int) 1);
                            //préparation de la copie
                            $elementCopy = $impactedElement;
                            if (count($impactedElements) != $key + 1) {
                                $impactedElementPath = $impactedElement['serverPath'];
                                $newPath = preg_replace('/' . $element['name'] . '/i', $newName, $impactedElementPath);
                                $elementCopy['serverPath'] = $newPath;
                            } else {
                                $elementCopy['name'] = $newName;
                            }
                            //mise à jour
                            $updateResult = $elementManager->update($updateCriteria, $elementCopy);
                            //gestion des erreurs
                            if (!is_bool($updateResult)) {
                                $failedToUpdate[$count]['elementToUpdate'] = $impactedElement;
                                $failedToUpdate[$count]['elementUpdated'] = $elementCopy;
                                $failedToUpdate[$count]['error'] = $updateResult['error'];
                                $count++;
                            } elseif ($updateResult == TRUE) {
                                $updatedElements[] = $elementCopy;
                            }
                        }
                        $operationSuccess = TRUE;
                        return prepareRenameReturn($options, $operationSuccess, array(), $impactedElements, $updatedElements, $failedToUpdate);
                    } else {
                        return prepareRenameReturn($options, $operationSuccess, $isFolder, $impactedElements, $updatedElements, $failedToUpdate);
                    }
                } else {
                    return prepareRenameReturn($options, $operationSuccess, array('error' => 'Element inactivated, nothing to do'), $impactedElements, $updatedElements, $failedToUpdate);
                }
            } else {
                return prepareRenameReturn($options, $operationSuccess, $element, $impactedElements, $updatedElements, $failedToUpdate);
            }
        } else {
            return prepareRenameReturn($options, $operationSuccess, array('error' => 'Access denied'), $impactedElements, $updatedElements, $failedToUpdate);
        }
    } else {
        return prepareRenameReturn($options, $operationSuccess, $hasRight, $impactedElements, $updatedElements, $failedToUpdate);
    }
}