From daf427b5ae33321d9341f887736b25849608cb71 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Wed, 16 Aug 2017 17:30:34 -0400 Subject: [PATCH] HOR-3701 --- .../engine/src/ProcessMaker/Project/Bpmn.php | 315 +++++++++++++++--- .../src/ProcessMaker/Services/Api/Project.php | 21 ++ 2 files changed, 291 insertions(+), 45 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/Project/Bpmn.php b/workflow/engine/src/ProcessMaker/Project/Bpmn.php index 3ebb318b1..7807860cc 100644 --- a/workflow/engine/src/ProcessMaker/Project/Bpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Bpmn.php @@ -1,36 +1,39 @@ array( - "PRJ_UID", "PRO_UID", "BOU_ELEMENT_TYPE", "BOU_REL_POSITION", - "BOU_SIZE_IDENTICAL", "DIA_UID", "BOU_UID", "ELEMENT_UID" + "PRJ_UID", + "PRO_UID", + "BOU_ELEMENT_TYPE", + "BOU_REL_POSITION", + "BOU_SIZE_IDENTICAL", + "DIA_UID", + "BOU_UID", + "ELEMENT_UID" ), "event" => array( - "PRJ_UID", "PRO_UID", "BOU_ELEMENT_TYPE", "BOU_REL_POSITION", - "BOU_SIZE_IDENTICAL", "DIA_UID", "BOU_UID", "ELEMENT_UID", "EVN_ATTACHED_TO", "EVN_CONDITION" + "PRJ_UID", + "PRO_UID", + "BOU_ELEMENT_TYPE", + "BOU_REL_POSITION", + "BOU_SIZE_IDENTICAL", + "DIA_UID", + "BOU_UID", + "ELEMENT_UID", + "EVN_ATTACHED_TO", + "EVN_CONDITION" ), - "gateway" => array("BOU_ELEMENT_TYPE", "BOU_REL_POSITION", "BOU_SIZE_IDENTICAL", "BOU_UID", - "DIA_UID", "ELEMENT_UID", "PRJ_UID", "PRO_UID" + "gateway" => array( + "BOU_ELEMENT_TYPE", + "BOU_REL_POSITION", + "BOU_SIZE_IDENTICAL", + "BOU_UID", + "DIA_UID", + "ELEMENT_UID", + "PRJ_UID", + "PRO_UID" ), "artifact" => array( - "PRJ_UID", "PRO_UID", "BOU_ELEMENT_TYPE", "BOU_REL_POSITION", - "BOU_SIZE_IDENTICAL", "DIA_UID", "BOU_UID", "ELEMENT_UID" + "PRJ_UID", + "PRO_UID", + "BOU_ELEMENT_TYPE", + "BOU_REL_POSITION", + "BOU_SIZE_IDENTICAL", + "DIA_UID", + "BOU_UID", + "ELEMENT_UID" ), - "flow" => array("PRJ_UID", "DIA_UID", "FLO_ELEMENT_DEST_PORT", "FLO_ELEMENT_ORIGIN_PORT"), - "data" => array("PRJ_UID"), - "participant" => array("PRJ_UID"), - "laneset" => array("BOU_ELEMENT_TYPE", "BOU_SIZE_IDENTICAL", "BOU_UID"), - "lane" => array("BOU_ELEMENT_TYPE", "BOU_SIZE_IDENTICAL", "BOU_UID") + "flow" => array( + "PRJ_UID", + "DIA_UID", + "FLO_ELEMENT_DEST_PORT", + "FLO_ELEMENT_ORIGIN_PORT" + ), + "data" => array( + "PRJ_UID" + ), + "participant" => array( + "PRJ_UID" + ), + "laneset" => array( + "BOU_ELEMENT_TYPE", + "BOU_SIZE_IDENTICAL", + "BOU_UID" + ), + "lane" => array( + "BOU_ELEMENT_TYPE", + "BOU_SIZE_IDENTICAL", + "BOU_UID" + ) ); private $arrayElementOriginChecked = array(); + protected $contextLog = array(); public function __construct($data = null) { if (! is_null($data)) { $this->create($data); } + //Define the variables for the logging + $info = array( + 'ip' => G::getIpAddress(), + 'workspace' => (defined("SYS_SYS"))? SYS_SYS : "Workspace undefined" + ); + $this->setContextLog($info); + } + + /** + * Get the $contextLog value. + * + * @return string + */ + public function getContextLog() + { + return $this->contextLog; + } + + /** + * Set the value of $contextLog. + * + * @param array $k + * @return void + */ + public function setContextLog($k) + { + $this->contextLog = array_merge($this->contextLog, $k); + } + + /** + * Bulk actions + * We will have actions in many projects + * + * @param array $data + * @return array $result, related to actions send + */ + public static function doBulk($data) + { + //We will review the data format + if (!is_array($data)) { + $isJson = is_string($data) && is_array(G::json_decode($data, true)); + if ($isJson) { + $data = G::json_decode($data, true); + } else { + return; + } + } + //We get the action and execute + $response = array(); + if (isset($data['data'])) { + foreach ($data['data'] as $key => $val) { + if (isset($val['action'])) { + switch ($val['action']) { + case 'delete': + $response[] = array( + 'action' => $val['action'], + 'data'=> self::doBulkDelete($val['data']) + ); + break; + default: + $response[] = array( + 'action' => $val['action'], + 'title' => 'Unknown action', + 'status' => '400', + 'detail' => "Unknown action.", + 'result' => false + ); + //todo, we can add more bulk actions + } + } + } + } + $result['data'] = $response; + + return $result; + } + + /** + * Bulk delete + * We will delete many projects in bulk + * + * @param array $data, array of projectUid + * @return array $response, information about the action with the projectUid + */ + public static function doBulkDelete($data) + { + //We reviewed the action in all projectUid + $response = array(); + foreach ($data as $key => $val) { + //Review if the type is "prj_uid" + if (isset($val['prj_uid']) && !empty($val['prj_uid']) ) { + //The project exist? + if (!Bpmn::exists($val['prj_uid'])) { + $response[] = array( + 'type' => $val['type'], + 'prj_uid' => $val['prj_uid'], + 'title' => 'Not found', + 'token' => strtotime("now"), + 'status' => '404', + 'detail' => "The row {$val['prj_uid']} in table Process doesn't exist!.", + 'result' => false + ); + continue; + } + //The project has cases? + $oBpmnWf = BpmnWorkflow::load($val['prj_uid']); + if (!$oBpmnWf->canRemove()) { + $response[] = array( + 'type' => $val['type'], + 'prj_uid' => $val['prj_uid'], + 'title' => 'Unable to delete project', + 'token' => strtotime("now"), + 'status' => '403', + 'detail' => "Project with prj_uid: {$val['prj_uid']} can not be deleted, it has started cases.", + 'result' => false + + ); + continue; + } + //We will to remove + $oBpmnWf = BpmnWorkflow::load($val['prj_uid']); + $oBpmnWf->remove(); + $response[] = array( + 'type' => $val['type'], + 'prj_uid' => $val['prj_uid'], + 'status' => '200', + 'result' => true + ); + } else { + //Is not defined the "prj_uid" + $response[] = array( + 'type' => $val['type'], + 'title' => 'Unknown field', + 'token' => strtotime("now"), + 'status' => '400', + 'detail' => "Unknown field.", + 'result' => false + + ); + } + } + $me = new self(); + $me->setContextLog($response); + $me->syslog( + 'DoBulkDelete', + 200, + 'Do bulk delete', + $me->getContextLog() + ); + + return $response; } public function exists($projectUid) @@ -107,8 +306,8 @@ class Bpmn extends Handler $me = new self(); $project = ProjectPeer::retrieveByPK($prjUid); - if (! is_object($project)) { - throw new Exception\ProjectNotFound($me, $prjUid); + if (!is_object($project)) { + throw new ProjectNotFound($me, $prjUid); } $me->project = $project; @@ -1463,5 +1662,31 @@ class Bpmn extends Handler throw $e; } } + + /** + * Logging information related to project + * When the user doDeleteBulk + * + * @param string $channel + * @param string $level + * @param string $message + * @param array $context + * + * @return void + * @throws Exception + */ + private function syslog( + $channel, + $level, + $message, + $context = array() + ) + { + try { + Bootstrap::registerMonolog($channel, $level, $message, $context, $context['workspace'], 'processmaker.log'); + } catch (Exception $e) { + throw $e; + } + } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project.php b/workflow/engine/src/ProcessMaker/Services/Api/Project.php index c7c04d878..859e40511 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project.php @@ -139,6 +139,27 @@ class Project extends Api } } + /** + * Bulk actions + * @url POST /bulk + * + * @access protected + * @class AccessControl {@permission PM_FACTORY} + * + * @param array $request_data + * @return array $response + * @throws Exception + */ + public function bulk($request_data) + { + try { + $response = Bpmn::doBulk($request_data); + return $response; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + /** * @url GET /:prj_uid/export/listObjects *