Files
pathfinder/app/Model/Pathfinder/StructureModel.php
Mark Friedrich 647bd7db58 - BC Break: _PHP_ namespaces changed (PSR-4 standard). The _root_ namespace for all _PF_ related scripts is Exodus4D\Pathfinder
- BC Break: Project folder structure changed. Removed `app/main` dir.
- BC Break: Core _PHP_ framework + dependencies moved into `composer.json` and are no longer part of this repo
2019-12-15 22:27:17 +01:00

262 lines
7.9 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: Exodus 4D
* Date: 15.04.2018
* Time: 19:41
*/
namespace Exodus4D\Pathfinder\Model\Pathfinder;
use DB\SQL\Schema;
use Exodus4D\Pathfinder\Model\Universe;
class StructureModel extends AbstractPathfinderModel {
/**
* @var string
*/
protected $table = 'structure';
/**
* @var array
*/
protected $fieldConf = [
'active' => [
'type' => Schema::DT_BOOL,
'nullable' => false,
'default' => 1,
'index' => true
],
'structureId' => [
'type' => Schema::DT_INT,
'index' => true
],
'corporationId' => [
'type' => Schema::DT_INT,
'index' => true,
'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CorporationModel',
'constraint' => [
[
'table' => 'corporation',
'on-delete' => 'SET NULL'
]
]
],
'systemId' => [
'type' => Schema::DT_INT,
'index' => true,
'validate' => true
],
'statusId' => [
'type' => Schema::DT_INT,
'default' => 1,
'index' => true,
'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\StructureStatusModel',
'constraint' => [
[
'table' => 'structure_status',
'on-delete' => 'SET NULL'
]
]
],
'name' => [
'type' => Schema::DT_VARCHAR128,
'nullable' => false,
'default' => ''
],
'description' => [
'type' => Schema::DT_VARCHAR512,
'nullable' => false,
'default' => ''
],
'structureCorporations' => [
'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationStructureModel', 'structureId']
]
];
/**
* set data by associative array
* @param array $data
*/
public function setData(array $data){
$this->copyfrom($data, ['structureId', 'corporationId', 'systemId', 'statusId', 'name', 'description']);
}
/**
* get structure data
* @return \stdClass
* @throws \Exception
*/
public function getData() : \stdClass {
$structureData = (object) [];
$structureData->id = $this->_id;
$structureData->systemId = $this->systemId;
$structureData->status = $this->statusId->getData();
$structureData->name = $this->name;
$structureData->description = $this->description;
if($this->structureId){
$structureData->structure = $this->getUniverseTypeData($this->structureId);
}
if($this->corporationId){
$structureData->owner = (object) [];
$structureData->owner->id = $this->corporationId->_id;
$structureData->owner->name = $this->corporationId->name;
}
$structureData->updated = (object) [];
$structureData->updated->updated = strtotime($this->updated);
return $structureData;
}
/**
* set structureId (universeType) for this structure
* @param $structureId
* @return int|null
*/
public function set_structureId($structureId) : ?int {
$structureId = (int)$structureId;
return $structureId ? : null;
}
/**
* set corporationId (owner) for this structure
* -> if corporation does not exists in DB -> load from API
* @param int|null $corporationId
* @return int|null
*/
public function set_corporationId(?int $corporationId) : ?int {
$oldCorporationId = $this->get('corporationId', true) ? : 0;
if($corporationId){
if($corporationId !== $oldCorporationId){
// make sure there is already corporation data available for new corporationId
// -> $ttl = 0 is important! Otherwise "bulk" update for structures could fail
/**
* @var CorporationModel $corporation
*/
$corporation = $this->rel('corporationId');
$corporation->getById($corporationId, 0);
if($corporation->dry()){
$corporationId = null;
}
}
}else{
$corporationId = null;
}
return $corporationId;
}
/**
* validates systemId
* -> a structure always belongs to the same system
* @param string $key
* @param string $val
* @return bool
*/
protected function validate_systemId(string $key, string $val) : bool {
return !($this->valid() && $this->systemId !== (int)$val);
}
/**
* check whether this model is valid or not
* @return bool
*/
public function isValid() : bool {
if($valid = parent::isValid()){
// structure always belongs to a systemId
if(!(int)$this->systemId){
$valid = false;
}
}
return $valid;
}
/**
* Event "Hook" function
* can be overwritten
* return false will stop any further action
* @param self $self
* @param $pkeys
* @return bool
*/
public function beforeInsertEvent($self, $pkeys) : bool {
return $this->isValid() ? parent::beforeInsertEvent($self, $pkeys) : false;
}
/**
* check access by chraacter
* @param CharacterModel $characterModel
* @return bool
*/
public function hasAccess(CharacterModel $characterModel) : bool {
$access = false;
if($characterModel->hasCorporation()){
$this->filter('structureCorporations', ['active = ?', 1]);
$this->has('structureCorporations.corporationId', ['active = ?', 1]);
$this->has('structureCorporations.corporationId', ['id = ?', $characterModel->get('corporationId', true)]);
if($this->structureCorporations){
$access = true;
}
}
return $access;
}
/**
* get structure data grouped by corporations
* @return array
* @throws \Exception
*/
public function getDataByCorporations() : array {
$structuresData = [];
foreach((array)$this->structureCorporations as $structureCorporation){
if($structureCorporation->isActive() && $structureCorporation->corporationId->isActive()){
$structuresData[$structureCorporation->corporationId->_id] = [
'id' => $structureCorporation->corporationId->_id,
'name' => $structureCorporation->corporationId->name,
'structures' => [$this->getData()]
];
}
}
return $structuresData;
}
/**
* load structure by $corporation, $name and $systemId
* @param CorporationModel $corporation
* @param string $name
* @param int $systemId
*/
public function getByName(CorporationModel $corporation, string $name, int $systemId){
if($corporation->valid() && $name){
$this->has('structureCorporations', ['corporationId = :corporationId', ':corporationId' => $corporation->_id]);
$this->load(['name = :name AND systemId = :systemId AND active = :active',
':name' => $name,
':systemId' => $systemId,
':active' => 1
]);
}
}
/**
* get universe type data for structureId
* @param int $structureId
* @return \stdClass
* @throws \Exception
*/
protected function getUniverseTypeData(int $structureId) : \stdClass {
/**
* @var $type Universe\TypeModel
*/
$type = Universe\AbstractUniverseModel::getNew('TypeModel');
$type->getById($structureId);
return $type->dry() ? (object)[] : $type->getData();
}
}