288 lines
12 KiB
PHP
288 lines
12 KiB
PHP
<?php
|
|
namespace App\Controller;
|
|
|
|
use App\Controller\AppController;
|
|
use Cake\Utility\Inflector;
|
|
use Cake\Utility\Hash;
|
|
use Cake\Utility\Text;
|
|
use \Cake\Database\Expression\QueryExpression;
|
|
use Cake\Error\Debugger;
|
|
use Cake\Http\Exception\NotFoundException;
|
|
|
|
class SharingGroupsController extends AppController
|
|
{
|
|
public $filterFields = ['SharingGroups.uuid', 'SharingGroups.name', 'description', 'releasability', 'Organisations.name', 'Organisations.uuid'];
|
|
public $quickFilterFields = ['SharingGroups.uuid', ['SharingGroups.name' => true], ['description' => true], ['releasability' => true]];
|
|
public $containFields = ['SharingGroupOrgs', 'Organisations', 'Users' => ['fields' => ['id', 'username']]];
|
|
|
|
public function index()
|
|
{
|
|
$currentUser = $this->ACL->getUser();
|
|
$conditions = [];
|
|
$this->CRUD->index([
|
|
'contain' => $this->containFields,
|
|
'filters' => $this->filterFields,
|
|
'quickFilters' => $this->quickFilterFields,
|
|
'conditions' => $conditions,
|
|
'afterFind' => function ($row) use ($currentUser) {
|
|
if (empty($currentUser['role']['perm_admin'])) {
|
|
$orgFound = false;
|
|
if (!empty($row['sharing_group_orgs'])) {
|
|
foreach ($row['sharing_group_orgs'] as $org) {
|
|
if ($org['id'] === $currentUser['organisation_id']) {
|
|
$orgFound = true;
|
|
}
|
|
}
|
|
}
|
|
if ($row['organisation_id'] !== $currentUser['organisation_id'] && !$orgFound) {
|
|
return false;
|
|
}
|
|
}
|
|
return $row;
|
|
}
|
|
]);
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
if (!empty($responsePayload)) {
|
|
return $responsePayload;
|
|
}
|
|
}
|
|
|
|
public function add()
|
|
{
|
|
$currentUser = $this->ACL->getUser();
|
|
$this->CRUD->add([
|
|
'override' => [
|
|
'user_id' => $this->ACL->getUser()['id']
|
|
],
|
|
'beforeSave' => function($data) use ($currentUser) {
|
|
if (!$currentUser['role']['perm_admin']) {
|
|
$data['organisation_id'] = $currentUser['organisation_id'];
|
|
}
|
|
return $data;
|
|
}
|
|
]);
|
|
$dropdownData = [
|
|
'organisation' => $this->getAvailableOrgForSg($this->ACL->getUser())
|
|
];
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
if (!empty($responsePayload)) {
|
|
return $responsePayload;
|
|
}
|
|
$this->set(compact('dropdownData'));
|
|
}
|
|
|
|
public function view($id)
|
|
{
|
|
$currentUser = $this->ACL->getUser();
|
|
$this->CRUD->view($id, [
|
|
'contain' => ['SharingGroupOrgs', 'Organisations', 'Users' => ['fields' => ['id', 'username']]],
|
|
'afterFind' => function($data) use ($currentUser) {
|
|
if (empty($currentUser['role']['perm_admin'])) {
|
|
$orgFound = false;
|
|
if (!empty($data['sharing_group_orgs'])) {
|
|
foreach ($data['sharing_group_orgs'] as $org) {
|
|
if ($org['id'] === $currentUser['organisation_id']) {
|
|
$orgFound = true;
|
|
}
|
|
}
|
|
}
|
|
if ($data['organisation_id'] !== $currentUser['organisation_id'] && !$orgFound) {
|
|
return null;
|
|
}
|
|
}
|
|
return $data;
|
|
}
|
|
]);
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
if (!empty($responsePayload)) {
|
|
return $responsePayload;
|
|
}
|
|
}
|
|
|
|
public function edit($id = false)
|
|
{
|
|
$params = [];
|
|
$currentUser = $this->ACL->getUser();
|
|
if (empty($currentUser['role']['perm_admin'])) {
|
|
$params['conditions'] = ['organisation_id' => $currentUser['organisation_id']];
|
|
}
|
|
$params['fields'] = ['name', 'releasability', 'description', 'active'];
|
|
$this->CRUD->edit($id, $params);
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
if (!empty($responsePayload)) {
|
|
return $responsePayload;
|
|
}
|
|
$dropdownData = [
|
|
'organisation' => $this->getAvailableOrgForSg($this->ACL->getUser())
|
|
];
|
|
$this->set(compact('dropdownData'));
|
|
$this->render('add');
|
|
}
|
|
|
|
public function delete($id)
|
|
{
|
|
$currentUser = $this->ACL->getUser();
|
|
$params = [];
|
|
if (empty($currentUser['role']['perm_admin'])) {
|
|
$params['conditions'] = ['organisation_id' => $currentUser['organisation_id']];
|
|
}
|
|
$this->CRUD->delete($id, $params);
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
if (!empty($responsePayload)) {
|
|
return $responsePayload;
|
|
}
|
|
}
|
|
|
|
public function addOrg($id)
|
|
{
|
|
$currentUser = $this->ACL->getUser();
|
|
$sharingGroup = $this->SharingGroups->get($id, [
|
|
'contain' => 'SharingGroupOrgs'
|
|
]);
|
|
if (empty($currentUser['role']['perm_admin'])) {
|
|
if ($sharingGroup['organisation_id'] !== $currentUser['organisation_id']) {
|
|
$sharingGroup = null;
|
|
}
|
|
}
|
|
if (empty($sharingGroup)) {
|
|
throw new NotFoundException(__('Invalid SharingGroup.'));
|
|
}
|
|
$conditions = [];
|
|
$containedOrgIds = array_values(\Cake\Utility\Hash::extract($sharingGroup, 'sharing_group_orgs.{n}.id'));
|
|
if (!empty($containedOrgIds)) {
|
|
$conditions = [
|
|
'NOT' => [
|
|
'id IN' => $containedOrgIds
|
|
]
|
|
];
|
|
}
|
|
$dropdownData = [
|
|
'organisation' => $this->SharingGroups->Organisations->find('list', [
|
|
'sort' => ['name' => 'asc'],
|
|
'conditions' => $conditions
|
|
])->toArray()
|
|
];
|
|
if ($this->request->is('post')) {
|
|
$input = $this->request->getData();
|
|
if (empty($input['organisation_id'])) {
|
|
throw new InvalidArgumentException(__('No organisation IDs passed.'));
|
|
}
|
|
if (!is_array($input['organisation_id'])) {
|
|
$input['organisation_id'] = [$input['organisation_id']];
|
|
}
|
|
$result = true;
|
|
foreach ($input['organisation_id'] as $org_id) {
|
|
$org = $this->SharingGroups->SharingGroupOrgs->get($org_id);
|
|
$result &= (bool)$this->SharingGroups->SharingGroupOrgs->link($sharingGroup, [$org]);
|
|
}
|
|
if ($result) {
|
|
$message = __('Organisation(s) added to the sharing group.');
|
|
} else {
|
|
$message = __('Organisation(s) could not be added to the sharing group.');
|
|
}
|
|
if ($this->ParamHandler->isRest() || $this->ParamHandler->isAjax()) {
|
|
if ($result) {
|
|
$savedData = $this->SharingGroups->get($id, [
|
|
'contain' => 'SharingGroupOrgs'
|
|
]);
|
|
return $this->RestResponse->ajaxSuccessResponse(Inflector::singularize($this->SharingGroups->getAlias()), 'addOrg', $savedData, $message);
|
|
} else {
|
|
return $this->RestResponse->ajaxFailResponse(Inflector::singularize($this->SharingGroups->getAlias()), 'addOrg', $sharingGroup, $message);;
|
|
}
|
|
} else {
|
|
if ($result) {
|
|
$this->Flash->success($message);
|
|
} else {
|
|
$this->Flash->error($message);
|
|
}
|
|
$this->redirect(['action' => 'view', $id]);
|
|
}
|
|
}
|
|
$this->set(compact('dropdownData'));
|
|
}
|
|
|
|
public function removeOrg($id, $org_id)
|
|
{
|
|
$currentUser = $this->ACL->getUser();
|
|
$sharingGroup = $this->SharingGroups->get($id, [
|
|
'contain' => 'SharingGroupOrgs'
|
|
]);
|
|
if (empty($currentUser['role']['perm_admin'])) {
|
|
if ($sharingGroup['organisation_id'] !== $currentUser['organisation_id']) {
|
|
$sharingGroup = null;
|
|
}
|
|
}
|
|
if (empty($sharingGroup)) {
|
|
throw new NotFoundException(__('Invalid SharingGroup.'));
|
|
}
|
|
if ($this->request->is('post')) {
|
|
$org = $this->SharingGroups->SharingGroupOrgs->get($org_id);
|
|
$result = (bool)$this->SharingGroups->SharingGroupOrgs->unlink($sharingGroup, [$org]);
|
|
if ($result) {
|
|
$message = __('Organisation(s) removed from the sharing group.');
|
|
} else {
|
|
$message = __('Organisation(s) could not be removed to the sharing group.');
|
|
}
|
|
if ($this->ParamHandler->isRest() || $this->ParamHandler->isAjax()) {
|
|
if ($result) {
|
|
$savedData = $this->SharingGroups->get($id, [
|
|
'contain' => 'SharingGroupOrgs'
|
|
]);
|
|
return $this->RestResponse->ajaxSuccessResponse(Inflector::singularize($this->SharingGroups->getAlias()), 'removeOrg', $savedData, $message);
|
|
} else {
|
|
return $this->RestResponse->ajaxFailResponse(Inflector::singularize($this->SharingGroups->getAlias()), 'removeOrg', $sharingGroup, $message);
|
|
;
|
|
}
|
|
} else {
|
|
if ($result) {
|
|
$this->Flash->success($message);
|
|
} else {
|
|
$this->Flash->error($message);
|
|
}
|
|
$this->redirect(['action' => 'view', $id]);
|
|
}
|
|
}
|
|
$this->set('scope', 'sharing_groups');
|
|
$this->set('id', $org_id);
|
|
$this->set('sharingGroup', $sharingGroup);
|
|
$this->set('deletionText', __('Are you sure you want to remove Organisation #{0} from Sharing group #{1}?', $org_id, $sharingGroup['id']));
|
|
$this->set('postLinkParameters', ['action' => 'removeOrg', $id, $org_id]);
|
|
$this->viewBuilder()->setLayout('ajax');
|
|
$this->render('/genericTemplates/delete');
|
|
}
|
|
|
|
public function listOrgs($id)
|
|
{
|
|
$sharingGroup = $this->SharingGroups->get($id, [
|
|
'contain' => 'SharingGroupOrgs'
|
|
]);
|
|
$params = $this->ParamHandler->harvestParams(['quickFilter']);
|
|
if (!empty($params['quickFilter'])) {
|
|
foreach ($sharingGroup['sharing_group_orgs'] as $k => $org) {
|
|
if (strpos($org['name'], $params['quickFilter']) === false) {
|
|
unset($sharingGroup['sharing_group_orgs'][$k]);
|
|
}
|
|
}
|
|
$sharingGroup['sharing_group_orgs'] = array_values($sharingGroup['sharing_group_orgs']);
|
|
}
|
|
$this->set('sharing_group_id', $id);
|
|
$this->set('sharing_group_orgs', $sharingGroup['sharing_group_orgs']);
|
|
}
|
|
|
|
private function getAvailableOrgForSg($user)
|
|
{
|
|
$organisations = [];
|
|
if (!empty($user['role']['perm_admin'])) {
|
|
$organisations = $this->SharingGroups->Organisations->find('list')->order(['name' => 'ASC'])->toArray();
|
|
} else {
|
|
$organisations = $this->SharingGroups->Organisations->find('list', [
|
|
'sort' => ['name' => 'asc'],
|
|
'conditions' => [
|
|
'id' => $user['organisation_id']
|
|
]
|
|
])->toArray();
|
|
}
|
|
return $organisations;
|
|
}
|
|
}
|