2024-01-04 10:12:47 +01:00
|
|
|
<?php
|
|
|
|
App::uses('AppModel', 'Model');
|
2024-01-24 21:48:53 +01:00
|
|
|
App::uses('AnalystData', 'Model');
|
2024-01-04 10:12:47 +01:00
|
|
|
class Relationship extends AnalystData
|
|
|
|
{
|
|
|
|
|
|
|
|
public $recursive = -1;
|
|
|
|
|
|
|
|
public $actsAs = array(
|
2024-02-13 14:37:00 +01:00
|
|
|
'AuditLog',
|
|
|
|
'Containable',
|
|
|
|
'AnalystData',
|
2024-01-04 10:12:47 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
public $current_type = 'Relationship';
|
2024-01-24 21:48:53 +01:00
|
|
|
public $current_type_id = 2;
|
2024-01-04 10:12:47 +01:00
|
|
|
|
2024-02-22 08:32:47 +01:00
|
|
|
protected $EDITABLE_FIELDS = [
|
|
|
|
'relationship_type',
|
|
|
|
];
|
|
|
|
|
|
|
|
public $validate = [];
|
2024-01-25 20:01:04 +01:00
|
|
|
|
|
|
|
/** @var object|null */
|
|
|
|
protected $Event;
|
|
|
|
/** @var object|null */
|
|
|
|
protected $Attribute;
|
|
|
|
/** @var object|null */
|
|
|
|
protected $Object;
|
|
|
|
/** @var object|null */
|
|
|
|
protected $Note;
|
|
|
|
/** @var object|null */
|
|
|
|
protected $Opinion;
|
|
|
|
/** @var object|null */
|
|
|
|
protected $Relationship;
|
|
|
|
/** @var object|null */
|
|
|
|
protected $User;
|
|
|
|
/** @var array|null */
|
|
|
|
private $__currentUser;
|
|
|
|
|
|
|
|
public function afterFind($results, $primary = false)
|
|
|
|
{
|
|
|
|
$results = parent::afterFind($results, $primary);
|
|
|
|
if (empty($this->__currentUser)) {
|
|
|
|
$user_id = Configure::read('CurrentUserId');
|
|
|
|
$this->User = ClassRegistry::init('User');
|
|
|
|
if ($user_id) {
|
|
|
|
$this->__currentUser = $this->User->getAuthUser($user_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
foreach ($results as $i => $v) {
|
2024-04-03 14:44:08 +02:00
|
|
|
if (!empty($v[$this->alias]['related_object_type']) && !empty($v[$this->alias]['related_object_uuid']) && empty($results[$i][$this->alias]['related_object'])) {
|
2024-01-29 11:01:02 +01:00
|
|
|
$results[$i][$this->alias]['related_object'] = $this->getRelatedElement($this->__currentUser, $v[$this->alias]['related_object_type'], $v[$this->alias]['related_object_uuid']);
|
|
|
|
}
|
2024-01-25 20:01:04 +01:00
|
|
|
}
|
|
|
|
return $results;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getRelatedElement(array $user, $type, $uuid): array
|
|
|
|
{
|
|
|
|
$data = [];
|
|
|
|
if ($type == 'Event') {
|
|
|
|
$this->Event = ClassRegistry::init('Event');
|
|
|
|
$params = [
|
|
|
|
];
|
2024-02-13 11:13:39 +01:00
|
|
|
$backup = $this->Event->includeAnalystData;
|
|
|
|
$this->Event->includeAnalystData = false;
|
2024-01-25 20:01:04 +01:00
|
|
|
$data = $this->Event->fetchSimpleEvent($user, $uuid, $params);
|
2024-02-13 11:13:39 +01:00
|
|
|
$this->Event->includeAnalystData = $backup;
|
2024-01-25 20:01:04 +01:00
|
|
|
} else if ($type == 'Attribute') {
|
|
|
|
$this->Attribute = ClassRegistry::init('Attribute');
|
|
|
|
$params = [
|
|
|
|
'conditions' => [
|
|
|
|
['Attribute.uuid' => $uuid],
|
|
|
|
],
|
2024-01-26 16:05:35 +01:00
|
|
|
'contain' => ['Event' => 'Orgc', 'Object',]
|
2024-01-25 20:01:04 +01:00
|
|
|
];
|
2024-02-13 11:13:39 +01:00
|
|
|
$backup = $this->Attribute->includeAnalystData;
|
|
|
|
$this->Attribute->includeAnalystData = false;
|
2024-01-25 20:01:04 +01:00
|
|
|
$data = $this->Attribute->fetchAttributeSimple($user, $params);
|
2024-02-13 11:13:39 +01:00
|
|
|
$this->Attribute->includeAnalystData = $backup;
|
2024-01-25 20:01:04 +01:00
|
|
|
$data = $this->rearrangeData($data, 'Attribute');
|
|
|
|
} else if ($type == 'Object') {
|
|
|
|
$this->Object = ClassRegistry::init('MispObject');
|
|
|
|
$params = [
|
|
|
|
'conditions' => [
|
|
|
|
['Object.uuid' => $uuid],
|
2024-01-26 16:05:35 +01:00
|
|
|
],
|
|
|
|
'contain' => ['Event' => 'Orgc',]
|
2024-01-25 20:01:04 +01:00
|
|
|
];
|
2024-02-13 11:13:39 +01:00
|
|
|
$backup = $this->Object->includeAnalystData;
|
|
|
|
$this->Object->includeAnalystData = false;
|
2024-01-25 20:01:04 +01:00
|
|
|
$data = $this->Object->fetchObjectSimple($user, $params);
|
2024-02-13 11:13:39 +01:00
|
|
|
$this->Object->includeAnalystData = $backup;
|
2024-01-25 20:01:04 +01:00
|
|
|
if (!empty($data)) {
|
|
|
|
$data = $data[0];
|
|
|
|
}
|
2024-01-26 16:05:35 +01:00
|
|
|
$data = $this->rearrangeData($data, 'Object');
|
2024-01-25 20:01:04 +01:00
|
|
|
} else if ($type == 'Note') {
|
|
|
|
$this->Note = ClassRegistry::init('Note');
|
|
|
|
$params = [
|
|
|
|
|
|
|
|
];
|
2024-02-13 11:13:39 +01:00
|
|
|
$backup = $this->Note->includeAnalystData;
|
|
|
|
$this->Note->includeAnalystData = false;
|
2024-01-25 20:01:04 +01:00
|
|
|
$data = $this->Note->fetchNote();
|
2024-02-13 11:13:39 +01:00
|
|
|
$this->Note->includeAnalystData = $backup;
|
2024-01-25 20:01:04 +01:00
|
|
|
} else if ($type == 'Opinion') {
|
|
|
|
$this->Opinion = ClassRegistry::init('Opinion');
|
|
|
|
$params = [
|
|
|
|
|
|
|
|
];
|
2024-02-13 11:13:39 +01:00
|
|
|
$backup = $this->Opinion->includeAnalystData;
|
|
|
|
$this->Opinion->includeAnalystData = false;
|
2024-01-25 20:01:04 +01:00
|
|
|
$data = $this->Opinion->fetchOpinion();
|
2024-02-13 11:13:39 +01:00
|
|
|
$this->Opinion->includeAnalystData = $backup;
|
2024-01-25 20:01:04 +01:00
|
|
|
} else if ($type == 'Relationship') {
|
|
|
|
$this->Relationship = ClassRegistry::init('Relationship');
|
|
|
|
$params = [
|
|
|
|
|
|
|
|
];
|
2024-02-13 11:13:39 +01:00
|
|
|
$backup = $this->Relationship->includeAnalystData;
|
|
|
|
$this->Relationship->includeAnalystData = false;
|
2024-01-25 20:01:04 +01:00
|
|
|
$data = $this->Relationship->fetchRelationship();
|
2024-02-13 11:13:39 +01:00
|
|
|
$this->Relationship->includeAnalystData = $backup;
|
2024-01-25 20:01:04 +01:00
|
|
|
}
|
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function rearrangeData(array $data, $objectType): array
|
|
|
|
{
|
|
|
|
$models = ['Event', 'Attribute', 'Object', 'Organisation', ];
|
2024-02-16 15:26:11 +01:00
|
|
|
if (!empty($data) && !empty($data[$objectType])) {
|
2024-01-25 20:01:04 +01:00
|
|
|
foreach ($models as $model) {
|
|
|
|
if ($model == $objectType) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (isset($data[$model])) {
|
|
|
|
$data[$objectType][$model] = $data[$model];
|
|
|
|
unset($data[$model]);
|
|
|
|
}
|
|
|
|
}
|
2024-02-16 15:26:11 +01:00
|
|
|
$data[$objectType]['Organisation'] = $data[$objectType]['Event']['Orgc'];
|
|
|
|
$data[$objectType]['orgc_uuid'] = $data[$objectType]['Event']['Orgc']['uuid'];
|
|
|
|
unset($data[$objectType]['Event']['Orgc']);
|
2024-01-25 20:01:04 +01:00
|
|
|
}
|
|
|
|
return $data;
|
|
|
|
}
|
2024-04-03 14:44:08 +02:00
|
|
|
|
|
|
|
public function getInboundRelationships(array $user, $object_type, $object_uuid): array
|
|
|
|
{
|
|
|
|
$conditions = [
|
|
|
|
'related_object_type' => $object_type,
|
|
|
|
'related_object_uuid' => $object_uuid,
|
|
|
|
];
|
|
|
|
$type = 'Relationship';
|
|
|
|
if (empty($user['Role']['perm_site_admin'])) {
|
|
|
|
if ($this->__valid_sharing_groups === null) {
|
|
|
|
$this->__valid_sharing_groups = $this->SharingGroup->authorizedIds($user, true);
|
|
|
|
}
|
|
|
|
$conditions['AND'][] = [
|
|
|
|
'OR' => [
|
|
|
|
$type . '.orgc_uuid' => $user['Organisation']['uuid'],
|
|
|
|
$type . '.org_uuid' => $user['Organisation']['uuid'],
|
|
|
|
$type . '.distribution IN' => [1, 2, 3],
|
|
|
|
'AND' => [
|
|
|
|
$type . '.distribution' => 4,
|
|
|
|
$type . '.sharing_group_id IN' => $this->__valid_sharing_groups
|
|
|
|
]
|
|
|
|
]
|
|
|
|
];
|
|
|
|
}
|
|
|
|
$inboundRelations = $this->find('all', [
|
|
|
|
'recursive' => -1,
|
|
|
|
'conditions' => $conditions,
|
|
|
|
'contain' => ['Org', 'Orgc', 'SharingGroup'],
|
|
|
|
]);
|
|
|
|
|
|
|
|
foreach ($inboundRelations as $i => $relationship) {
|
|
|
|
$relationship = $relationship['Relationship'];
|
|
|
|
$inboundRelations[$i]['Relationship']['related_object'] = $this->getRelatedElement($this->__currentUser, $relationship['object_type'], $relationship['object_uuid']);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $inboundRelations;
|
|
|
|
}
|
2024-01-04 10:12:47 +01:00
|
|
|
}
|