Adding put method for /project endpoint (1st commit - still not functional)
This commit is contained in:
@@ -14,6 +14,50 @@ require_once 'classes/model/om/BaseBpmnActivity.php';
|
|||||||
*
|
*
|
||||||
* @package classes.model
|
* @package classes.model
|
||||||
*/
|
*/
|
||||||
class BpmnActivity extends BaseBpmnActivity {
|
class BpmnActivity extends BaseBpmnActivity
|
||||||
|
{
|
||||||
|
public function create($data, $generateUid = true)
|
||||||
|
{
|
||||||
|
// validate foreign keys, they must be present into data array
|
||||||
|
|
||||||
|
if (! array_key_exists('PRJ_UID', $data)) {
|
||||||
|
throw new PropelException("Error, required param 'PRJ_UID' is missing!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! array_key_exists('PRO_UID', $data)) {
|
||||||
|
throw new PropelException("Error, required param 'PRO_UID' is missing!");
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||||
|
|
||||||
|
if ($generateUid) {
|
||||||
|
$this->setActUid(\ProcessMaker\Util\Hash::generateUID());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->save();
|
||||||
|
$process = BpmnProcessPeer::retrieveByPK($data['PRO_UID']);
|
||||||
|
|
||||||
|
// create related bound
|
||||||
|
$bound = new Bound();
|
||||||
|
$bound->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||||
|
$bound->setBouUid(\ProcessMaker\Util\Hash::generateUID());
|
||||||
|
$bound->setPrjUid($this->getPrjUid());
|
||||||
|
$bound->setDiaUid($process->getDiaUid());
|
||||||
|
$bound->setElementUid($this->getActUid());
|
||||||
|
$bound->setBouElementType('bpmnActivity');
|
||||||
|
$bound->setBouElement('pm_canvas');
|
||||||
|
$bound->setBouContainer('bpmnDiagram');
|
||||||
|
$bound->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update($data)
|
||||||
|
{
|
||||||
|
$this->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||||
|
$this->save();
|
||||||
|
|
||||||
|
// update related bound
|
||||||
|
$bound = BpmnBound::findOneBy(BpmnBoundPeer::ELEMENT_UID, $this->getActUid());
|
||||||
|
$bound->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||||
|
$bound->save();
|
||||||
|
}
|
||||||
} // BpmnActivity
|
} // BpmnActivity
|
||||||
|
|||||||
@@ -14,6 +14,18 @@ require_once 'classes/model/om/BaseBpmnBound.php';
|
|||||||
*
|
*
|
||||||
* @package classes.model
|
* @package classes.model
|
||||||
*/
|
*/
|
||||||
class BpmnBound extends BaseBpmnBound {
|
class BpmnBound extends BaseBpmnBound
|
||||||
|
{
|
||||||
|
public static function findOneBy($field, $value)
|
||||||
|
{
|
||||||
|
$c = new Criteria('workflow');
|
||||||
|
|
||||||
|
$c->add($field, $value, CRITERIA::EQUAL );
|
||||||
|
|
||||||
|
$rs = ContentPeer::doSelectRS($c);
|
||||||
|
//$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||||
|
$rs->next();
|
||||||
|
|
||||||
|
return $rs->getRow();
|
||||||
|
}
|
||||||
} // BpmnBound
|
} // BpmnBound
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ use \BpmnArtifactPeer as ArtifactPeer;
|
|||||||
use \ProcessMaker\Util\Hash;
|
use \ProcessMaker\Util\Hash;
|
||||||
use \BasePeer;
|
use \BasePeer;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Model
|
* Class Model
|
||||||
*
|
*
|
||||||
@@ -291,7 +292,7 @@ class Model
|
|||||||
return $uids;
|
return $uids;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadProject($prjUid)
|
public static function loadProject($prjUid)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* 1. load object of project
|
* 1. load object of project
|
||||||
@@ -367,6 +368,127 @@ class Model
|
|||||||
return $projects;
|
return $projects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function updateProject($prjUid, $projectUpdated)
|
||||||
|
{
|
||||||
|
$project = ProjectPeer::retrieveByPK($prjUid);
|
||||||
|
$project->setPrjName($projectUpdated['prj_name']);
|
||||||
|
$project->setPrjUpdateDate(date("Y-m-d H:i:s"));
|
||||||
|
$project->save();
|
||||||
|
|
||||||
|
$diagramData = $projectUpdated['diagrams'][0];
|
||||||
|
|
||||||
|
$diagram = DiagramPeer::retrieveByPK($diagramData['dia_uid']);
|
||||||
|
$diagram->setDiaName($diagramData['dia_name']);
|
||||||
|
|
||||||
|
if (!empty($diagramData['dia_is_closable'])) {
|
||||||
|
$diagram->setDiaIsClosable($diagramData['dia_is_closable']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$diagram->save();
|
||||||
|
|
||||||
|
$processData = self::getBpmnObjectBy('Process', ProcessPeer::PRJ_UID, $prjUid);
|
||||||
|
|
||||||
|
$process = ProcessPeer::retrieveByPK($processData['pro_uid']);
|
||||||
|
$process->setProName($process->getProName());
|
||||||
|
$process->save();
|
||||||
|
|
||||||
|
$savedProject = self::loadProject($prjUid);
|
||||||
|
$diff = self::getDiffFromProjects($savedProject, $projectUpdated);
|
||||||
|
|
||||||
|
self::updateDiagram($diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function updateDiagram($diff)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Creating new objects
|
||||||
|
foreach ($diff['new'] as $element => $items) {
|
||||||
|
foreach ($items as $data) {
|
||||||
|
switch ($element) {
|
||||||
|
case 'activities':
|
||||||
|
$data = array_change_key_case((array) $data, CASE_UPPER);
|
||||||
|
$activity = new Activity();
|
||||||
|
$activity->create($data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//$activity = ActivityPeer::retrieveByPK($item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getDiffFromProjects($savedProject, $updatedProject)
|
||||||
|
{
|
||||||
|
// preparing target project
|
||||||
|
$diagramElements = array(
|
||||||
|
'act_uid' => 'activities',
|
||||||
|
'evn_uid' => 'events',
|
||||||
|
'flo_uid' => 'flows',
|
||||||
|
'art_uid' => 'artifacts',
|
||||||
|
'lns_uid' => 'laneset',
|
||||||
|
'lan_uid' => 'lanes'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Getting Differences
|
||||||
|
$newRecords = array();
|
||||||
|
$deletedRecords = array();
|
||||||
|
$updatedRecords = array();
|
||||||
|
|
||||||
|
// Get new records
|
||||||
|
foreach ($diagramElements as $key => $element) {
|
||||||
|
$arrayDiff = self::arrayDiff(
|
||||||
|
$savedProject['diagrams'][0][$element],
|
||||||
|
$updatedProject['diagrams'][0][$element],
|
||||||
|
$key
|
||||||
|
);
|
||||||
|
|
||||||
|
if (! empty($arrayDiff)) {
|
||||||
|
$newRecords[$element] = $arrayDiff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get deleted records
|
||||||
|
foreach ($diagramElements as $key => $element) {
|
||||||
|
$arrayDiff = self::arrayDiff(
|
||||||
|
$updatedProject['diagrams'][0][$element],
|
||||||
|
$savedProject['diagrams'][0][$element],
|
||||||
|
$key
|
||||||
|
);
|
||||||
|
|
||||||
|
if (! empty($arrayDiff)) {
|
||||||
|
$deletedRecords[$element] = $arrayDiff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get updated records
|
||||||
|
$checksum = array();
|
||||||
|
foreach ($diagramElements as $key => $element) {
|
||||||
|
$checksum[$element] = self::getArrayChecksum($savedProject['diagrams'][0][$element], $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($diagramElements as $key => $element) {
|
||||||
|
foreach ($updatedProject['diagrams'][0][$element] as $item) {
|
||||||
|
if (in_array($item[$key], $newRecords[$element]) || in_array($item[$key], $deletedRecords[$element])) {
|
||||||
|
// skip new or deleted records
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::getChecksum($item) !== $checksum[$element][$item[$key]]) {
|
||||||
|
$updatedRecords[$element][] = $item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$diff = array(
|
||||||
|
'new' => $newRecords,
|
||||||
|
'deleted' => $deletedRecords,
|
||||||
|
'updated' => $updatedRecords
|
||||||
|
);
|
||||||
|
|
||||||
|
return $diff;
|
||||||
|
}
|
||||||
|
|
||||||
public static function getRelatedFlows($actUid)
|
public static function getRelatedFlows($actUid)
|
||||||
{
|
{
|
||||||
$flows = array(
|
$flows = array(
|
||||||
@@ -457,5 +579,49 @@ class Model
|
|||||||
|
|
||||||
return empty($record) ? null : $record[0];
|
return empty($record) ? null : $record[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static function arrayDiff($list, $targetList, $key)
|
||||||
|
{
|
||||||
|
$uid = array();
|
||||||
|
$diff = array();
|
||||||
|
|
||||||
|
foreach ($list as $item) {
|
||||||
|
if (array_key_exists($key, $item)) {
|
||||||
|
$uid[] = $item[$key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($targetList as $item) {
|
||||||
|
if (! in_array($item[$key], $uid)) {
|
||||||
|
$diff[] = $item[$key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getArrayChecksum($list, $key = null)
|
||||||
|
{
|
||||||
|
$checksum = array();
|
||||||
|
|
||||||
|
foreach ($list as $k => $item) {
|
||||||
|
if (empty($key)) {
|
||||||
|
$checksum[$k] = self::getChecksum($item);
|
||||||
|
} else {
|
||||||
|
$checksum[$item[$key]] = self::getChecksum($item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getChecksum($data)
|
||||||
|
{
|
||||||
|
if (! is_string($data)) {
|
||||||
|
$data = var_export($data, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sha1($data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ namespace Services\Api\ProcessMaker;
|
|||||||
use Luracast\Restler\RestException;
|
use Luracast\Restler\RestException;
|
||||||
use ProcessMaker\Services\Api;
|
use ProcessMaker\Services\Api;
|
||||||
use ProcessMaker\Adapter\Bpmn\Model as BpmnModel;
|
use ProcessMaker\Adapter\Bpmn\Model as BpmnModel;
|
||||||
|
use ProcessMaker\Adapter\Workflow;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Project
|
* Class Project
|
||||||
@@ -35,7 +36,7 @@ class Project extends Api
|
|||||||
$bpmnModel = new BpmnModel();
|
$bpmnModel = new BpmnModel();
|
||||||
$uids = $bpmnModel->createProject($request_data);
|
$uids = $bpmnModel->createProject($request_data);
|
||||||
|
|
||||||
$wfProcess = \ProcessMaker\Adapter\Workflow::loadFromBpmnProject($uids[0]['new_uid']);
|
$wfProcess = Workflow::loadFromBpmnProject($uids[0]['new_uid']);
|
||||||
|
|
||||||
$process = new \BusinessModel\Process();
|
$process = new \BusinessModel\Process();
|
||||||
$userUid = $this->getUserId();
|
$userUid = $this->getUserId();
|
||||||
@@ -53,6 +54,92 @@ class Project extends Api
|
|||||||
try {
|
try {
|
||||||
$project = BpmnModel::loadProject($prjUid);
|
$project = BpmnModel::loadProject($prjUid);
|
||||||
|
|
||||||
|
return $project;
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function put($prjUid, $request_data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$project = BpmnModel::updateProject($prjUid, $request_data);
|
||||||
|
|
||||||
|
return $project;
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function put22($prjUid, $request_data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$project = BpmnModel::loadProject($prjUid);
|
||||||
|
|
||||||
|
|
||||||
|
$projectUpdated = $project;
|
||||||
|
$projectUpdated['diagrams'][0]['activities'][] = array(
|
||||||
|
"act_uid" => "befd5b20508822592122970978652b05",
|
||||||
|
"prj_uid" => "27289719452b05bef821d30070436486",
|
||||||
|
"pro_uid" => "67771289152b05bef952892039062017",
|
||||||
|
"act_name" => "Task # x",
|
||||||
|
"act_type" => "TASK",
|
||||||
|
"act_is_for_compensation" => 0,
|
||||||
|
"act_start_quantity" => "1",
|
||||||
|
"act_completion_quantity" => 0,
|
||||||
|
"act_task_type" => "EMPTY",
|
||||||
|
"act_implementation" => "",
|
||||||
|
"act_instantiate" => 0,
|
||||||
|
"act_script_type" => "",
|
||||||
|
"act_script" => "",
|
||||||
|
"act_loop_type" => "NONE",
|
||||||
|
"act_test_before" => "",
|
||||||
|
"act_loop_maximum" => 0,
|
||||||
|
"act_loop_condition" => "",
|
||||||
|
"act_loop_cardinality" => 0,
|
||||||
|
"act_loop_behavior" => "",
|
||||||
|
"act_is_adhoc" => 0,
|
||||||
|
"act_is_collapsed" => 0,
|
||||||
|
"act_completion_condition" => "",
|
||||||
|
"act_ordering" => "",
|
||||||
|
"act_cancel_remaining_instances" => 1,
|
||||||
|
"act_protocol" => "",
|
||||||
|
"act_method" =>"",
|
||||||
|
"act_is_global" => 0,
|
||||||
|
"act_referer" => "",
|
||||||
|
"act_default_flow" => 0,
|
||||||
|
"act_master_diagram" => "",
|
||||||
|
"bou_uid" => "65717999352b05befddcaf6007443642",
|
||||||
|
"dia_uid" => "12117099152b05bef8d4c66069408293",
|
||||||
|
"element_uid" => "22970978652b05befd5b205088225921",
|
||||||
|
"bou_element" => "pm_canvas",
|
||||||
|
"bou_element_type" => "bpmnActivity",
|
||||||
|
"bou_x" => 467,
|
||||||
|
"bou_y" => 331,
|
||||||
|
"bou_width" => 100,
|
||||||
|
"bou_height" => 50,
|
||||||
|
"bou_rel_position" => 0,
|
||||||
|
"bou_size_identical" => 0,
|
||||||
|
"bou_container" => "bpmnDiagram"
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo 'updated: ' . $projectUpdated['diagrams'][0]['activities'][0]['act_uid'] . PHP_EOL;
|
||||||
|
echo 'deleted: ' . $projectUpdated['diagrams'][0]['activities'][1]['act_uid'] . PHP_EOL;
|
||||||
|
echo 'deleted: ' . $projectUpdated['diagrams'][0]['events'][0]['evn_uid'] . PHP_EOL;
|
||||||
|
echo 'deleted: ' . $projectUpdated['diagrams'][0]['events'][1]['evn_uid'] . PHP_EOL;
|
||||||
|
|
||||||
|
unset($projectUpdated['diagrams'][0]['activities'][1]);
|
||||||
|
unset($projectUpdated['diagrams'][0]['events'][0]);
|
||||||
|
unset($projectUpdated['diagrams'][0]['events'][1]);
|
||||||
|
|
||||||
|
$projectUpdated['diagrams'][0]['activities'][0]['act_name'] = 'changed name';
|
||||||
|
|
||||||
|
|
||||||
|
$diff = \ProcessMaker\Adapter\Bpmn\Model::getDiffFromProjects($project, $projectUpdated);
|
||||||
|
return $diff;
|
||||||
|
|
||||||
//$WorkflowProces = \ProcessMaker\Adapter\Workflow::loadFromBpmnProject($prjUid);
|
//$WorkflowProces = \ProcessMaker\Adapter\Workflow::loadFromBpmnProject($prjUid);
|
||||||
//return $WorkflowProces;
|
//return $WorkflowProces;
|
||||||
return $project;
|
return $project;
|
||||||
|
|||||||
Reference in New Issue
Block a user