Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
CRAP | |
100.00% |
54 / 54 |
| UserRole | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
13 | |
100.00% |
54 / 54 |
| __get($name) | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
| __set($name, $value) | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
| setIsPublisher($status) | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| select(\Scrivo\Context $context, $user) | |
100.00% |
1 / 1 |
4 | |
100.00% |
19 / 19 |
|||
| set( \Scrivo\Context $context, \Scrivo\User $user, array $roles) | |
100.00% |
1 / 1 |
4 | |
100.00% |
22 / 22 |
|||
| <?php | |
| /* Copyright (c) 2012, Geert Bergman (geert@scrivo.nl) | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * 1. Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the following disclaimer. | |
| * 2. Redistributions in binary form must reproduce the above copyright notice, | |
| * this list of conditions and the following disclaimer in the documentation | |
| * and/or other materials provided with the distribution. | |
| * 3. Neither the name of "Scrivo" nor the names of its contributors may be | |
| * used to endorse or promote products derived from this software without | |
| * specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| * POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * $Id: UserRole.php 866 2013-08-25 16:22:35Z geert $ | |
| */ | |
| /** | |
| * Implementation of the \Scrivo\UserRole class. | |
| */ | |
| namespace Scrivo; | |
| /** | |
| * Class that represents a user-role relation. | |
| * | |
| * The User-Role relationship is a 0 to n relation of Scrivo users and Scrivo | |
| * roles. This relation can carry an additional entity: the publisher status. | |
| * This status is only relevant for editor roles and determines if an editor | |
| * is allowed to publish data in an staging environment. | |
| * | |
| * Note that both static methods are also exposed through the User::getRoles() | |
| * and User::assignRoles($roles) methods. This class should not be considered | |
| * part of the public API but as private to the User class. | |
| */ | |
| class UserRole extends \Scrivo\Role { | |
| /** | |
| * The publisher status. | |
| * @var boolean | |
| */ | |
| private $isPublisher; | |
| /** | |
| * Implementation of the readable properties using the PHP magic | |
| * method __get(). | |
| * | |
| * @param string $name The name of the property to get. | |
| * | |
| * @return mixed The value of the requested property. | |
| */ | |
| public function __get($name) { | |
| if ($name === "isPublisher") { | |
| return $this->isPublisher; | |
| } | |
| return parent::__get($name); | |
| } | |
| /** | |
| * Implementation of the writable properties using the PHP magic | |
| * method __set(). | |
| * | |
| * @param string $name The name of the property to set. | |
| * @param mixed $value The value of the property to set. | |
| */ | |
| public function __set($name, $value) { | |
| if ($name === "isPublisher") { | |
| $this->setIsPublisher($value); | |
| return; | |
| } | |
| parent::__set($name, $value); | |
| } | |
| /** | |
| * Set the publisher status for this user-role relation. | |
| * | |
| * @param boolean $status The publisher status. | |
| */ | |
| public function setIsPublisher($status) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
| array(\Scrivo\ArgumentCheck::TYPE_BOOLEAN) | |
| )); | |
| $this->isPublisher = $status; | |
| } | |
| /** | |
| * Select the user-roles for a given user. | |
| * | |
| * @param \Scrivo\Context $context A connection to a Scrivo database. | |
| * @param \Scrivo\User $user A user to create the user-roles for. | |
| * | |
| * @return \Scrivo\UserRole[roleId] An array containing the selected | |
| * user-roles. | |
| */ | |
| public static function select(\Scrivo\Context $context, $user) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array(null, null)); | |
| try { | |
| if (!$user instanceof \Scrivo\User) { | |
| throw new \Scrivo\SystemException("Invalid argument type"); | |
| } | |
| $sth = $context->connection->prepare( | |
| "SELECT R.role_id, R.type, R.title, R.description, | |
| UR.is_publisher FROM role R, user_role UR | |
| WHERE R.instance_id = :instId AND UR.instance_id = :instId | |
| AND R.role_id = UR.role_id AND UR.user_id = :userId"); | |
| $context->connection->bindInstance($sth); | |
| $sth->bindValue(":userId", | |
| \Scrivo\User::patchId($user->id), \PDO::PARAM_INT); | |
| $res = array(); | |
| $sth->execute(); | |
| while ($rd = $sth->fetch(\PDO::FETCH_ASSOC)) { | |
| $li = new UserRole(); | |
| $li->setFields($context, $rd); | |
| $li->isPublisher = $rd["is_publisher"] == 1; | |
| $res[$li->id] = $li; | |
| } | |
| return $res; | |
| } catch(\PDOException $e) { | |
| throw new \Scrivo\ResourceException($e); | |
| } | |
| } | |
| /** | |
| * Set the user roles for a given user. | |
| * | |
| * The user roles to set is either an array of UserRole or stdClass | |
| * objects. stdClass need to contain the members id and isPublisher. | |
| * | |
| * Note: this sets all the roles for the user at once. So not giving the | |
| * the roles effectivily clears the roles for the given user. | |
| * | |
| * @param \Scrivo\Context $context A connection to a Scrivo database. | |
| * @param \Scrivo\User $user A user to set the user-roles for. | |
| * @param \Scrivo\UserRole[]|object[] $roles A new set of user-roles for | |
| * the given user. | |
| */ | |
| public static function set( | |
| \Scrivo\Context $context, \Scrivo\User $user, array $roles) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
| null, null, null)); | |
| try { | |
| $sth = $context->connection->prepare( | |
| "DELETE FROM user_role WHERE | |
| instance_id = :instId AND user_id = :userId"); | |
| $context->connection->bindInstance($sth); | |
| $sth->bindValue(":userId", $user->id, \PDO::PARAM_INT); | |
| $sth->execute(); | |
| if ($roles) { | |
| $sth = $context->connection->prepare( | |
| "INSERT INTO user_role | |
| (instance_id, role_id, user_id, is_publisher) | |
| VALUES (:instId, :roleId, :userId, :publisher)"); | |
| $context->connection->bindInstance($sth); | |
| $sth->bindValue(":userId", $user->id, \PDO::PARAM_INT); | |
| foreach ($roles as $role) { | |
| $sth->bindValue(":roleId", $role->id, \PDO::PARAM_INT); | |
| $sth->bindValue(":publisher", | |
| (bool)$role->isPublisher, \PDO::PARAM_BOOL); | |
| $sth->execute(); | |
| } | |
| } | |
| } catch(\PDOException $e) { | |
| throw new \Scrivo\ResourceException($e); | |
| } | |
| } | |
| } | |