      1: <?php
      2: /**
      3:  * Copyright 2012-2014 Rackspace US, Inc.
      4:  *
      5:  * Licensed under the Apache License, Version 2.0 (the "License");
      6:  * you may not use this file except in compliance with the License.
      7:  * You may obtain a copy of the License at
      8:  *
      9:  * http://www.apache.org/licenses/LICENSE-2.0
     10:  *
     11:  * Unless required by applicable law or agreed to in writing, software
     12:  * distributed under the License is distributed on an "AS IS" BASIS,
     13:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14:  * See the License for the specific language governing permissions and
     15:  * limitations under the License.
     16:  */
     17:
     18: namespace OpenCloud\Database\Resource;
     19:
     20: use OpenCloud\Common\Exceptions;
     21: use OpenCloud\Common\Lang;
     22: use OpenCloud\Common\Resource\PersistentResource;
     23:
     24: /**
     25:  * This class represents a User in the Rackspace "Red Dwarf"
     26:  * database-as-a-service product.
     27:  */
     28: class User extends PersistentResource
     29: {
     30:     /** @var string The user name */
     31:     public $name;
     32:
     33:     /** @var string The user's password  */
     34:     public $password;
     35:
     36:     /** @var array A list of database names assigned to the user */
     37:     public $databases = array();
     38:
     39:     protected static $json_name = 'user';
     40:     protected static $url_resource = 'users';
     41:
     42:     /**
     43:      * Creates a new database object
     44:      *
     45:      * Unlike other objects (Servers, DataObjects, etc.), passing a database
     46:      * name to the constructor does *not* pull information from the database.
     47:      * For example, if you pass an ID to the `Server()` constructor, it will
     48:      * attempt to retrieve the information on that server from the service,
     49:      * and will return an error if it is not found. However, the Cloud
     50:      * Users service does not permit retrieval of information on
     51:      * individual databases (only via Collection), and thus passing in a
     52:      * name via the `$info` parameter only creates an in-memory object that
     53:      * is not necessarily tied to an actual database.
     54:      *
     55:      * @param Instance $instance the parent DbService\Instance of the database
     56:      * @param mixed    $info     if an array or object, treated as properties to set;
     57:      *                           if a string, treated as the database name
     58:      * @param array    $db       a list of database names to associate with the User
     59:      * @return void
     60:      * @throws UserNameError if `$info` is not a string, object, or array
     61:      */
     62:     public function __construct(Instance $instance, $info = null, $db = array())
     63:     {
     64:         $this->setParent($instance);
     65:
     66:         if (!empty($db)) {
     67:             $this->databases = $db;
     68:         }
     69:
     70:         // Lazy...
     71:         if (is_string($info)) {
     72:             $info = array('name' => $info);
     73:         }
     74:
     75:         return parent::__construct($instance->getService(), $info);
     76:     }
     77:
     78:     /**
     79:      * Returns name of this user. Because it's so important (i.e. as an
     80:      * identifier), it will throw an error if not set/empty.
     81:      *
     82:      * @return type
     83:      * @throws Exceptions\DatabaseNameError
     84:      */
     85:     public function getName()
     86:     {
     87:         if (empty($this->name)) {
     88:             throw new Exceptions\DatabaseNameError(
     89:                 Lang::translate('This user does not have a name yet')
     90:             );
     91:         }
     92:
     93:         return $this->name;
     94:     }
     95:
     96:     /**
     97:      * {@inheritDoc}
     98:      */
     99:     public function primaryKeyField()
    100:     {
    101:         return 'name';
    102:     }
    103:
    104:     /**
    105:      * Adds a new database to the list of databases for the user
    106:      *
    107:      * @api
    108:      * @param string $dbname the database name to be added
    109:      * @return void
    110:      */
    111:     public function addDatabase($dbname)
    112:     {
    113:         $this->databases[] = $dbname;
    114:     }
    115:
    116:     /**
    117:      * {@inheritDoc}
    118:      */
    119:     public function update($params = array())
    120:     {
    121:         return $this->noUpdate();
    122:     }
    123:
    124:     /**
    125:      * Deletes a database user
    126:      *
    127:      * @api
    128:      * @return \OpenCloud\HttpResponse
    129:      * @throws UserDeleteError if HTTP response is not Success
    130:      */
    131:     public function delete()
    132:     {
    133:         return $this->getClient()->delete($this->url())->send();
    134:     }
    135:
    136:     /**
    137:      * {@inheritDoc}
    138:      */
    139:     protected function createJson()
    140:     {
    141:         $user = (object) array(
    142:             'name'      => $this->name,
    143:             'password'  => $this->password,
    144:             'databases' => array()
    145:         );
    146:
    147:         foreach ($this->databases as $dbName) {
    148:             $user->databases[] = (object) array('name' => $dbName);
    149:         }
    150:
    151:         return (object) array(
    152:             'users' => array($user)
    153:         );
    154:     }
    155: }
    156: