/** * Indique si l'utilisateur donné a les droits voulus sur l'élément donné * @author Alban Truc * @param MongoId|string $idUser * @param MongoId|string $idElement * @param string $refRightCode * @param string $returnRights * @since 15/05/2014 * @return bool */ public function hasRightOnElement($idUser, $idElement, $refRightCode, $returnRights = 'FALSE') { //récupérer l'id du refRight à partir du code $refRightManager = new RefRightManager(); $refRightCriteria = array('state' => (int) 1, 'code' => (string) $refRightCode); $refRight = $refRightManager->findOne($refRightCriteria); //récupérer le droit $rightCriteria = array('state' => (int) 1, 'idUser' => new MongoId($idUser), 'idElement' => new MongoId($idElement), 'idRefRigt' => $refRight['_id']); $right = self::find($rightCriteria); if (!array_key_exists('error', $right)) { return TRUE; } else { return FALSE; } }
/** * 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; } }
/** * Retourne le droit, le refRight, l'élément, le refElement et le propriétaire * @author Alban Truc * @param string|MongoId $idUser * @param string $path emplacement sur le serveur des éléments * @param NULL|string $elementName nom de l'élément * @since 01/05/2014 * @return array */ public function returnSharedElementsDetails($idUser, $path = 'all', $elementName = NULL) { $idUser = new MongoId($idUser); $criteria = array('state' => (int) 1, 'idUser' => $idUser); //récupération des droits sur les éléments $rightManager = new RightManager(); $rights = $rightManager->find($criteria); $userManager = new UserManager(); $refRightManager = new RefRightManager(); $refElementManager = new RefElementManager(); if (is_array($rights) && !array_key_exists('error', $rights)) { foreach ($rights as $key => $right) { $owner = NULL; $refRight = NULL; //Récupération de l'élément. On enlève le droit de la liste si l'élément n'est pas disponible $elementCriteria = array('_id' => new MongoId($right['idElement']), 'state' => (int) 1); if ($path != 'all') { $elementCriteria['serverPath'] = $path; } if ($elementName != NULL) { $elementCriteria['name'] = $elementName; } unset($right['idElement']); $element = self::findOne($elementCriteria); if (is_array($element) && !array_key_exists('error', $element)) { $idOwner = $element['idOwner']; unset($element['idOwner']); //récupération du refElement. On enlève le droit de la liste si le refElement n'est pas trouvé $refElement = $refElementManager->findById($element['idRefElement']); unset($element['idRefElement']); if (is_array($refElement) && !array_key_exists('error', $refElement)) { $element['refElement'] = $refElement; $right['element'] = $element; } else { unset($rights[$key]); continue; } } else { unset($rights[$key]); continue; } /* * Récupération de l'utilisateur propriétaire. * Si son état n'est pas à 1, le droit n'aurait pas du être à 1; donc on enlève ce droit de la liste. */ $userCriteria = array('_id' => new MongoId($idOwner), 'state' => (int) 1); $fieldsToReturn = array('firstName' => 1, 'lastName' => 1); unset($right['idUser']); $owner = $userManager->findOne($userCriteria, $fieldsToReturn); if (is_array($owner) && !array_key_exists('error', $owner)) { $right['owner'] = $owner; } else { unset($rights[$key]); continue; } //Récupération du refRight. S'il n'existe pas on enlève ce droit de la liste. $refRight = $refRightManager->findById($right['idRefRight']); unset($right['idRefRight']); if (is_array($refRight) && !array_key_exists('error', $refRight)) { $right['refRight'] = $refRight; } else { unset($rights[$key]); continue; } $rights[$key] = $right; } if (empty($rights)) { return array('error' => 'No match found.'); } } return $rights; }