blob: ccb93775e8804fc1bbd46ea1ad4ed5d293ed9f4e [file] [log] [blame]
#!/usr/bin/env php
<?php
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* Allows CRUD operations on Usergrid Entities, including Users.
*
* @author Daniel Johnson <djohnson@apigee.com>
* @author Rod Simpson <rod@apigee.com>
* @since 26-Apr-2013
*/
namespace Apache\Usergrid;
class Entity {
private $client;
private $data;
private $json;
public function __construct(Client $client, $data = array(), $json_data='') {
$this->client = $client;
$this->data = $data;
$this->json_data = $json_data;
}
public function get_json() {
return $this->json;
}
public function set_json($json) {
$this->json = $json;
}
public function get($field = NULL) {
if (!empty($field)) {
return (isset($this->data[$field]) ? $this->data[$field] : NULL);
}
return $this->data;
}
public function set($key, $value = NULL) {
if (is_array($key)) {
foreach ($key as $field => $value) {
$this->data[$field] = $value;
}
}
elseif (is_string($key)) {
if (!isset($value)) {
if (isset($this->data[$key])) {
unset($this->data[$key]);
}
}
else {
$this->data[$key] = $value;
}
}
else {
$this->data = array();
}
}
public function save() {
$type = $this->get('type');
$method = 'POST';
$uuid = $this->get('uuid');
if (isset($uuid) && Client::is_uuid($uuid)) {
$method = 'PUT';
$type .= "/$uuid";
}
$data = array();
$entity_data = $this->get();
foreach ($entity_data as $key => $val) {
switch ($key) {
case 'metadata':
case 'created':
case 'modified':
case 'type':
case 'activated':
case 'uuid':
continue;
break;
default:
$data[$key] = $val;
}
}
if ($method == 'PUT') {
$response = $this->client->put($type, array(), $data);
}
else {
$response = $this->client->post($type, array(), $data);
}
$this->set_json($response->get_json());
if ($response->get_error()) {
$this->client->write_log('Could not save entity.');
}
else {
$response_data = $response->get_data();
if (!empty($response_data['entities'])) {
$this->set($response_data['entities'][0]);
}
$need_password_change = (
($this->get('type') == 'user' || $this->get('type') == 'users')
&& !empty($entity_data['oldpassword'])
&& !empty($entity_data['newpassword'])
);
if ($need_password_change) {
$pw_data = array(
'oldpassword' => $entity_data['oldpassword'],
'newpassword' => $entity_data['newpassword']
);
$response = $this->client->PUT("$type/password", array(), $pw_data);
if ($response->get_error()) {
$this->client->write_log('Could not update user\'s password.');
}
$this->set('oldpassword', NULL);
$this->set('newpassword', NULL);
}
}
return $response;
}
public function fetch() {
$response = new Response();
$type = $this->get('type');
$uuid = $this->get('uuid'); // may be NULL
if (!empty($uuid)) {
$type .= "/$uuid";
}
else {
if ($type == 'user' || $type == 'users') {
$username = $this->get('username');
if (!empty($username)) {
$type .= "/$username";
}
else {
$error = 'no_name_specified';
$this->client->write_log($error);
$response->set_error($error);
$response->set_error_code($error);
return $response;
}
}
else {
$name = $this->get('name');
if (!empty($name)) {
$type .= "/$name";
}
else {
$error = 'no_name_specified';
$this->client->write_log($error);
$response->set_error($error);
$response->set_error_code($error);
return $response;
}
}
}
$response = $this->client->get($type, array());
$this->set_json($response->get_json());
if ($response->get_error()) {
$this->client->write_log('Could not get entity.');
}
else {
$data = $response->get_data();
if (isset($data['user'])) {
$this->set($data['user']);
}
elseif (!empty($data['entities'])) {
$this->set($data['entities'][0]);
}
}
return $response;
}
public function destroy() {
$response = new Response();
$type = $this->get('type');
$uuid = $this->get('uuid');
if (Client::is_uuid($uuid)) {
$type .= "/$uuid";
}
else {
$error = 'Error trying to delete object: No UUID specified.';
$this->client->write_log($error);
$response->set_error($error);
$response->set_error_code($error);
return $response;
}
$response = $this->client->delete($type, array());
$this->set_json($response->get_json());
if ($response->get_error()) {
$this->client->write_log('Entity could not be deleted.');
}
else {
$this->set(NULL);
}
return $response;
}
public function connect($connection, $entity) {
$connectee=Entity::get_entity_id($entity);
$connecteeType=$entity->get("type");
if(!$connectee){
return "Error in connect. No UUID specified for connectee";
}
$connector=Entity::get_entity_id($this);
$connectorType=$this->get("type");
if(!$connector){
return "Error in connect. No UUID specified for connector";
}
$endpoint = $connectorType.'/'.$connector.'/'.$connection.'/'.$connecteeType.'/'.$connectee;
$result=$this->client->post($endpoint, array(), array());
$error=$result->get_error();
if($error){
return $result->get_error_message();
}else{
return $result->get_data();
}
}
public function disconnect($connection, $entity) {
$connectee=Entity::get_entity_id($entity);
$connecteeType=$entity->get("type");
if(!$connectee){
return "Error in disconnect. No UUID specified for connectee";
}
$connector=Entity::get_entity_id($this);
$connectorType=$this->get("type");
if(!$connector){
return "Error in disconnect. No UUID specified for connector";
}
$endpoint = $connectorType.'/'.$connector.'/'.$connection.'/'.$connecteeType.'/'.$connectee;
$result=$this->client->delete($endpoint, array(), array());
$error=$result->get_error();
if($error){
return $result->get_error_message();
}else{
return $result->get_data();
}
}
public static function get_entity_id($entity) {
$id = false;
if (Client::is_uuid($entity->get('uuid'))) {
$id = $entity->get('uuid');
} else {
if ($type == 'users') {
$id = $entity->get('username');
} else if ($entity->get('name')) {
$id = $entity->get('name');
}
}
return $id;
}
public function get_connections($connection) {
$connectorType = $this->get('type');
$connector = Entity::get_entity_id($this);
if (!$connector) {
return;
}
$endpoint = $connectorType . '/' . $connector . '/' . $connection . '/';
$result=$this->client->get($endpoint, array());
$connected_entities = array();
$response_data = $result->get_data();
$length = count($response_data['entities']);
for ($i = 0; $i < $length; $i++) {
$tmp_entity = $response_data['entities'][$i];
if ($tmp_entity['type'] == 'user') {
$connected_entities[$tmp_entity['username']] = $tmp_entity;
} else {
$connected_entities[$tmp_entity['name']] = $tmp_entity;
}
}
$this->set($connection, $connected_entities);
}
public function get_connecting($connection) {
$connectorType = $this->get('type');
$connector = Entity::get_entity_id($this);
if (!$connector) {
return;
}
$endpoint = $connectorType. '/' . $connector . '/connecting/' . $connection . '/';
$result=$this->client->get($endpoint, array());
return $result->get_data();
}
}