- added some new tables (for SDE replacement), #628 - new "index build" functions added to `/setup`, #628 - updated "Cortex" PHP ORM lib `1.5.0` -> `1.6.0-dev`
252 lines
7.4 KiB
PHP
252 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 CCP´s SDE) 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) {
|
||
if( !$corporation->dry() && $name){
|
||
$this->has('structureCorporations', ['corporationId = :corporationId', ':corporationId' => $corporation->_id]);
|
||
$this->load(['name = :name AND active = :active',
|
||
':name' => $name,
|
||
':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();
|
||
}
|
||
|
||
} |