/** * Rend un élément inaccessible (en BDD, ne comporte pas d'action sur le serveur de fichier). * @author Alban Truc * @param MongoId|string $idElement * @param MongoId|string $idUser * @param string $returnImpactedElements si 'TRUE', retourne les éléments impactés par l'action * @since 31/05/2014 * @return array|Element * @todo appel de la fonction qui fait diverses tâches (cf. documentation) sur le serveur de fichier */ function disableHandler($idElement, $idUser, $returnImpactedElements = 'false') { $idElement = new MongoId($idElement); $idUser = new MongoId($idUser); // 11 correspond au droit de lecture et écriture $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) { //récupère le code du refElement de notre élément $refElementManager = new RefElementManager(); $refElement = $refElementManager->findById($element['idRefElement'], array('code' => TRUE)); if (!array_key_exists('error', $refElement)) { //File Server -- 13/06/2014 if (preg_match('/^4/', $refElement['code']) || preg_match('/^9/', $refElement['code'])) { // dossier ou non reconnu, pas d'extension à rajouter $elementName = $element['name']; } else { $elementName = $element['name'] . $refElement['extension']; } $FSdisableResult = moveToTrash($idUser, $element['serverPath'], $elementName); if (!is_bool($FSdisableResult) || $FSdisableResult != TRUE) { return $FSdisableResult; } //-- Fin File Server //si le code commence par un 4 (les codes de dossier commencent par un 4) et n'est pas 4002 (dossier vide) if (preg_match('/^4/', $refElement['code']) && $refElement['code'] != '4002') { $serverPath = $element['serverPath'] . $element['name'] . '/'; //notre criteria inclut tous les éléments se trouvant dans le dossier et ses dossiers enfants $elementCriteria = array('state' => (int) 1, 'idOwner' => $idUser, '$or' => array(array('_id' => $idElement), array('serverPath' => new MongoRegex("/^{$serverPath}/i")))); } else { $elementCriteria = array('_id' => $idElement, 'state' => (int) 1); } //pour mettre à jour tous les documents et pas uniquement le premier répondant au critère $options = array('multiple' => TRUE); //désactivation de l'élément et suppression du lien de téléchargement $elementUpdate = array('$set' => array('state' => (int) 0, 'downloadLink' => '')); /* * obligatoirement à récupérer avant la mise à jour, sinon aucun document ne devrait être trouvé * en cas de réussite de cette mise à jour. On ne peut pas non plus faire le même critère avec à la * place un état de 0 parce qu'il se peut qu'il y ait déjà des éléments désactivés en base. * L'id est récupérer pour le critère de mise à jour des droits et le size pour la déduction du * stockage occupé par les éléments (mise à jour du storage du compte utilisateur). */ $impactedElements = $elementManager->find($elementCriteria, array('_id' => TRUE, 'size' => TRUE)); $elementUpdateResult = $elementManager->update($elementCriteria, $elementUpdate, $options); if (!is_array($elementUpdateResult)) { if ($elementUpdateResult === TRUE) { $updateFolderStatus = updateFolderStatus($element['serverPath'], $idUser); if (is_bool($updateFolderStatus) && $updateFolderStatus === TRUE) { //séparation en deux tableaux $idImpactedElements = array(); $sizeImpactedElements = array(); foreach ($impactedElements as $impactedElement) { //création d'un tableau contenant uniquement les id des éléments impactés if (isset($impactedElement['_id'])) { $idImpactedElements[]['idElementImpacted'] = $impactedElement['_id']; } //création d'un tableau contenant uniquement la taille de chaque élément impacté if (isset($impactedElement['size'])) { $sizeImpactedElements[] = $impactedElement['size']; } } //var_dump($idImpactedElements); //désactivation des droits sur ces éléments $rightUpdate = array('$set' => array('state' => (int) 0)); $rightManager = new RightManager(); foreach ($idImpactedElements as $id) { $rightCriteria = array('state' => (int) 1, 'idElement' => $id['idElementImpacted']); //l'opération n'étant pas bloquante, on ne se soucie pour l'instant pas d'un potentiel échec $rightManager->update($rightCriteria, $rightUpdate, $options); } //déduction du stockage occupé par ces éléments dans la collection account $totalSize = array_sum($sizeImpactedElements); //http://www.php.net/manual/function.array-sum.php //var_dump($totalSize); exit(); $accountManager = new AccountManager(); $accountCriteria = array('state' => (int) 1, 'idUser' => $idUser); $accountUpdate = array('$inc' => array('storage' => -$totalSize)); $accountUpdateResult = $accountManager->update($accountCriteria, $accountUpdate); if (!is_array($accountUpdateResult)) { if ($accountUpdateResult === TRUE) { if ($returnImpactedElements == 'true') { return $idImpactedElements; } else { return TRUE; } } else { return array('error' => 'Did not manage to update the storage value.'); } } else { return $accountUpdateResult; } } else { return $updateFolderStatus; } } else { return array('error' => 'Did not manage to update all elements. The elements that we couldn\'t updates are in this array at the index \'notUpdated\'', 'notUpdated' => $elementManager->find($elementCriteria, array('_id' => TRUE))); } } else { return $elementUpdateResult; } //message d'erreur } else { return $refElement; } //message d'erreur } else { return array('error' => 'Element already inactivated'); } } else { return $element; } //message d'erreur } else { return array('error' => 'Access denied'); } } else { return $hasRight; } }
/** * Partage (lecture ou lecture et écriture) d'un élément avec un autre utilisateur * @author Alban Truc * @param string|MongoId $idElement * @param string|MongoId $idOwner * @param string $recipientEmail * @param string $refRightCode * @param bool $sendMail * @since 12/06/2014 * @return array|bool */ function shareWithUser($idElement, $idOwner, $recipientEmail, $refRightCode, $sendMail = FALSE) { $idElement = new MongoId($idElement); $idOwner = new MongoId($idOwner); $elementManager = new ElementManager(); $elementCriteria = array('state' => (int) 1, '_id' => $idElement); $element = $elementManager->findOne($elementCriteria); if (is_array($element) && !array_key_exists('error', $element)) { /* * vérification que l'idOwner en param de la fonction est le même que celui de l'element, la gestion des partages * n'étant dans cette version qu'accessible au propriétaire de l'élément */ if ($idOwner == $element['idOwner']) { //vérification que l'email indiquée appartient bien à un utilisateur inscrit $userCriteria = array('state' => (int) 1, 'email' => $recipientEmail); $userManager = new UserManager(); $recipientUser = $userManager->findOne($userCriteria); if (is_array($recipientUser) && !array_key_exists('error', $recipientUser)) { if ($recipientUser['_id'] != $idOwner) { //récupérer l'id du refRight $refRightCriteria = array('state' => (int) 1, 'code' => $refRightCode); $refRightManager = new RefRightManager(); $refRight = $refRightManager->findOne($refRightCriteria, array('_id' => TRUE)); if (is_array($refRight) && !array_key_exists('error', $refRight)) { $rightList = array(); $refRightId = $refRight['_id']; $newRight = array('state' => (int) 1, 'idUser' => $recipientUser['_id'], 'idElement' => $idElement, 'idRefRight' => $refRightId); $rightList[] = $newRight; /* * vérification qu'il ne s'agit pas d'un dossier vide (inutile de chercher à copier le droit * pour d'éventuels contenus sinon) */ $isNonEmptyFolder = isFolder($element['idRefElement'], TRUE); if (is_bool($isNonEmptyFolder)) { if ($isNonEmptyFolder == TRUE) { //récupération des éléments contenus dans le dossier $folderPath = $element['serverPath'] . $element['name'] . '/'; $elementsInFolderCriteria = array('state' => 1, 'idOwner' => $idOwner, 'serverPath' => new MongoRegex("/^{$folderPath}/i")); $elementsInFolder = $elementManager->find($elementsInFolderCriteria); if (is_array($elementsInFolder) && !array_key_exists('error', $elementsInFolder)) { foreach ($elementsInFolder as $elementInFolder) { $rightCopy = $newRight; $rightCopy['idElement'] = $elementInFolder['_id']; $rightList[] = $rightCopy; } } else { return $elementsInFolder; } } } else { return $isNonEmptyFolder; } /* * Insertion ou mise à jour du droit en base. De fait cette fonction est utilisé pour la création * et la mise à jour de droit. */ $rightManager = new RightManager(); $rightCriteria = array('state' => (int) 1, 'idUser' => $recipientUser['_id']); $options = array('upsert' => TRUE); foreach ($rightList as $right) { $rightCriteria['idElement'] = $right['idElement']; $rightManager->update($rightCriteria, array('$set' => $right), $options); } return TRUE; //@todo envoyer un mail } else { return $refRight; } } else { return array('error' => 'You cannot share an element with yourself'); } } else { return $recipientUser; } } else { return array('error' => 'You are not the owner of this element, you cannot share it.'); } } else { return $element; } }