Files
pathfinder/app/main/model/structuremodel.php
Mark Friedrich 627773e6bb - fixed comment
2018-07-20 23:25:27 +02:00

253 lines
7.4 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: exodu
* Date: 15.04.2018
* Time: 19:41
*/
namespace Model;
use DB\SQL\Schema;
class StructureModel extends BasicModel {
protected $table = 'structure';
/**
* categoryId (from ESI) that holds all "groups" with structure "types"
*/
const CATEGORY_STRUCTURE_ID = 65;
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' => 'Model\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' => 'Model\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' => ['Model\CorporationStructureModel', 'structureId']
]
];
/**
* 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){
$structureId = (int)$structureId;
return $structureId ? : null;
}
/**
* set corporationId (owner) for this structure
* -> if corporation does not exists in DB -> load from API
* @param $corporationId
* @return int|null
*/
public function set_corporationId($corporationId){
$oldCorporationId = $this->get('corporationId', true) ? : 0;
$corporationId = !is_string($corporationId) ? : (int)$corporationId;
if($corporationId){
if($corporationId !== $oldCorporationId){
// make sure there is already corporation data stored for new corporationId
/**
* @var CorporationModel $corporation
*/
$corporation = $this->rel('corporationId');
$corporation->getById($corporationId);
if($corporation->dry()){
$corporationId = null;
}
}
}else{
$corporationId = null;
}
return $corporationId;
}
/**
* validates systemId
* @param string $key
* @param string $val
* @return bool
*/
protected function validate_systemId(string $key, string $val): bool {
$valid = true;
if( !$this->dry() && $this->systemId !== (int)$val ){
// structure always belongs to the same system
$valid = false;
}
return $valid;
}
/**
* 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 BasicModel $self
* @param $pkeys
* @return bool
*/
public function beforeInsertEvent($self, $pkeys){
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;
}
public function getByName(CorporationModel $corporation, string $name, int $systemId) {
if( !$corporation->dry() && $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\BasicUniverseModel::getNew('TypeModel')->getById($structureId);
return $type->dry() ? (object)[] : $type->getData();
}
}