diff --git a/server/SHServ/Entities/Area.php b/server/SHServ/Entities/Area.php index 0cfde84..458fd20 100644 --- a/server/SHServ/Entities/Area.php +++ b/server/SHServ/Entities/Area.php @@ -5,25 +5,46 @@ use \SHServ\Entities\Device; class Area extends \SHServ\Middleware\Entity { + + use \SHServ\Helpers\MetaImplementation; + public static $table_name = "areas"; protected static $fields = [ "id", "alias", "display_name", "type", "parent_id", "schema", "create_at", "update_at" ]; - public function get_parent(): Area | null { - if(!$this -> parent_id) { + public function __construct(int $entity_id, array $data = []) { + return parent::__construct( + self::$table_name, + $entity_id, + $data + ); + } + + public function get_parent_id(): Int { + return $this -> parent_id; + } + + public function parent_area(): Area | null { + if(!$this -> get_parent_id()) { return null; } - return new Area($this -> parent_id); + return new Area($this -> get_parent_id()); } - public function get_inner_areas(): Array { + public function get_inner_areas(Bool $recursive = false): Array { + $area_ids = [ $this -> id() ]; + + if($recursive) { + $area_ids = array_merge($area_ids, $this -> get_recursive_inner_areas_ids($this -> id())); + } + $raw_areas = app() -> thin_builder -> select( self::$table_name, self::get_fields(), - [[ "parent_id", "=", $this -> id() ]] + [[ "parent_id", "IN", $area_ids ]] ); if(!$raw_areas) { @@ -36,20 +57,30 @@ $areas[] = new Area($raw_area["id"], $raw_area); } - return $area; + return $areas; } - public function place_in_area(int $area_id): Array | bool { + public function place_in_area(Area $parent_area): Array | bool { + return $this -> place_in_area_by_id($parent_area -> id()); + } + + public function place_in_area_by_id(int $area_id): Array | bool { $this -> parent_id = $area_id; return $this -> update(); } - public function get_areas_by_type(String $type): Array { + public function get_areas_by_type(String $type, Bool $recursive = false): Array { + $area_ids = [ $this -> id() ]; + + if($recursive) { + $area_ids = array_merge($area_ids, $this -> get_recursive_inner_areas_ids($this -> id())); + } + $raw_areas = app() -> thin_builder -> select( self::$table_name, self::get_fields(), [ - [ "parent_id", "=", $this -> id() ], + [ "parent_id", "IN", $area_ids ], "AND", [ "type", "=", $type ] ] @@ -65,15 +96,21 @@ $areas[] = new Area($raw_area["id"], $raw_area); } - return $area; + return $areas; } - public function get_area_by_alias(): Area | null { + public function get_area_by_alias(String $alias, Bool $recursive = false): Area | null { + $area_ids = [ $this -> id() ]; + + if($recursive) { + $area_ids = array_merge($area_ids, $this -> get_recursive_inner_areas_ids($this -> id())); + } + $raw_areas = app() -> thin_builder -> select( self::$table_name, self::get_fields(), [ - [ "parent_id", "=", $this -> id() ], + [ "parent_id", "IN", $area_ids], "AND", [ "alias", "=", $alias ] ], @@ -88,11 +125,48 @@ return new Area($raw_areas[0]["id"], $raw_areas[0]); } - public function get_inner_devices(): Array { + protected function get_recursive_inner_areas_ids(Int $parent_id, Int $lvl = 0) { + if($lvl >= 10) { + return []; + } + + $lvl++; + + $areas = app() -> thin_builder -> select( + Area::$table_name, + ["id", "parent_id"], + [["parent_id", "=", $parent_id]] + ); + + $result = []; + + if(!$areas) { + return $result; + } + + foreach($areas as $area) { + $result[] = $area["id"]; + $result_next_lvl = $this -> get_recursive_inner_areas_ids($area["id"], $lvl); + + if($result_next_lvl) { + $result = array_merge($result, $result_next_lvl); + } + } + + return $result; + } + + public function get_inner_devices(Bool $recursive = false): Array { + $area_ids = [ $this -> id() ]; + + if($recursive) { + $area_ids = array_merge($area_ids, $this -> get_recursive_inner_areas_ids($this -> id())); + } + $raw_devices = app() -> thin_builder -> select( Device::$table_name, Device::get_fields(), - [["area_id", "=", $this -> id()]] + [["area_id", "IN", $area_ids]] ); if(!$raw_devices) { @@ -107,12 +181,18 @@ return $devices; } - public function get_device_by_alias(string $alias): Device | null { + public function get_device_by_alias(String $alias, Bool $recursive = false): Device | null { + $area_ids = [ $this -> id() ]; + + if($recursive) { + $area_ids = array_merge($area_ids, $this -> get_recursive_inner_areas_ids($this -> id())); + } + $raw_devices = app() -> thin_builder -> select( Device::$table_name, Device::get_fields(), [ - [ "area_id", "=", $this -> id() ], + [ "area_id", "IN", $area_ids ], "AND", [ "alias", "=", $alias ] ], @@ -128,14 +208,20 @@ return new Device($raw_device["id"], $raw_device); } - public function get_devices_by_type(string $type): Array { + public function get_devices_by_type(String $type, Bool $recursive = false): Array { + $area_ids = [ $this -> id() ]; + + if($recursive) { + $area_ids = array_merge($area_ids, $this -> get_recursive_inner_areas_ids($this -> id())); + } + $raw_devices = app() -> thin_builder -> select( Device::$table_name, Device::get_fields(), [ - [ "area_id", "=", $this -> id() ], - "=", - [ "type", "=", $type ] + [ "area_id", "IN", $area_ids ], + "AND", + [ "device_type", "=", $type ] ] ); @@ -150,4 +236,28 @@ return $devices; } + + public function remove(): Bool { + $result = app() -> thin_builder -> update( + Device::$table_name, + ["area_id" => 0], + [[ "area_id", "=", $this -> id() ]] + ); + + if(!$result) { + return false; + } + + $result = app() -> thin_builder -> update( + self::$table_name, + ["parent_id" => 0], + [[ "parent_id", "=", $this -> id() ]] + ); + + if(!$result) { + return false; + } + + return true; + } } \ No newline at end of file diff --git a/server/SHServ/Entities/Device.php b/server/SHServ/Entities/Device.php index 566e84a..1cee023 100644 --- a/server/SHServ/Entities/Device.php +++ b/server/SHServ/Entities/Device.php @@ -89,12 +89,16 @@ return $this -> auth() -> update(); } - public function place_in_area(int $area_id): bool { + public function place_in_area(Area $area): bool { + return $this -> place_in_area_id($area -> id()); + } + + public function place_in_area_id(int $area_id): bool { $this -> area_id = $area_id; return $this -> update() ? true : false; } - public function get_parent_area(): Area | null { + public function parent_area(): Area | null { if(!$this -> area_id) { return null; } diff --git a/server/SHServ/Models/Areas.php b/server/SHServ/Models/Areas.php index 85a9ebe..5ee0cf1 100644 --- a/server/SHServ/Models/Areas.php +++ b/server/SHServ/Models/Areas.php @@ -5,21 +5,21 @@ use \SHServ\Entities\Area; class Areas extends \SHServ\Middleware\Model { - public function create_new_area(String $type, String $alias, String $display_name): Area | bool { + public function create_new_area(String $type, String $alias, String $display_name): Area | null { + if(!$this -> alias_is_uniq($alias)) { + return null; + } + $area_id = app() -> thin_builder -> insert(Area::$table_name, [ "alias" => $alias, - "display_name" => $name, - "type" => $device_info["data"]["device_type"], + "display_name" => $display_name, + "type" => $type, "schema" => "", "parent_id" => "0", "create_at" => date("Y-m-d H:i:s") ]); - $area = $area_id ? new Area($area_id) : null; - - if(!$area) { - return false; - } + return $area_id ? new Area($area_id) : null; } public function alias_is_uniq(String $alias): bool { @@ -77,14 +77,10 @@ $raw_area = app() -> thin_builder -> select( Area::$table_name, Area::get_fields(), - [[ "type", "=", $type ]], + [[ "alias", "=", $alias ]], [], "DESC", [ 1 ] ); - if(!$raw_area) { - return null; - } - - return new Area($raw_area["id"], $raw_area); + return $raw_area ? new Area($raw_area[0]["id"], $raw_area[0]) : null; } } \ No newline at end of file